Created
August 8, 2024 16:51
-
-
Save ScarVite/0e8a9e25847405ba87a2f8319671a816 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(() => { | |
var Pe = Object.defineProperty; | |
var en = (o, t, e) => t in o ? Pe(o, t, { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: e | |
}) : o[t] = e; | |
var _e = (o, t) => { | |
for (var e in t) | |
Pe(o, e, { | |
get: t[e], | |
enumerable: true | |
}); | |
}; | |
var Ft = (o, t, e) => (en(o, typeof t != 'symbol' ? t + '' : t, e), e); | |
var qt = class { | |
constructor(t, e, i) { | |
this.eventTarget = t; | |
this.eventName = e; | |
this.eventOptions = i; | |
this.unorderedBindings = new Set(); | |
} | |
connect() { | |
this.eventTarget.addEventListener(this.eventName, this, this.eventOptions); | |
} | |
disconnect() { | |
this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions); | |
} | |
bindingConnected(t) { | |
this.unorderedBindings.add(t); | |
} | |
bindingDisconnected(t) { | |
this.unorderedBindings.delete(t); | |
} | |
handleEvent(t) { | |
let e = nn(t); | |
for (let i of this.bindings) { | |
if (e.immediatePropagationStopped) { | |
break; | |
} | |
i.handleEvent(e); | |
} | |
} | |
hasBindings() { | |
return this.unorderedBindings.size > 0; | |
} | |
get bindings() { | |
return Array.from(this.unorderedBindings).sort((t, e) => { | |
let i = t.index, n = e.index; | |
return i < n ? -1 : i > n ? 1 : 0; | |
}); | |
} | |
}; | |
function nn(o) { | |
if ('immediatePropagationStopped' in o) { | |
return o; | |
} | |
{ | |
let {stopImmediatePropagation: t} = o; | |
return Object.assign(o, { | |
immediatePropagationStopped: false, | |
stopImmediatePropagation() { | |
this.immediatePropagationStopped = true; | |
t.call(this); | |
} | |
}); | |
} | |
} | |
var $t = class { | |
constructor(t) { | |
this.application = t; | |
this.eventListenerMaps = new Map(); | |
this.started = false; | |
} | |
start() { | |
this.started || (this.started = true, this.eventListeners.forEach(t => t.connect())); | |
} | |
stop() { | |
this.started && (this.started = false, this.eventListeners.forEach(t => t.disconnect())); | |
} | |
get eventListeners() { | |
return Array.from(this.eventListenerMaps.values()).reduce((t, e) => t.concat(Array.from(e.values())), []); | |
} | |
bindingConnected(t) { | |
this.fetchEventListenerForBinding(t).bindingConnected(t); | |
} | |
bindingDisconnected(t, e = false) { | |
this.fetchEventListenerForBinding(t).bindingDisconnected(t); | |
e && this.clearEventListenersForBinding(t); | |
} | |
handleError(t, e, i = {}) { | |
this.application.handleError(t, `Error ${ e }`, i); | |
} | |
clearEventListenersForBinding(t) { | |
let e = this.fetchEventListenerForBinding(t); | |
e.hasBindings() || (e.disconnect(), this.removeMappedEventListenerFor(t)); | |
} | |
removeMappedEventListenerFor(t) { | |
let { | |
eventTarget: e, | |
eventName: i, | |
eventOptions: n | |
} = t, s = this.fetchEventListenerMapForEventTarget(e), a = this.cacheKey(i, n); | |
s.delete(a); | |
s.size == 0 && this.eventListenerMaps.delete(e); | |
} | |
fetchEventListenerForBinding(t) { | |
let { | |
eventTarget: e, | |
eventName: i, | |
eventOptions: n | |
} = t; | |
return this.fetchEventListener(e, i, n); | |
} | |
fetchEventListener(t, e, i) { | |
let n = this.fetchEventListenerMapForEventTarget(t), s = this.cacheKey(e, i), a = n.get(s); | |
return a || (a = this.createEventListener(t, e, i), n.set(s, a)), a; | |
} | |
createEventListener(t, e, i) { | |
let n = new qt(t, e, i); | |
return this.started && n.connect(), n; | |
} | |
fetchEventListenerMapForEventTarget(t) { | |
let e = this.eventListenerMaps.get(t); | |
return e || (e = new Map(), this.eventListenerMaps.set(t, e)), e; | |
} | |
cacheKey(t, e) { | |
let i = [t]; | |
return Object.keys(e).sort().forEach(n => { | |
i.push(`${ e[n] ? '' : '!' }${ n }`); | |
}), i.join(':'); | |
} | |
}, sn = { | |
stop({ | |
event: o, | |
value: t | |
}) { | |
return t && o.stopPropagation(), true; | |
}, | |
prevent({ | |
event: o, | |
value: t | |
}) { | |
return t && o.preventDefault(), true; | |
}, | |
self({ | |
event: o, | |
value: t, | |
element: e | |
}) { | |
return t ? e === o.target : true; | |
} | |
}; | |
function an(o) { | |
let e = o.trim().match(/^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/) || [], i = e[2], n = e[3]; | |
return n && ![ | |
'keydown', | |
'keyup', | |
'keypress' | |
].includes(i) && (i += `.${ n }`, n = ''), { | |
eventTarget: rn(e[4]), | |
eventName: i, | |
eventOptions: e[7] ? ln(e[7]) : {}, | |
identifier: e[5], | |
methodName: e[6], | |
keyFilter: e[1] || n | |
}; | |
} | |
function rn(o) { | |
if (o == 'window') { | |
return window; | |
} | |
if (o == 'document') { | |
return document; | |
} | |
} | |
function ln(o) { | |
return o.split(':').reduce((t, e) => Object.assign(t, { [e.replace(/^!/, '')]: !/^!/.test(e) }), {}); | |
} | |
function cn(o) { | |
if (o == window) { | |
return 'window'; | |
} | |
if (o == document) { | |
return 'document'; | |
} | |
} | |
function ve(o) { | |
return o.replace(/(?:[_-])([a-z0-9])/g, (t, e) => e.toUpperCase()); | |
} | |
function te(o) { | |
return ve(o.replace(/--/g, '-').replace(/__/g, '_')); | |
} | |
function ut(o) { | |
return o.charAt(0).toUpperCase() + o.slice(1); | |
} | |
function ai(o) { | |
return o.replace(/([A-Z])/g, (t, e) => `-${ e.toLowerCase() }`); | |
} | |
function dn(o) { | |
return o.match(/[^\s]+/g) || []; | |
} | |
function Ke(o) { | |
return o != null; | |
} | |
function ee(o, t) { | |
return Object.prototype.hasOwnProperty.call(o, t); | |
} | |
var qe = [ | |
'meta', | |
'ctrl', | |
'alt', | |
'shift' | |
], ie = class { | |
constructor(t, e, i, n) { | |
this.element = t; | |
this.index = e; | |
this.eventTarget = i.eventTarget || t; | |
this.eventName = i.eventName || hn(t) || yt('missing event name'); | |
this.eventOptions = i.eventOptions || {}; | |
this.identifier = i.identifier || yt('missing identifier'); | |
this.methodName = i.methodName || yt('missing method name'); | |
this.keyFilter = i.keyFilter || ''; | |
this.schema = n; | |
} | |
static forToken(t, e) { | |
return new this(t.element, t.index, an(t.content), e); | |
} | |
toString() { | |
let t = this.keyFilter ? `.${ this.keyFilter }` : '', e = this.eventTargetName ? `@${ this.eventTargetName }` : ''; | |
return `${ this.eventName }${ t }${ e }->${ this.identifier }#${ this.methodName }`; | |
} | |
shouldIgnoreKeyboardEvent(t) { | |
if (!this.keyFilter) { | |
return false; | |
} | |
let e = this.keyFilter.split('+'); | |
if (this.keyFilterDissatisfied(t, e)) { | |
return true; | |
} | |
let i = e.filter(n => !qe.includes(n))[0]; | |
return i ? (ee(this.keyMappings, i) || yt(`contains unknown key filter: ${ this.keyFilter }`), this.keyMappings[i].toLowerCase() !== t.key.toLowerCase()) : false; | |
} | |
shouldIgnoreMouseEvent(t) { | |
if (!this.keyFilter) { | |
return false; | |
} | |
let e = [this.keyFilter]; | |
return !!this.keyFilterDissatisfied(t, e); | |
} | |
get params() { | |
let t = { | |
nav: null, | |
target: null, | |
el: n, | |
src: e, | |
state: Z.Opening, | |
imageEl: l, | |
panzoom: new nt(r, E({ transformParent: true }, this.option('Panzoom') || {}, { | |
content: l, | |
width: (c, d) => a.optionFor(t, 'width', 'auto', d) || 'auto', | |
height: (c, d) => a.optionFor(t, 'height', 'auto', d) || 'auto', | |
wheel: () => { | |
let c = a.option('wheel'); | |
return (c === 'zoom' || c == 'pan') && c; | |
}, | |
click: (c, d) => { | |
var u, m; | |
if (a.isCompact || a.isClosing() || t.index !== ((u = a.getSlide()) === null || u === void 0 ? void 0 : u.index)) { | |
return false; | |
} | |
if (d) { | |
let b = d.composedPath()[0]; | |
if ([ | |
'A', | |
'BUTTON', | |
'TEXTAREA', | |
'OPTION', | |
'INPUT', | |
'SELECT', | |
'VIDEO' | |
].includes(b.nodeName)) { | |
return false; | |
} | |
} | |
let h = !d || d.target && ((m = t.contentEl) === null || m === void 0 ? void 0 : m.contains(d.target)); | |
return a.option(h ? 'contentClick' : 'backdropClick') || false; | |
}, | |
dblClick: () => a.isCompact ? 'toggleZoom' : a.option('contentDblClick') || false, | |
spinner: false, | |
panOnlyZoomed: true, | |
wheelLimit: 1e+400, | |
on: { | |
ready: c => { | |
i(c); | |
}, | |
error: () => { | |
n(); | |
}, | |
destroy: () => { | |
n(); | |
} | |
} | |
})), | |
xhr: n, | |
placeholderEl: i, | |
iframeEl: s, | |
poller: setTimeout(i, 250), | |
videoId: d, | |
src: `https://${ l }/embed/${ d }?${ c }`, | |
thumbSrc: t.thumbSrc || `https://i.ytimg.com/vi/${ d }/mqdefault.jpg`, | |
videoId: a, | |
src: `https://player.vimeo.com/video/${ a }?${ r ? `h=${ r }${ s ? '&' : '' }` : '' }${ s }`, | |
type: i, | |
preload: false, | |
state: 'play', | |
timer: null, | |
timer: setTimeout(() => { | |
; | |
t.inHover || t.onTimerEnd(); | |
}, i), | |
state: 'ready', | |
closeBtnEl: t.contentEl.appendChild(n), | |
captionEl: l.appendChild(d), | |
state: Z.Loading, | |
spinnerEl: i, | |
error: e, | |
closeBtnEl: void 0, | |
captionEl: void 0, | |
spinnerEl: void 0 | |
}, e = new RegExp(`^data-${ this.identifier }-(.+)-param$`, 'i'); | |
for (let { | |
name: i, | |
value: n | |
} of Array.from(this.element.attributes)) { | |
let s = i.match(e), a = s && s[1]; | |
a && (t[ve(a)] = un(n)); | |
} | |
return t; | |
} | |
get eventTargetName() { | |
return cn(this.eventTarget); | |
} | |
get keyMappings() { | |
return this.schema.keyMappings; | |
} | |
keyFilterDissatisfied(t, e) { | |
let [i, n, s, a] = qe.map(r => e.includes(r)); | |
return t.metaKey !== i || t.ctrlKey !== n || t.altKey !== s || t.shiftKey !== a; | |
} | |
}, $e = { | |
a: () => 'click', | |
button: () => 'click', | |
form: () => 'submit', | |
details: () => 'toggle', | |
input: o => o.getAttribute('type') == 'submit' ? 'click' : 'input', | |
select: () => 'change', | |
textarea: () => 'input' | |
}; | |
function hn(o) { | |
let t = o.tagName.toLowerCase(); | |
if (t in $e) { | |
return $e[t](o); | |
} | |
} | |
function yt(o) { | |
throw new Error(o); | |
} | |
function un(o) { | |
try { | |
return JSON.parse(o); | |
} catch { | |
return o; | |
} | |
} | |
var ne = class { | |
constructor(t, e) { | |
this.context = t; | |
this.action = e; | |
} | |
get index() { | |
return this.action.index; | |
} | |
get eventTarget() { | |
return this.action.eventTarget; | |
} | |
get eventOptions() { | |
return this.action.eventOptions; | |
} | |
get identifier() { | |
return this.context.identifier; | |
} | |
handleEvent(t) { | |
let e = this.prepareActionEvent(t); | |
this.willBeInvokedByEvent(t) && this.applyEventModifiers(e) && this.invokeWithEvent(e); | |
} | |
get eventName() { | |
return this.action.eventName; | |
} | |
get method() { | |
let t = this.controller[this.methodName]; | |
if (typeof t == 'function') { | |
return t; | |
} | |
throw new Error(`Action "${ this.action }" references undefined method "${ this.methodName }"`); | |
} | |
applyEventModifiers(t) { | |
let {element: e} = this.action, {actionDescriptorFilters: i} = this.context.application, {controller: n} = this.context, s = true; | |
for (let [a, r] of Object.entries(this.eventOptions)) | |
if (a in i) { | |
let l = i[a]; | |
s = s && l({ | |
name: a, | |
value: r, | |
event: t, | |
element: e, | |
controller: n | |
}); | |
} else { | |
continue; | |
} | |
return s; | |
} | |
prepareActionEvent(t) { | |
return Object.assign(t, { params: this.action.params }); | |
} | |
invokeWithEvent(t) { | |
let { | |
target: e, | |
currentTarget: i | |
} = t; | |
try { | |
this.method.call(this.controller, t); | |
this.context.logDebugActivity(this.methodName, { | |
event: t, | |
target: e, | |
currentTarget: i, | |
action: this.methodName | |
}); | |
} catch (n) { | |
let { | |
identifier: s, | |
controller: a, | |
element: r, | |
index: l | |
} = this, c = { | |
identifier: s, | |
controller: a, | |
element: r, | |
index: l, | |
event: t | |
}; | |
this.context.handleError(n, `invoking action "${ this.action }"`, c); | |
} | |
} | |
willBeInvokedByEvent(t) { | |
let e = t.target; | |
return t instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(t) || t instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(t) ? false : this.element === e ? true : e instanceof Element && this.element.contains(e) ? this.scope.containsElement(e) : this.scope.containsElement(this.action.element); | |
} | |
get controller() { | |
return this.context.controller; | |
} | |
get methodName() { | |
return this.action.methodName; | |
} | |
get element() { | |
return this.scope.element; | |
} | |
get scope() { | |
return this.context.scope; | |
} | |
}, vt = class { | |
constructor(t, e) { | |
this.mutationObserverInit = { | |
attributes: true, | |
childList: true, | |
subtree: true | |
}; | |
this.element = t; | |
this.started = false; | |
this.delegate = e; | |
this.elements = new Set(); | |
this.mutationObserver = new MutationObserver(i => this.processMutations(i)); | |
} | |
start() { | |
this.started || (this.started = true, this.mutationObserver.observe(this.element, this.mutationObserverInit), this.refresh()); | |
} | |
pause(t) { | |
this.started && (this.mutationObserver.disconnect(), this.started = false); | |
t(); | |
this.started || (this.mutationObserver.observe(this.element, this.mutationObserverInit), this.started = true); | |
} | |
stop() { | |
this.started && (this.mutationObserver.takeRecords(), this.mutationObserver.disconnect(), this.started = false); | |
} | |
refresh() { | |
if (this.started) { | |
let t = new Set(this.matchElementsInTree()); | |
for (let e of Array.from(this.elements)) | |
t.has(e) || this.removeElement(e); | |
for (let e of Array.from(t)) | |
this.addElement(e); | |
} | |
} | |
processMutations(t) { | |
if (this.started) { | |
for (let e of t) | |
this.processMutation(e); | |
} | |
} | |
processMutation(t) { | |
t.type == 'attributes' ? this.processAttributeChange(t.target, t.attributeName) : t.type == 'childList' && (this.processRemovedNodes(t.removedNodes), this.processAddedNodes(t.addedNodes)); | |
} | |
processAttributeChange(t, e) { | |
this.elements.has(t) ? this.delegate.elementAttributeChanged && this.matchElement(t) ? this.delegate.elementAttributeChanged(t, e) : this.removeElement(t) : this.matchElement(t) && this.addElement(t); | |
} | |
processRemovedNodes(t) { | |
for (let e of Array.from(t)) { | |
let i = this.elementFromNode(e); | |
i && this.processTree(i, this.removeElement); | |
} | |
} | |
processAddedNodes(t) { | |
for (let e of Array.from(t)) { | |
let i = this.elementFromNode(e); | |
i && this.elementIsActive(i) && this.processTree(i, this.addElement); | |
} | |
} | |
matchElement(t) { | |
return this.delegate.matchElement(t); | |
} | |
matchElementsInTree(t = this.element) { | |
return this.delegate.matchElementsInTree(t); | |
} | |
processTree(t, e) { | |
for (let i of this.matchElementsInTree(t)) | |
e.call(this, i); | |
} | |
elementFromNode(t) { | |
if (t.nodeType == Node.ELEMENT_NODE) { | |
return t; | |
} | |
} | |
elementIsActive(t) { | |
return t.isConnected != this.element.isConnected ? false : this.element.contains(t); | |
} | |
addElement(t) { | |
this.elements.has(t) || this.elementIsActive(t) && (this.elements.add(t), this.delegate.elementMatched && this.delegate.elementMatched(t)); | |
} | |
removeElement(t) { | |
this.elements.has(t) && (this.elements.delete(t), this.delegate.elementUnmatched && this.delegate.elementUnmatched(t)); | |
} | |
}, Bt = class { | |
constructor(t, e, i) { | |
this.attributeName = e; | |
this.delegate = i; | |
this.elementObserver = new vt(t, this); | |
} | |
get element() { | |
return this.elementObserver.element; | |
} | |
get selector() { | |
return `[${ this.attributeName }]`; | |
} | |
start() { | |
this.elementObserver.start(); | |
} | |
pause(t) { | |
this.elementObserver.pause(t); | |
} | |
stop() { | |
this.elementObserver.stop(); | |
} | |
refresh() { | |
this.elementObserver.refresh(); | |
} | |
get started() { | |
return this.elementObserver.started; | |
} | |
matchElement(t) { | |
return t.hasAttribute(this.attributeName); | |
} | |
matchElementsInTree(t) { | |
let e = this.matchElement(t) ? [t] : [], i = Array.from(t.querySelectorAll(this.selector)); | |
return e.concat(i); | |
} | |
elementMatched(t) { | |
this.delegate.elementMatchedAttribute && this.delegate.elementMatchedAttribute(t, this.attributeName); | |
} | |
elementUnmatched(t) { | |
this.delegate.elementUnmatchedAttribute && this.delegate.elementUnmatchedAttribute(t, this.attributeName); | |
} | |
elementAttributeChanged(t, e) { | |
this.delegate.elementAttributeValueChanged && this.attributeName == e && this.delegate.elementAttributeValueChanged(t, e); | |
} | |
}; | |
function mn(o, t, e) { | |
ri(o, t).add(e); | |
} | |
function bn(o, t, e) { | |
ri(o, t).delete(e); | |
pn(o, t); | |
} | |
function ri(o, t) { | |
let e = o.get(t); | |
return e || (e = new Set(), o.set(t, e)), e; | |
} | |
function pn(o, t) { | |
let e = o.get(t); | |
e != null && e.size == 0 && o.delete(t); | |
} | |
var T = class { | |
constructor() { | |
this.valuesByKey = new Map(); | |
} | |
get keys() { | |
return Array.from(this.valuesByKey.keys()); | |
} | |
get values() { | |
return Array.from(this.valuesByKey.values()).reduce((e, i) => e.concat(Array.from(i)), []); | |
} | |
get size() { | |
return Array.from(this.valuesByKey.values()).reduce((e, i) => e + i.size, 0); | |
} | |
add(t, e) { | |
mn(this.valuesByKey, t, e); | |
} | |
delete(t, e) { | |
bn(this.valuesByKey, t, e); | |
} | |
has(t, e) { | |
let i = this.valuesByKey.get(t); | |
return i != null && i.has(e); | |
} | |
hasKey(t) { | |
return this.valuesByKey.has(t); | |
} | |
hasValue(t) { | |
return Array.from(this.valuesByKey.values()).some(i => i.has(t)); | |
} | |
getValuesForKey(t) { | |
let e = this.valuesByKey.get(t); | |
return e ? Array.from(e) : []; | |
} | |
getKeysForValue(t) { | |
return Array.from(this.valuesByKey).filter(([e, i]) => i.has(t)).map(([e, i]) => e); | |
} | |
}; | |
var se = class { | |
constructor(t, e, i, n) { | |
this._selector = e; | |
this.details = n; | |
this.elementObserver = new vt(t, this); | |
this.delegate = i; | |
this.matchesByElement = new T(); | |
} | |
get started() { | |
return this.elementObserver.started; | |
} | |
get selector() { | |
return this._selector; | |
} | |
set selector(t) { | |
this._selector = t; | |
this.refresh(); | |
} | |
start() { | |
this.elementObserver.start(); | |
} | |
pause(t) { | |
this.elementObserver.pause(t); | |
} | |
stop() { | |
this.elementObserver.stop(); | |
} | |
refresh() { | |
this.elementObserver.refresh(); | |
} | |
get element() { | |
return this.elementObserver.element; | |
} | |
matchElement(t) { | |
let {selector: e} = this; | |
if (e) { | |
let i = t.matches(e); | |
return this.delegate.selectorMatchElement ? i && this.delegate.selectorMatchElement(t, this.details) : i; | |
} else { | |
return false; | |
} | |
} | |
matchElementsInTree(t) { | |
let {selector: e} = this; | |
if (e) { | |
let i = this.matchElement(t) ? [t] : [], n = Array.from(t.querySelectorAll(e)).filter(s => this.matchElement(s)); | |
return i.concat(n); | |
} else { | |
return []; | |
} | |
} | |
elementMatched(t) { | |
let {selector: e} = this; | |
e && this.selectorMatched(t, e); | |
} | |
elementUnmatched(t) { | |
let e = this.matchesByElement.getKeysForValue(t); | |
for (let i of e) | |
this.selectorUnmatched(t, i); | |
} | |
elementAttributeChanged(t, e) { | |
let {selector: i} = this; | |
if (i) { | |
let n = this.matchElement(t), s = this.matchesByElement.has(i, t); | |
n && !s ? this.selectorMatched(t, i) : !n && s && this.selectorUnmatched(t, i); | |
} | |
} | |
selectorMatched(t, e) { | |
this.delegate.selectorMatched(t, e, this.details); | |
this.matchesByElement.add(e, t); | |
} | |
selectorUnmatched(t, e) { | |
this.delegate.selectorUnmatched(t, e, this.details); | |
this.matchesByElement.delete(e, t); | |
} | |
}, oe = class { | |
constructor(t, e) { | |
this.element = t; | |
this.delegate = e; | |
this.started = false; | |
this.stringMap = new Map(); | |
this.mutationObserver = new MutationObserver(i => this.processMutations(i)); | |
} | |
start() { | |
this.started || (this.started = true, this.mutationObserver.observe(this.element, { | |
attributes: true, | |
attributeOldValue: true | |
}), this.refresh()); | |
} | |
stop() { | |
this.started && (this.mutationObserver.takeRecords(), this.mutationObserver.disconnect(), this.started = false); | |
} | |
refresh() { | |
if (this.started) { | |
for (let t of this.knownAttributeNames) | |
this.refreshAttribute(t, null); | |
} | |
} | |
processMutations(t) { | |
if (this.started) { | |
for (let e of t) | |
this.processMutation(e); | |
} | |
} | |
processMutation(t) { | |
let e = t.attributeName; | |
e && this.refreshAttribute(e, t.oldValue); | |
} | |
refreshAttribute(t, e) { | |
let i = this.delegate.getStringMapKeyForAttribute(t); | |
if (i != null) { | |
this.stringMap.has(t) || this.stringMapKeyAdded(i, t); | |
let n = this.element.getAttribute(t); | |
if (this.stringMap.get(t) != n && this.stringMapValueChanged(n, i, e), n == null) { | |
let s = this.stringMap.get(t); | |
this.stringMap.delete(t); | |
s && this.stringMapKeyRemoved(i, t, s); | |
} else { | |
this.stringMap.set(t, n); | |
} | |
} | |
} | |
stringMapKeyAdded(t, e) { | |
this.delegate.stringMapKeyAdded && this.delegate.stringMapKeyAdded(t, e); | |
} | |
stringMapValueChanged(t, e, i) { | |
this.delegate.stringMapValueChanged && this.delegate.stringMapValueChanged(t, e, i); | |
} | |
stringMapKeyRemoved(t, e, i) { | |
this.delegate.stringMapKeyRemoved && this.delegate.stringMapKeyRemoved(t, e, i); | |
} | |
get knownAttributeNames() { | |
return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames))); | |
} | |
get currentAttributeNames() { | |
return Array.from(this.element.attributes).map(t => t.name); | |
} | |
get recordedAttributeNames() { | |
return Array.from(this.stringMap.keys()); | |
} | |
}, xt = class { | |
constructor(t, e, i) { | |
this.attributeObserver = new Bt(t, e, this); | |
this.delegate = i; | |
this.tokensByElement = new T(); | |
} | |
get started() { | |
return this.attributeObserver.started; | |
} | |
start() { | |
this.attributeObserver.start(); | |
} | |
pause(t) { | |
this.attributeObserver.pause(t); | |
} | |
stop() { | |
this.attributeObserver.stop(); | |
} | |
refresh() { | |
this.attributeObserver.refresh(); | |
} | |
get element() { | |
return this.attributeObserver.element; | |
} | |
get attributeName() { | |
return this.attributeObserver.attributeName; | |
} | |
elementMatchedAttribute(t) { | |
this.tokensMatched(this.readTokensForElement(t)); | |
} | |
elementAttributeValueChanged(t) { | |
let [e, i] = this.refreshTokensForElement(t); | |
this.tokensUnmatched(e); | |
this.tokensMatched(i); | |
} | |
elementUnmatchedAttribute(t) { | |
this.tokensUnmatched(this.tokensByElement.getValuesForKey(t)); | |
} | |
tokensMatched(t) { | |
t.forEach(e => this.tokenMatched(e)); | |
} | |
tokensUnmatched(t) { | |
t.forEach(e => this.tokenUnmatched(e)); | |
} | |
tokenMatched(t) { | |
this.delegate.tokenMatched(t); | |
this.tokensByElement.add(t.element, t); | |
} | |
tokenUnmatched(t) { | |
this.delegate.tokenUnmatched(t); | |
this.tokensByElement.delete(t.element, t); | |
} | |
refreshTokensForElement(t) { | |
let e = this.tokensByElement.getValuesForKey(t), i = this.readTokensForElement(t), n = gn(e, i).findIndex(([s, a]) => !Qn(s, a)); | |
return n == -1 ? [ | |
[], | |
[] | |
] : [ | |
e.slice(n), | |
i.slice(n) | |
]; | |
} | |
readTokensForElement(t) { | |
let e = this.attributeName, i = t.getAttribute(e) || ''; | |
return fn(i, t, e); | |
} | |
}; | |
function fn(o, t, e) { | |
return o.trim().split(/\s+/).filter(i => i.length).map((i, n) => ({ | |
element: t, | |
attributeName: e, | |
content: i, | |
index: n | |
})); | |
} | |
function gn(o, t) { | |
let e = Math.max(o.length, t.length); | |
return Array.from({ length: e }, (i, n) => [ | |
o[n], | |
t[n] | |
]); | |
} | |
function Qn(o, t) { | |
return o && t && o.index == t.index && o.content == t.content; | |
} | |
var Ut = class { | |
constructor(t, e, i) { | |
this.tokenListObserver = new xt(t, e, this); | |
this.delegate = i; | |
this.parseResultsByToken = new WeakMap(); | |
this.valuesByTokenByElement = new WeakMap(); | |
} | |
get started() { | |
return this.tokenListObserver.started; | |
} | |
start() { | |
this.tokenListObserver.start(); | |
} | |
stop() { | |
this.tokenListObserver.stop(); | |
} | |
refresh() { | |
this.tokenListObserver.refresh(); | |
} | |
get element() { | |
return this.tokenListObserver.element; | |
} | |
get attributeName() { | |
return this.tokenListObserver.attributeName; | |
} | |
tokenMatched(t) { | |
let {element: e} = t, {value: i} = this.fetchParseResultForToken(t); | |
i && (this.fetchValuesByTokenForElement(e).set(t, i), this.delegate.elementMatchedValue(e, i)); | |
} | |
tokenUnmatched(t) { | |
let {element: e} = t, {value: i} = this.fetchParseResultForToken(t); | |
i && (this.fetchValuesByTokenForElement(e).delete(t), this.delegate.elementUnmatchedValue(e, i)); | |
} | |
fetchParseResultForToken(t) { | |
let e = this.parseResultsByToken.get(t); | |
return e || (e = this.parseToken(t), this.parseResultsByToken.set(t, e)), e; | |
} | |
fetchValuesByTokenForElement(t) { | |
let e = this.valuesByTokenByElement.get(t); | |
return e || (e = new Map(), this.valuesByTokenByElement.set(t, e)), e; | |
} | |
parseToken(t) { | |
try { | |
return { value: this.delegate.parseValueForToken(t) }; | |
} catch (e) { | |
return { error: e }; | |
} | |
} | |
}, ae = class { | |
constructor(t, e) { | |
this.context = t; | |
this.delegate = e; | |
this.bindingsByAction = new Map(); | |
} | |
start() { | |
this.valueListObserver || (this.valueListObserver = new Ut(this.element, this.actionAttribute, this), this.valueListObserver.start()); | |
} | |
stop() { | |
this.valueListObserver && (this.valueListObserver.stop(), delete this.valueListObserver, this.disconnectAllActions()); | |
} | |
get element() { | |
return this.context.element; | |
} | |
get identifier() { | |
return this.context.identifier; | |
} | |
get actionAttribute() { | |
return this.schema.actionAttribute; | |
} | |
get schema() { | |
return this.context.schema; | |
} | |
get bindings() { | |
return Array.from(this.bindingsByAction.values()); | |
} | |
connectAction(t) { | |
let e = new ne(this.context, t); | |
this.bindingsByAction.set(t, e); | |
this.delegate.bindingConnected(e); | |
} | |
disconnectAction(t) { | |
let e = this.bindingsByAction.get(t); | |
e && (this.bindingsByAction.delete(t), this.delegate.bindingDisconnected(e)); | |
} | |
disconnectAllActions() { | |
this.bindings.forEach(t => this.delegate.bindingDisconnected(t, true)); | |
this.bindingsByAction.clear(); | |
} | |
parseValueForToken(t) { | |
let e = ie.forToken(t, this.schema); | |
if (e.identifier == this.identifier) { | |
return e; | |
} | |
} | |
elementMatchedValue(t, e) { | |
this.connectAction(e); | |
} | |
elementUnmatchedValue(t, e) { | |
this.disconnectAction(e); | |
} | |
}, re = class { | |
constructor(t, e) { | |
this.context = t; | |
this.receiver = e; | |
this.stringMapObserver = new oe(this.element, this); | |
this.valueDescriptorMap = this.controller.valueDescriptorMap; | |
} | |
start() { | |
this.stringMapObserver.start(); | |
this.invokeChangedCallbacksForDefaultValues(); | |
} | |
stop() { | |
this.stringMapObserver.stop(); | |
} | |
get element() { | |
return this.context.element; | |
} | |
get controller() { | |
return this.context.controller; | |
} | |
getStringMapKeyForAttribute(t) { | |
if (t in this.valueDescriptorMap) { | |
return this.valueDescriptorMap[t].name; | |
} | |
} | |
stringMapKeyAdded(t, e) { | |
let i = this.valueDescriptorMap[e]; | |
this.hasValue(t) || this.invokeChangedCallback(t, i.writer(this.receiver[t]), i.writer(i.defaultValue)); | |
} | |
stringMapValueChanged(t, e, i) { | |
let n = this.valueDescriptorNameMap[e]; | |
t !== null && (i === null && (i = n.writer(n.defaultValue)), this.invokeChangedCallback(e, t, i)); | |
} | |
stringMapKeyRemoved(t, e, i) { | |
let n = this.valueDescriptorNameMap[t]; | |
this.hasValue(t) ? this.invokeChangedCallback(t, n.writer(this.receiver[t]), i) : this.invokeChangedCallback(t, n.writer(n.defaultValue), i); | |
} | |
invokeChangedCallbacksForDefaultValues() { | |
for (let { | |
key: t, | |
name: e, | |
defaultValue: i, | |
writer: n | |
} of this.valueDescriptors) | |
i != null && !this.controller.data.has(t) && this.invokeChangedCallback(e, n(i), void 0); | |
} | |
invokeChangedCallback(t, e, i) { | |
let n = `${ t }Changed`, s = this.receiver[n]; | |
if (typeof s == 'function') { | |
let a = this.valueDescriptorNameMap[t]; | |
try { | |
let r = a.reader(e), l = i; | |
i && (l = a.reader(i)); | |
s.call(this.receiver, r, l); | |
} catch (r) { | |
throw r instanceof TypeError && (r.message = `Stimulus Value "${ this.context.identifier }.${ a.name }" - ${ r.message }`), r; | |
} | |
} | |
} | |
get valueDescriptors() { | |
let {valueDescriptorMap: t} = this; | |
return Object.keys(t).map(e => t[e]); | |
} | |
get valueDescriptorNameMap() { | |
let t = {}; | |
return Object.keys(this.valueDescriptorMap).forEach(e => { | |
let i = this.valueDescriptorMap[e]; | |
t[i.name] = i; | |
}), t; | |
} | |
hasValue(t) { | |
let e = this.valueDescriptorNameMap[t], i = `has${ ut(e.name) }`; | |
return this.receiver[i]; | |
} | |
}, le = class { | |
constructor(t, e) { | |
this.context = t; | |
this.delegate = e; | |
this.targetsByName = new T(); | |
} | |
start() { | |
this.tokenListObserver || (this.tokenListObserver = new xt(this.element, this.attributeName, this), this.tokenListObserver.start()); | |
} | |
stop() { | |
this.tokenListObserver && (this.disconnectAllTargets(), this.tokenListObserver.stop(), delete this.tokenListObserver); | |
} | |
tokenMatched({ | |
element: t, | |
content: e | |
}) { | |
this.scope.containsElement(t) && this.connectTarget(t, e); | |
} | |
tokenUnmatched({ | |
element: t, | |
content: e | |
}) { | |
this.disconnectTarget(t, e); | |
} | |
connectTarget(t, e) { | |
var i; | |
this.targetsByName.has(e, t) || (this.targetsByName.add(e, t), (i = this.tokenListObserver) === null || i === void 0 || i.pause(() => this.delegate.targetConnected(t, e))); | |
} | |
disconnectTarget(t, e) { | |
var i; | |
this.targetsByName.has(e, t) && (this.targetsByName.delete(e, t), (i = this.tokenListObserver) === null || i === void 0 || i.pause(() => this.delegate.targetDisconnected(t, e))); | |
} | |
disconnectAllTargets() { | |
for (let t of this.targetsByName.keys) | |
for (let e of this.targetsByName.getValuesForKey(t)) | |
this.disconnectTarget(e, t); | |
} | |
get attributeName() { | |
return `data-${ this.context.identifier }-target`; | |
} | |
get element() { | |
return this.context.element; | |
} | |
get scope() { | |
return this.context.scope; | |
} | |
}; | |
function mt(o, t) { | |
let e = li(o); | |
return Array.from(e.reduce((i, n) => (yn(n, t).forEach(s => i.add(s)), i), new Set())); | |
} | |
function Fn(o, t) { | |
return li(o).reduce((i, n) => (i.push(...vn(n, t)), i), []); | |
} | |
function li(o) { | |
let t = []; | |
for (; o;) { | |
t.push(o); | |
o = Object.getPrototypeOf(o); | |
} | |
return t.reverse(); | |
} | |
function yn(o, t) { | |
let e = o[t]; | |
return Array.isArray(e) ? e : []; | |
} | |
function vn(o, t) { | |
let e = o[t]; | |
return e ? Object.keys(e).map(i => [ | |
i, | |
e[i] | |
]) : []; | |
} | |
var ce = class { | |
constructor(t, e) { | |
this.started = false; | |
this.context = t; | |
this.delegate = e; | |
this.outletsByName = new T(); | |
this.outletElementsByName = new T(); | |
this.selectorObserverMap = new Map(); | |
this.attributeObserverMap = new Map(); | |
} | |
start() { | |
this.started || (this.outletDefinitions.forEach(t => { | |
this.setupSelectorObserverForOutlet(t); | |
this.setupAttributeObserverForOutlet(t); | |
}), this.started = true, this.dependentContexts.forEach(t => t.refresh())); | |
} | |
refresh() { | |
this.selectorObserverMap.forEach(t => t.refresh()); | |
this.attributeObserverMap.forEach(t => t.refresh()); | |
} | |
stop() { | |
this.started && (this.started = false, this.disconnectAllOutlets(), this.stopSelectorObservers(), this.stopAttributeObservers()); | |
} | |
stopSelectorObservers() { | |
this.selectorObserverMap.size > 0 && (this.selectorObserverMap.forEach(t => t.stop()), this.selectorObserverMap.clear()); | |
} | |
stopAttributeObservers() { | |
this.attributeObserverMap.size > 0 && (this.attributeObserverMap.forEach(t => t.stop()), this.attributeObserverMap.clear()); | |
} | |
selectorMatched(t, e, {outletName: i}) { | |
let n = this.getOutlet(t, i); | |
n && this.connectOutlet(n, t, i); | |
} | |
selectorUnmatched(t, e, {outletName: i}) { | |
let n = this.getOutletFromMap(t, i); | |
n && this.disconnectOutlet(n, t, i); | |
} | |
selectorMatchElement(t, {outletName: e}) { | |
let i = this.selector(e), n = this.hasOutlet(t, e), s = t.matches(`[${ this.schema.controllerAttribute }~=${ e }]`); | |
return i ? n && s && t.matches(i) : false; | |
} | |
elementMatchedAttribute(t, e) { | |
let i = this.getOutletNameFromOutletAttributeName(e); | |
i && this.updateSelectorObserverForOutlet(i); | |
} | |
elementAttributeValueChanged(t, e) { | |
let i = this.getOutletNameFromOutletAttributeName(e); | |
i && this.updateSelectorObserverForOutlet(i); | |
} | |
elementUnmatchedAttribute(t, e) { | |
let i = this.getOutletNameFromOutletAttributeName(e); | |
i && this.updateSelectorObserverForOutlet(i); | |
} | |
connectOutlet(t, e, i) { | |
var n; | |
this.outletElementsByName.has(i, e) || (this.outletsByName.add(i, t), this.outletElementsByName.add(i, e), (n = this.selectorObserverMap.get(i)) === null || n === void 0 || n.pause(() => this.delegate.outletConnected(t, e, i))); | |
} | |
disconnectOutlet(t, e, i) { | |
var n; | |
this.outletElementsByName.has(i, e) && (this.outletsByName.delete(i, t), this.outletElementsByName.delete(i, e), (n = this.selectorObserverMap.get(i)) === null || n === void 0 || n.pause(() => this.delegate.outletDisconnected(t, e, i))); | |
} | |
disconnectAllOutlets() { | |
for (let t of this.outletElementsByName.keys) | |
for (let e of this.outletElementsByName.getValuesForKey(t)) | |
for (let i of this.outletsByName.getValuesForKey(t)) | |
this.disconnectOutlet(i, e, t); | |
} | |
updateSelectorObserverForOutlet(t) { | |
let e = this.selectorObserverMap.get(t); | |
e && (e.selector = this.selector(t)); | |
} | |
setupSelectorObserverForOutlet(t) { | |
let e = this.selector(t), i = new se(document.body, e, this, { outletName: t }); | |
this.selectorObserverMap.set(t, i); | |
i.start(); | |
} | |
setupAttributeObserverForOutlet(t) { | |
let e = this.attributeNameForOutletName(t), i = new Bt(this.scope.element, e, this); | |
this.attributeObserverMap.set(t, i); | |
i.start(); | |
} | |
selector(t) { | |
return this.scope.outlets.getSelectorForOutletName(t); | |
} | |
attributeNameForOutletName(t) { | |
return this.scope.schema.outletAttributeForScope(this.identifier, t); | |
} | |
getOutletNameFromOutletAttributeName(t) { | |
return this.outletDefinitions.find(e => this.attributeNameForOutletName(e) === t); | |
} | |
get outletDependencies() { | |
let t = new T(); | |
return this.router.modules.forEach(e => { | |
let i = e.definition.controllerConstructor; | |
mt(i, 'outlets').forEach(s => t.add(s, e.identifier)); | |
}), t; | |
} | |
get outletDefinitions() { | |
return this.outletDependencies.getKeysForValue(this.identifier); | |
} | |
get dependentControllerIdentifiers() { | |
return this.outletDependencies.getValuesForKey(this.identifier); | |
} | |
get dependentContexts() { | |
let t = this.dependentControllerIdentifiers; | |
return this.router.contexts.filter(e => t.includes(e.identifier)); | |
} | |
hasOutlet(t, e) { | |
return !!this.getOutlet(t, e) || !!this.getOutletFromMap(t, e); | |
} | |
getOutlet(t, e) { | |
return this.application.getControllerForElementAndIdentifier(t, e); | |
} | |
getOutletFromMap(t, e) { | |
return this.outletsByName.getValuesForKey(e).find(i => i.element === t); | |
} | |
get scope() { | |
return this.context.scope; | |
} | |
get schema() { | |
return this.context.schema; | |
} | |
get identifier() { | |
return this.context.identifier; | |
} | |
get application() { | |
return this.context.application; | |
} | |
get router() { | |
return this.application.router; | |
} | |
}, de = class { | |
constructor(t, e) { | |
this.logDebugActivity = (i, n = {}) => { | |
let { | |
identifier: s, | |
controller: a, | |
element: r | |
} = this; | |
n = Object.assign({ | |
identifier: s, | |
controller: a, | |
element: r | |
}, n); | |
this.application.logDebugActivity(this.identifier, i, n); | |
}; | |
this.module = t; | |
this.scope = e; | |
this.controller = new t.controllerConstructor(this); | |
this.bindingObserver = new ae(this, this.dispatcher); | |
this.valueObserver = new re(this, this.controller); | |
this.targetObserver = new le(this, this); | |
this.outletObserver = new ce(this, this); | |
try { | |
this.controller.initialize(); | |
this.logDebugActivity('initialize'); | |
} catch (i) { | |
this.handleError(i, 'initializing controller'); | |
} | |
} | |
connect() { | |
this.bindingObserver.start(); | |
this.valueObserver.start(); | |
this.targetObserver.start(); | |
this.outletObserver.start(); | |
try { | |
this.controller.connect(); | |
this.logDebugActivity('connect'); | |
} catch (t) { | |
this.handleError(t, 'connecting controller'); | |
} | |
} | |
refresh() { | |
this.outletObserver.refresh(); | |
} | |
disconnect() { | |
try { | |
this.controller.disconnect(); | |
this.logDebugActivity('disconnect'); | |
} catch (t) { | |
this.handleError(t, 'disconnecting controller'); | |
} | |
this.outletObserver.stop(); | |
this.targetObserver.stop(); | |
this.valueObserver.stop(); | |
this.bindingObserver.stop(); | |
} | |
get application() { | |
return this.module.application; | |
} | |
get identifier() { | |
return this.module.identifier; | |
} | |
get schema() { | |
return this.application.schema; | |
} | |
get dispatcher() { | |
return this.application.dispatcher; | |
} | |
get element() { | |
return this.scope.element; | |
} | |
get parentElement() { | |
return this.element.parentElement; | |
} | |
handleError(t, e, i = {}) { | |
let { | |
identifier: n, | |
controller: s, | |
element: a | |
} = this; | |
i = Object.assign({ | |
identifier: n, | |
controller: s, | |
element: a | |
}, i); | |
this.application.handleError(t, `Error ${ e }`, i); | |
} | |
targetConnected(t, e) { | |
this.invokeControllerMethod(`${ e }TargetConnected`, t); | |
} | |
targetDisconnected(t, e) { | |
this.invokeControllerMethod(`${ e }TargetDisconnected`, t); | |
} | |
outletConnected(t, e, i) { | |
this.invokeControllerMethod(`${ te(i) }OutletConnected`, t, e); | |
} | |
outletDisconnected(t, e, i) { | |
this.invokeControllerMethod(`${ te(i) }OutletDisconnected`, t, e); | |
} | |
invokeControllerMethod(t, ...e) { | |
let i = this.controller; | |
typeof i[t] == 'function' && i[t](...e); | |
} | |
}; | |
function Bn(o) { | |
return xn(o, Un(o)); | |
} | |
function xn(o, t) { | |
let e = Wn(o), i = Ln(o.prototype, t); | |
return Object.defineProperties(e.prototype, i), e; | |
} | |
function Un(o) { | |
return mt(o, 'blessings').reduce((e, i) => { | |
let n = i(o); | |
for (let s in n) { | |
let a = e[s] || {}; | |
e[s] = Object.assign(a, n[s]); | |
} | |
return e; | |
}, {}); | |
} | |
function Ln(o, t) { | |
return An(t).reduce((e, i) => { | |
let n = wn(o, t, i); | |
return n && Object.assign(e, { [i]: n }), e; | |
}, {}); | |
} | |
function wn(o, t, e) { | |
let i = Object.getOwnPropertyDescriptor(o, e); | |
if (!(i && 'value' in i)) { | |
let s = Object.getOwnPropertyDescriptor(t, e).value; | |
return i && (s.get = i.get || s.get, s.set = i.set || s.set), s; | |
} | |
} | |
var An = typeof Object.getOwnPropertySymbols == 'function' ? o => [ | |
...Object.getOwnPropertyNames(o), | |
...Object.getOwnPropertySymbols(o) | |
] : Object.getOwnPropertyNames, Wn = (() => { | |
function o(e) { | |
function i() { | |
return Reflect.construct(e, arguments, new.target); | |
} | |
return i.prototype = Object.create(e.prototype, { constructor: { value: i } }), Reflect.setPrototypeOf(i, e), i; | |
} | |
function t() { | |
let i = o(function () { | |
this.a.call(this); | |
}); | |
return i.prototype.a = function () { | |
}, new i(); | |
} | |
try { | |
return t(), o; | |
} catch { | |
return i => class extends i { | |
}; | |
} | |
})(); | |
function Zn(o) { | |
return { | |
identifier: o.identifier, | |
controllerConstructor: Bn(o.controllerConstructor) | |
}; | |
} | |
var he = class { | |
constructor(t, e) { | |
this.application = t; | |
this.definition = Zn(e); | |
this.contextsByScope = new WeakMap(); | |
this.connectedContexts = new Set(); | |
} | |
get identifier() { | |
return this.definition.identifier; | |
} | |
get controllerConstructor() { | |
return this.definition.controllerConstructor; | |
} | |
get contexts() { | |
return Array.from(this.connectedContexts); | |
} | |
connectContextForScope(t) { | |
let e = this.fetchContextForScope(t); | |
this.connectedContexts.add(e); | |
e.connect(); | |
} | |
disconnectContextForScope(t) { | |
let e = this.contextsByScope.get(t); | |
e && (this.connectedContexts.delete(e), e.disconnect()); | |
} | |
fetchContextForScope(t) { | |
let e = this.contextsByScope.get(t); | |
return e || (e = new de(this, t), this.contextsByScope.set(t, e)), e; | |
} | |
}, ue = class { | |
constructor(t) { | |
this.scope = t; | |
} | |
has(t) { | |
return this.data.has(this.getDataKey(t)); | |
} | |
get(t) { | |
return this.getAll(t)[0]; | |
} | |
getAll(t) { | |
let e = this.data.get(this.getDataKey(t)) || ''; | |
return dn(e); | |
} | |
getAttributeName(t) { | |
return this.data.getAttributeNameForKey(this.getDataKey(t)); | |
} | |
getDataKey(t) { | |
return `${ t }-class`; | |
} | |
get data() { | |
return this.scope.data; | |
} | |
}, me = class { | |
constructor(t) { | |
this.scope = t; | |
} | |
get element() { | |
return this.scope.element; | |
} | |
get identifier() { | |
return this.scope.identifier; | |
} | |
get(t) { | |
let e = this.getAttributeNameForKey(t); | |
return this.element.getAttribute(e); | |
} | |
set(t, e) { | |
let i = this.getAttributeNameForKey(t); | |
return this.element.setAttribute(i, e), this.get(t); | |
} | |
has(t) { | |
let e = this.getAttributeNameForKey(t); | |
return this.element.hasAttribute(e); | |
} | |
delete(t) { | |
if (this.has(t)) { | |
let e = this.getAttributeNameForKey(t); | |
return this.element.removeAttribute(e), true; | |
} else { | |
return false; | |
} | |
} | |
getAttributeNameForKey(t) { | |
return `data-${ this.identifier }-${ ai(t) }`; | |
} | |
}, be = class { | |
constructor(t) { | |
this.warnedKeysByObject = new WeakMap(); | |
this.logger = t; | |
} | |
warn(t, e, i) { | |
let n = this.warnedKeysByObject.get(t); | |
n || (n = new Set(), this.warnedKeysByObject.set(t, n)); | |
n.has(e) || (n.add(e), this.logger.warn(i, t)); | |
} | |
}; | |
function pe(o, t) { | |
return `[${ o }~="${ t }"]`; | |
} | |
var fe = class { | |
constructor(t) { | |
this.scope = t; | |
} | |
get element() { | |
return this.scope.element; | |
} | |
get identifier() { | |
return this.scope.identifier; | |
} | |
get schema() { | |
return this.scope.schema; | |
} | |
has(t) { | |
return this.find(t) != null; | |
} | |
find(...t) { | |
return t.reduce((e, i) => e || this.findTarget(i) || this.findLegacyTarget(i), void 0); | |
} | |
findAll(...t) { | |
return t.reduce((e, i) => [ | |
...e, | |
...this.findAllTargets(i), | |
...this.findAllLegacyTargets(i) | |
], []); | |
} | |
findTarget(t) { | |
let e = this.getSelectorForTargetName(t); | |
return this.scope.findElement(e); | |
} | |
findAllTargets(t) { | |
let e = this.getSelectorForTargetName(t); | |
return this.scope.findAllElements(e); | |
} | |
getSelectorForTargetName(t) { | |
let e = this.schema.targetAttributeForScope(this.identifier); | |
return pe(e, t); | |
} | |
findLegacyTarget(t) { | |
let e = this.getLegacySelectorForTargetName(t); | |
return this.deprecate(this.scope.findElement(e), t); | |
} | |
findAllLegacyTargets(t) { | |
let e = this.getLegacySelectorForTargetName(t); | |
return this.scope.findAllElements(e).map(i => this.deprecate(i, t)); | |
} | |
getLegacySelectorForTargetName(t) { | |
let e = `${ this.identifier }.${ t }`; | |
return pe(this.schema.targetAttribute, e); | |
} | |
deprecate(t, e) { | |
if (t) { | |
let {identifier: i} = this, n = this.schema.targetAttribute, s = this.schema.targetAttributeForScope(i); | |
this.guide.warn(t, `target:${ e }`, `Please replace ${ n }="${ i }.${ e }" with ${ s }="${ e }". The ${ n } attribute is deprecated and will be removed in a future version of Stimulus.`); | |
} | |
return t; | |
} | |
get guide() { | |
return this.scope.guide; | |
} | |
}, ge = class { | |
constructor(t, e) { | |
this.scope = t; | |
this.controllerElement = e; | |
} | |
get element() { | |
return this.scope.element; | |
} | |
get identifier() { | |
return this.scope.identifier; | |
} | |
get schema() { | |
return this.scope.schema; | |
} | |
has(t) { | |
return this.find(t) != null; | |
} | |
find(...t) { | |
return t.reduce((e, i) => e || this.findOutlet(i), void 0); | |
} | |
findAll(...t) { | |
return t.reduce((e, i) => [ | |
...e, | |
...this.findAllOutlets(i) | |
], []); | |
} | |
getSelectorForOutletName(t) { | |
let e = this.schema.outletAttributeForScope(this.identifier, t); | |
return this.controllerElement.getAttribute(e); | |
} | |
findOutlet(t) { | |
let e = this.getSelectorForOutletName(t); | |
if (e) { | |
return this.findElement(e, t); | |
} | |
} | |
findAllOutlets(t) { | |
let e = this.getSelectorForOutletName(t); | |
return e ? this.findAllElements(e, t) : []; | |
} | |
findElement(t, e) { | |
return this.scope.queryElements(t).filter(n => this.matchesElement(n, t, e))[0]; | |
} | |
findAllElements(t, e) { | |
return this.scope.queryElements(t).filter(n => this.matchesElement(n, t, e)); | |
} | |
matchesElement(t, e, i) { | |
let n = t.getAttribute(this.scope.schema.controllerAttribute) || ''; | |
return t.matches(e) && n.split(' ').includes(i); | |
} | |
}, Qe = class o { | |
constructor(t, e, i, n) { | |
this.targets = new fe(this); | |
this.classes = new ue(this); | |
this.data = new me(this); | |
this.containsElement = s => s.closest(this.controllerSelector) === this.element; | |
this.schema = t; | |
this.element = e; | |
this.identifier = i; | |
this.guide = new be(n); | |
this.outlets = new ge(this.documentScope, e); | |
} | |
findElement(t) { | |
return this.element.matches(t) ? this.element : this.queryElements(t).find(this.containsElement); | |
} | |
findAllElements(t) { | |
return [ | |
...this.element.matches(t) ? [this.element] : [], | |
...this.queryElements(t).filter(this.containsElement) | |
]; | |
} | |
queryElements(t) { | |
return Array.from(this.element.querySelectorAll(t)); | |
} | |
get controllerSelector() { | |
return pe(this.schema.controllerAttribute, this.identifier); | |
} | |
get isDocumentScope() { | |
return this.element === document.documentElement; | |
} | |
get documentScope() { | |
return this.isDocumentScope ? this : new o(this.schema, document.documentElement, this.identifier, this.guide.logger); | |
} | |
}, Fe = class { | |
constructor(t, e, i) { | |
this.element = t; | |
this.schema = e; | |
this.delegate = i; | |
this.valueListObserver = new Ut(this.element, this.controllerAttribute, this); | |
this.scopesByIdentifierByElement = new WeakMap(); | |
this.scopeReferenceCounts = new WeakMap(); | |
} | |
start() { | |
this.valueListObserver.start(); | |
} | |
stop() { | |
this.valueListObserver.stop(); | |
} | |
get controllerAttribute() { | |
return this.schema.controllerAttribute; | |
} | |
parseValueForToken(t) { | |
let { | |
element: e, | |
content: i | |
} = t; | |
return this.parseValueForElementAndIdentifier(e, i); | |
} | |
parseValueForElementAndIdentifier(t, e) { | |
let i = this.fetchScopesByIdentifierForElement(t), n = i.get(e); | |
return n || (n = this.delegate.createScopeForElementAndIdentifier(t, e), i.set(e, n)), n; | |
} | |
elementMatchedValue(t, e) { | |
let i = (this.scopeReferenceCounts.get(e) || 0) + 1; | |
this.scopeReferenceCounts.set(e, i); | |
i == 1 && this.delegate.scopeConnected(e); | |
} | |
elementUnmatchedValue(t, e) { | |
let i = this.scopeReferenceCounts.get(e); | |
i && (this.scopeReferenceCounts.set(e, i - 1), i == 1 && this.delegate.scopeDisconnected(e)); | |
} | |
fetchScopesByIdentifierForElement(t) { | |
let e = this.scopesByIdentifierByElement.get(t); | |
return e || (e = new Map(), this.scopesByIdentifierByElement.set(t, e)), e; | |
} | |
}, ye = class { | |
constructor(t) { | |
this.application = t; | |
this.scopeObserver = new Fe(this.element, this.schema, this); | |
this.scopesByIdentifier = new T(); | |
this.modulesByIdentifier = new Map(); | |
} | |
get element() { | |
return this.application.element; | |
} | |
get schema() { | |
return this.application.schema; | |
} | |
get logger() { | |
return this.application.logger; | |
} | |
get controllerAttribute() { | |
return this.schema.controllerAttribute; | |
} | |
get modules() { | |
return Array.from(this.modulesByIdentifier.values()); | |
} | |
get contexts() { | |
return this.modules.reduce((t, e) => t.concat(e.contexts), []); | |
} | |
start() { | |
this.scopeObserver.start(); | |
} | |
stop() { | |
this.scopeObserver.stop(); | |
} | |
loadDefinition(t) { | |
this.unloadIdentifier(t.identifier); | |
let e = new he(this.application, t); | |
this.connectModule(e); | |
let i = t.controllerConstructor.afterLoad; | |
i && i.call(t.controllerConstructor, t.identifier, this.application); | |
} | |
unloadIdentifier(t) { | |
let e = this.modulesByIdentifier.get(t); | |
e && this.disconnectModule(e); | |
} | |
getContextForElementAndIdentifier(t, e) { | |
let i = this.modulesByIdentifier.get(e); | |
if (i) { | |
return i.contexts.find(n => n.element == t); | |
} | |
} | |
proposeToConnectScopeForElementAndIdentifier(t, e) { | |
let i = this.scopeObserver.parseValueForElementAndIdentifier(t, e); | |
i ? this.scopeObserver.elementMatchedValue(i.element, i) : console.error(`Couldn't find or create scope for identifier: "${ e }" and element:`, t); | |
} | |
handleError(t, e, i) { | |
this.application.handleError(t, e, i); | |
} | |
createScopeForElementAndIdentifier(t, e) { | |
return new Qe(this.schema, t, e, this.logger); | |
} | |
scopeConnected(t) { | |
this.scopesByIdentifier.add(t.identifier, t); | |
let e = this.modulesByIdentifier.get(t.identifier); | |
e && e.connectContextForScope(t); | |
} | |
scopeDisconnected(t) { | |
this.scopesByIdentifier.delete(t.identifier, t); | |
let e = this.modulesByIdentifier.get(t.identifier); | |
e && e.disconnectContextForScope(t); | |
} | |
connectModule(t) { | |
this.modulesByIdentifier.set(t.identifier, t); | |
this.scopesByIdentifier.getValuesForKey(t.identifier).forEach(i => t.connectContextForScope(i)); | |
} | |
disconnectModule(t) { | |
this.modulesByIdentifier.delete(t.identifier); | |
this.scopesByIdentifier.getValuesForKey(t.identifier).forEach(i => t.disconnectContextForScope(i)); | |
} | |
}, Cn = { | |
controllerAttribute: 'data-controller', | |
actionAttribute: 'data-action', | |
targetAttribute: 'data-target', | |
targetAttributeForScope: o => `data-${ o }-target`, | |
outletAttributeForScope: (o, t) => `data-${ o }-${ t }-outlet`, | |
keyMappings: Object.assign(Object.assign({ | |
enter: 'Enter', | |
tab: 'Tab', | |
esc: 'Escape', | |
space: ' ', | |
up: 'ArrowUp', | |
down: 'ArrowDown', | |
left: 'ArrowLeft', | |
right: 'ArrowRight', | |
home: 'Home', | |
end: 'End', | |
page_up: 'PageUp', | |
page_down: 'PageDown' | |
}, ti('abcdefghijklmnopqrstuvwxyz'.split('').map(o => [ | |
o, | |
o | |
]))), ti('0123456789'.split('').map(o => [ | |
o, | |
o | |
]))) | |
}; | |
function ti(o) { | |
return o.reduce((t, [e, i]) => Object.assign(Object.assign({}, t), { [e]: i }), {}); | |
} | |
var Lt = class { | |
constructor(t = document.documentElement, e = Cn) { | |
this.logger = console; | |
this.debug = false; | |
this.logDebugActivity = (i, n, s = {}) => { | |
this.debug && this.logFormattedMessage(i, n, s); | |
}; | |
this.element = t; | |
this.schema = e; | |
this.dispatcher = new $t(this); | |
this.router = new ye(this); | |
this.actionDescriptorFilters = Object.assign({}, sn); | |
} | |
static start(t, e) { | |
let i = new this(t, e); | |
return i.start(), i; | |
} | |
async start() { | |
await En(); | |
this.logDebugActivity('application', 'starting'); | |
this.dispatcher.start(); | |
this.router.start(); | |
this.logDebugActivity('application', 'start'); | |
} | |
stop() { | |
this.logDebugActivity('application', 'stopping'); | |
this.dispatcher.stop(); | |
this.router.stop(); | |
this.logDebugActivity('application', 'stop'); | |
} | |
register(t, e) { | |
this.load({ | |
identifier: t, | |
controllerConstructor: e | |
}); | |
} | |
registerActionOption(t, e) { | |
this.actionDescriptorFilters[t] = e; | |
} | |
load(t, ...e) { | |
(Array.isArray(t) ? t : [ | |
t, | |
...e | |
]).forEach(n => { | |
n.controllerConstructor.shouldLoad && this.router.loadDefinition(n); | |
}); | |
} | |
unload(t, ...e) { | |
(Array.isArray(t) ? t : [ | |
t, | |
...e | |
]).forEach(n => this.router.unloadIdentifier(n)); | |
} | |
get controllers() { | |
return this.router.contexts.map(t => t.controller); | |
} | |
getControllerForElementAndIdentifier(t, e) { | |
let i = this.router.getContextForElementAndIdentifier(t, e); | |
return i ? i.controller : null; | |
} | |
handleError(t, e, i) { | |
var n; | |
this.logger.error(`%s | |
%o | |
%o`, e, t, i); | |
(n = window.onerror) === null || n === void 0 || n.call(window, e, '', 0, 0, t); | |
} | |
logFormattedMessage(t, e, i = {}) { | |
i = Object.assign({ application: this }, i); | |
this.logger.groupCollapsed(`${ t } #${ e }`); | |
this.logger.log('details:', Object.assign({}, i)); | |
this.logger.groupEnd(); | |
} | |
}; | |
function En() { | |
return new Promise(o => { | |
document.readyState == 'loading' ? document.addEventListener('DOMContentLoaded', () => o()) : o(); | |
}); | |
} | |
function Mn(o) { | |
return mt(o, 'classes').reduce((e, i) => Object.assign(e, Dn(i)), {}); | |
} | |
function Dn(o) { | |
return { | |
[`${ o }Class`]: { | |
get() { | |
let {classes: t} = this; | |
if (t.has(o)) { | |
return t.get(o); | |
} | |
{ | |
let e = t.getAttributeName(o); | |
throw new Error(`Missing attribute "${ e }"`); | |
} | |
} | |
}, | |
[`${ o }Classes`]: { | |
get() { | |
return this.classes.getAll(o); | |
} | |
}, | |
[`has${ ut(o) }Class`]: { | |
get() { | |
return this.classes.has(o); | |
} | |
} | |
}; | |
} | |
function Yn(o) { | |
return mt(o, 'outlets').reduce((e, i) => Object.assign(e, On(i)), {}); | |
} | |
function ei(o, t, e) { | |
return o.application.getControllerForElementAndIdentifier(t, e); | |
} | |
function ii(o, t, e) { | |
let i = ei(o, t, e); | |
if (i || (o.application.router.proposeToConnectScopeForElementAndIdentifier(t, e), i = ei(o, t, e), i)) { | |
return i; | |
} | |
} | |
function On(o) { | |
let t = te(o); | |
return { | |
[`${ t }Outlet`]: { | |
get() { | |
let e = this.outlets.find(o), i = this.outlets.getSelectorForOutletName(o); | |
if (e) { | |
let n = ii(this, e, o); | |
if (n) { | |
return n; | |
} | |
throw new Error(`The provided outlet element is missing an outlet controller "${ o }" instance for host controller "${ this.identifier }"`); | |
} | |
throw new Error(`Missing outlet element "${ o }" for host controller "${ this.identifier }". Stimulus couldn't find a matching outlet element using selector "${ i }".`); | |
} | |
}, | |
[`${ t }Outlets`]: { | |
get() { | |
let e = this.outlets.findAll(o); | |
return e.length > 0 ? e.map(i => { | |
let n = ii(this, i, o); | |
if (n) { | |
return n; | |
} | |
console.warn(`The provided outlet element is missing an outlet controller "${ o }" instance for host controller "${ this.identifier }"`, i); | |
}).filter(i => i) : []; | |
} | |
}, | |
[`${ t }OutletElement`]: { | |
get() { | |
let e = this.outlets.find(o), i = this.outlets.getSelectorForOutletName(o); | |
if (e) { | |
return e; | |
} | |
throw new Error(`Missing outlet element "${ o }" for host controller "${ this.identifier }". Stimulus couldn't find a matching outlet element using selector "${ i }".`); | |
} | |
}, | |
[`${ t }OutletElements`]: { | |
get() { | |
return this.outlets.findAll(o); | |
} | |
}, | |
[`has${ ut(t) }Outlet`]: { | |
get() { | |
return this.outlets.has(o); | |
} | |
} | |
}; | |
} | |
function Nn(o) { | |
return mt(o, 'targets').reduce((e, i) => Object.assign(e, Rn(i)), {}); | |
} | |
function Rn(o) { | |
return { | |
[`${ o }Target`]: { | |
get() { | |
let t = this.targets.find(o); | |
if (t) { | |
return t; | |
} | |
throw new Error(`Missing target element "${ o }" for "${ this.identifier }" controller`); | |
} | |
}, | |
[`${ o }Targets`]: { | |
get() { | |
return this.targets.findAll(o); | |
} | |
}, | |
[`has${ ut(o) }Target`]: { | |
get() { | |
return this.targets.has(o); | |
} | |
} | |
}; | |
} | |
function kn(o) { | |
let t = Fn(o, 'values'), e = { | |
valueDescriptorMap: { | |
get() { | |
return t.reduce((i, n) => { | |
let s = ci(n, this.identifier), a = this.data.getAttributeNameForKey(s.key); | |
return Object.assign(i, { [a]: s }); | |
}, {}); | |
} | |
} | |
}; | |
return t.reduce((i, n) => Object.assign(i, Xn(n)), e); | |
} | |
function Xn(o, t) { | |
let e = ci(o, t), { | |
key: i, | |
name: n, | |
reader: s, | |
writer: a | |
} = e; | |
return { | |
[n]: { | |
get() { | |
let r = this.data.get(i); | |
return r !== null ? s(r) : e.defaultValue; | |
}, | |
set(r) { | |
r === void 0 ? this.data.delete(i) : this.data.set(i, a(r)); | |
} | |
}, | |
[`has${ ut(n) }`]: { | |
get() { | |
return this.data.has(i) || e.hasCustomDefaultValue; | |
} | |
} | |
}; | |
} | |
function ci([o, t], e) { | |
return Sn({ | |
controller: e, | |
token: o, | |
typeDefinition: t | |
}); | |
} | |
function wt(o) { | |
switch (o) { | |
case Array: | |
return 'array'; | |
case Boolean: | |
return 'boolean'; | |
case Number: | |
return 'number'; | |
case Object: | |
return 'object'; | |
case String: | |
return 'string'; | |
} | |
} | |
function ht(o) { | |
switch (typeof o) { | |
case 'boolean': | |
return 'boolean'; | |
case 'number': | |
return 'number'; | |
case 'string': | |
return 'string'; | |
} | |
if (Array.isArray(o)) { | |
return 'array'; | |
} | |
if (Object.prototype.toString.call(o) === '[object Object]') { | |
return 'object'; | |
} | |
} | |
function Gn(o) { | |
let { | |
controller: t, | |
token: e, | |
typeObject: i | |
} = o, n = Ke(i.type), s = Ke(i.default), a = n && s, r = n && !s, l = !n && s, c = wt(i.type), d = ht(o.typeObject.default); | |
if (r) { | |
return c; | |
} | |
if (l) { | |
return d; | |
} | |
if (c !== d) { | |
let u = t ? `${ t }.${ e }` : e; | |
throw new Error(`The specified default value for the Stimulus Value "${ u }" must match the defined type "${ c }". The provided default value of "${ i.default }" is of type "${ d }".`); | |
} | |
if (a) { | |
return c; | |
} | |
} | |
function Vn(o) { | |
let { | |
controller: t, | |
token: e, | |
typeDefinition: i | |
} = o, s = Gn({ | |
controller: t, | |
token: e, | |
typeObject: i | |
}), a = ht(i), r = wt(i), l = s || a || r; | |
if (l) { | |
return l; | |
} | |
let c = t ? `${ t }.${ i }` : e; | |
throw new Error(`Unknown value type "${ c }" for "${ e }" value`); | |
} | |
function In(o) { | |
let t = wt(o); | |
if (t) { | |
return ni[t]; | |
} | |
let e = ee(o, 'default'), i = ee(o, 'type'), n = o; | |
if (e) { | |
return n.default; | |
} | |
if (i) { | |
let {type: s} = n, a = wt(s); | |
if (a) { | |
return ni[a]; | |
} | |
} | |
return o; | |
} | |
function Sn(o) { | |
let { | |
token: t, | |
typeDefinition: e | |
} = o, i = `${ ai(t) }-value`, n = Vn(o); | |
return { | |
type: n, | |
key: i, | |
name: ve(i), | |
get defaultValue() { | |
return In(e); | |
}, | |
get hasCustomDefaultValue() { | |
return ht(e) !== void 0; | |
}, | |
reader: zn[n], | |
writer: si[n] || si.default | |
}; | |
} | |
var ni = { | |
get array() { | |
return []; | |
}, | |
boolean: false, | |
number: 0, | |
get object() { | |
return {}; | |
}, | |
string: '' | |
}, zn = { | |
array(o) { | |
let t = JSON.parse(o); | |
if (!Array.isArray(t)) { | |
throw new TypeError(`expected value of type "array" but instead got value "${ o }" of type "${ ht(t) }"`); | |
} | |
return t; | |
}, | |
boolean(o) { | |
return !(o == '0' || String(o).toLowerCase() == 'false'); | |
}, | |
number(o) { | |
return Number(o.replace(/_/g, '')); | |
}, | |
object(o) { | |
let t = JSON.parse(o); | |
if (t === null || typeof t != 'object' || Array.isArray(t)) { | |
throw new TypeError(`expected value of type "object" but instead got value "${ o }" of type "${ ht(t) }"`); | |
} | |
return t; | |
}, | |
string(o) { | |
return o; | |
} | |
}, si = { | |
default: Tn, | |
array: oi, | |
object: oi | |
}; | |
function oi(o) { | |
return JSON.stringify(o); | |
} | |
function Tn(o) { | |
return `${ o }`; | |
} | |
var V = class { | |
constructor(t) { | |
this.context = t; | |
} | |
static get shouldLoad() { | |
return true; | |
} | |
static afterLoad(t, e) { | |
} | |
get application() { | |
return this.context.application; | |
} | |
get scope() { | |
return this.context.scope; | |
} | |
get element() { | |
return this.scope.element; | |
} | |
get identifier() { | |
return this.scope.identifier; | |
} | |
get targets() { | |
return this.scope.targets; | |
} | |
get outlets() { | |
return this.scope.outlets; | |
} | |
get classes() { | |
return this.scope.classes; | |
} | |
get data() { | |
return this.scope.data; | |
} | |
initialize() { | |
} | |
connect() { | |
} | |
disconnect() { | |
} | |
dispatch(t, { | |
target: e = this.element, | |
detail: i = {}, | |
prefix: n = this.identifier, | |
bubbles: s = true, | |
cancelable: a = true | |
} = {}) { | |
let r = n ? `${ n }:${ t }` : t, l = new CustomEvent(r, { | |
detail: i, | |
bubbles: s, | |
cancelable: a | |
}); | |
return e.dispatchEvent(l), l; | |
} | |
}; | |
V.blessings = [ | |
Mn, | |
Nn, | |
kn, | |
Yn | |
]; | |
V.targets = []; | |
V.outlets = []; | |
V.values = {}; | |
var Be = {}; | |
_e(Be, { default: () => At }); | |
var At = class extends V { | |
connect() { | |
fetch('https://files.thisisnotawebsitedotcom.com/is-it-time-yet/well-is-it.txt', { cache: 'no-store' }).then(o => o.text()).then(o => { | |
o == 'NO' ? (this.updateCountdown(), setInterval(this.updateCountdown.bind(this), 1000)) : o.includes('https') ? window.location.replace(o) : (this.timeValue = o, this.updateCountdown(), setInterval(this.updateCountdown.bind(this), 1000)); | |
}); | |
} | |
updateCountdown() { | |
let o = new Date().getTime(), t = new Date(this.timeValue).getTime(), i = t - o, n = Math.floor(i / 86400000); | |
n < 10 && n > 0 && (n = `0${ n }`); | |
let s = Math.floor(i % 86400000 / 3600000); | |
s < 10 && s > 0 && (s = `0${ s }`); | |
let a = Math.floor(i % 3600000 / 60000); | |
a < 10 && a > 0 && (a = `0${ a }`); | |
a == 0 && (a = '00'); | |
let r = Math.floor(i % 60000 / 1000); | |
if (r < 10 && r > 0 && (r = `0${ r }`), true && i < 0) { | |
for (let l of document.querySelectorAll('.error')) | |
l.classList.remove('hidden'); | |
this.element.innerHTML = `<div class='flex gap-x-2 items-center justify-center'>${ n + 1 <= -1 ? '<span class=\'text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16\'>' + (n + 1) + '</span><span class=\'text-2xl md:text-5xl w-4 md:w-8\'>:</span>' : '' }${ n + 1 <= -1 || s + 1 <= -1 ? '<span class=\'text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16\'>' + (s + 1) + '</span><span class=\'text-2xl md:text-5xl w-4 md:w-8\'>:</span>' : '' }<span class='text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16'>${ a }</span><span class='text-2xl md:text-5xl w-4 md:w-8'>:</span><span class='text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16'>${ r }</span></div>`; | |
} else { | |
i < 0 ? this.element.innerHTML = 'NOW<br/><small>(REFRESH)</small>' : this.element.innerHTML = `<div class='flex gap-x-2 items-center justify-center'>${ n > 0 ? '<span class=\'text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16\'>' + n + '</span><span class=\'text-2xl md:text-5xl w-4 md:w-8\'>:</span>' : '' }${ n > 0 || s > 0 ? '<span class=\'text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16\'>' + s + '</span><span class=\'text-2xl md:text-5xl w-4 md:w-8\'>:</span>' : '' }<span class='text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16'>${ a }</span><span class='text-2xl md:text-5xl w-4 md:w-8'>:</span><span class='text-3xl whitespace-nowrap md:text-6xl w-8 md:w-16'>${ r }</span></div>`; | |
} | |
} | |
}; | |
Ft(At, 'values', { | |
time: { | |
type: String, | |
default: '' | |
} | |
}); | |
var Te = {}; | |
_e(Te, { default: () => Kt }); | |
var Q = (o, t = 10000) => (o = parseFloat(o + '') || 0, Math.round((o + Number.EPSILON) * t) / t), Xe = function (o) { | |
if (!(o && o instanceof Element && o.offsetParent)) { | |
return false; | |
} | |
let t = o.scrollHeight > o.clientHeight, e = window.getComputedStyle(o).overflowY, i = e.indexOf('hidden') !== -1, n = e.indexOf('visible') !== -1; | |
return t && !i && !n; | |
}, Gt = function (o, t = void 0) { | |
return !(!o || o === document.body || t && o === t) && (Xe(o) ? o : Gt(o.parentElement, t)); | |
}, S = function (o) { | |
var t = new DOMParser().parseFromString(o, 'text/html').body; | |
if (t.childElementCount > 1) { | |
for (var e = document.createElement('div'); t.firstChild;) { | |
e.appendChild(t.firstChild); | |
} | |
return e; | |
} | |
return t.firstChild; | |
}, Se = o => `${ o || '' }`.split(' ').filter(t => !!t), z = (o, t, e) => { | |
o && Se(t).forEach(i => { | |
o.classList.toggle(i, e || false); | |
}); | |
}, K = class { | |
constructor(t) { | |
Object.defineProperty(this, 'pageX', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'pageY', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'clientX', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'clientY', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'id', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'time', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'nativePointer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
this.nativePointer = t; | |
this.pageX = t.pageX; | |
this.pageY = t.pageY; | |
this.clientX = t.clientX; | |
this.clientY = t.clientY; | |
this.id = self.Touch && t instanceof Touch ? t.identifier : -1; | |
this.time = Date.now(); | |
} | |
}, Ge = class { | |
constructor(t, { | |
start: e = () => true, | |
move: i = () => { | |
}, | |
end: n = () => { | |
} | |
}) { | |
Object.defineProperty(this, 'element', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'startCallback', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'moveCallback', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'endCallback', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
Object.defineProperty(this, 'currentPointers', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: [] | |
}); | |
Object.defineProperty(this, 'startPointers', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: [] | |
}); | |
this.element = t; | |
this.startCallback = e; | |
this.moveCallback = i; | |
this.endCallback = n; | |
for (let s of [ | |
'onPointerStart', | |
'onTouchStart', | |
'onMove', | |
'onTouchEnd', | |
'onPointerEnd', | |
'onWindowBlur' | |
]) | |
this[s] = this[s].bind(this); | |
this.element.addEventListener('mousedown', this.onPointerStart, st); | |
this.element.addEventListener('touchstart', this.onTouchStart, st); | |
this.element.addEventListener('touchmove', this.onMove, st); | |
this.element.addEventListener('touchend', this.onTouchEnd); | |
this.element.addEventListener('touchcancel', this.onTouchEnd); | |
} | |
onPointerStart(t) { | |
if (!t.buttons || t.button !== 0) { | |
return; | |
} | |
let e = new K(t); | |
this.currentPointers.some(i => i.id === e.id) || this.triggerPointerStart(e, t) && (window.addEventListener('mousemove', this.onMove), window.addEventListener('mouseup', this.onPointerEnd), window.addEventListener('blur', this.onWindowBlur)); | |
} | |
onTouchStart(t) { | |
for (let e of Array.from(t.changedTouches || [])) | |
this.triggerPointerStart(new K(e), t); | |
window.addEventListener('blur', this.onWindowBlur); | |
} | |
onMove(t) { | |
let e = this.currentPointers.slice(), i = 'changedTouches' in t ? Array.from(t.changedTouches || []).map(s => new K(s)) : [new K(t)], n = []; | |
for (let s of i) { | |
let a = this.currentPointers.findIndex(r => r.id === s.id); | |
a < 0 || (n.push(s), this.currentPointers[a] = s); | |
} | |
n.length && this.moveCallback(t, this.currentPointers.slice(), e); | |
} | |
onPointerEnd(t) { | |
t.buttons > 0 && t.button !== 0 || (this.triggerPointerEnd(t, new K(t)), window.removeEventListener('mousemove', this.onMove), window.removeEventListener('mouseup', this.onPointerEnd), window.removeEventListener('blur', this.onWindowBlur)); | |
} | |
onTouchEnd(t) { | |
for (let e of Array.from(t.changedTouches || [])) | |
this.triggerPointerEnd(t, new K(e)); | |
} | |
triggerPointerStart(t, e) { | |
return !!this.startCallback(e, t, this.currentPointers.slice()) && (this.currentPointers.push(t), this.startPointers.push(t), true); | |
} | |
triggerPointerEnd(t, e) { | |
let i = this.currentPointers.findIndex(n => n.id === e.id); | |
i < 0 || (this.currentPointers.splice(i, 1), this.startPointers.splice(i, 1), this.endCallback(t, e, this.currentPointers.slice())); | |
} | |
onWindowBlur() { | |
this.clear(); | |
} | |
clear() { | |
for (; this.currentPointers.length;) { | |
let t = this.currentPointers[this.currentPointers.length - 1]; | |
this.currentPointers.splice(this.currentPointers.length - 1, 1); | |
this.startPointers.splice(this.currentPointers.length - 1, 1); | |
this.endCallback(new Event('touchend', { | |
bubbles: true, | |
cancelable: true, | |
clientX: t.clientX, | |
clientY: t.clientY | |
}), t, this.currentPointers.slice()); | |
} | |
} | |
stop() { | |
this.element.removeEventListener('mousedown', this.onPointerStart, st); | |
this.element.removeEventListener('touchstart', this.onTouchStart, st); | |
this.element.removeEventListener('touchmove', this.onMove, st); | |
this.element.removeEventListener('touchend', this.onTouchEnd); | |
this.element.removeEventListener('touchcancel', this.onTouchEnd); | |
window.removeEventListener('mousemove', this.onMove); | |
window.removeEventListener('mouseup', this.onPointerEnd); | |
window.removeEventListener('blur', this.onWindowBlur); | |
} | |
}; | |
function di(o, t) { | |
return t ? Math.sqrt(Math.pow(t.clientX - o.clientX, 2) + Math.pow(t.clientY - o.clientY, 2)) : 0; | |
} | |
function hi(o, t) { | |
return t ? { | |
clientX: (o.clientX + t.clientX) / 2, | |
clientY: (o.clientY + t.clientY) / 2 | |
} : o; | |
} | |
var Ve = o => typeof o == 'object' && o !== null && o.constructor === Object && Object.prototype.toString.call(o) === '[object Object]', E = (o, ...t) => { | |
let e = t.length; | |
for (let i = 0; i < e; i++) { | |
let n = t[i] || {}; | |
Object.entries(n).forEach(([s, a]) => { | |
let r = Array.isArray(a) ? [] : {}; | |
o[s] || Object.assign(o, { [s]: r }); | |
Ve(a) ? Object.assign(o[s], E(r, a)) : Array.isArray(a) ? Object.assign(o, { [s]: [...a] }) : Object.assign(o, { [s]: a }); | |
}); | |
} | |
return o; | |
}, xe = function (o, t) { | |
return o.split('.').reduce((e, i) => typeof e == 'object' ? e[i] : void 0, t); | |
}, dt = class { | |
constructor(t = {}) { | |
Object.defineProperty(this, 'options', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: t | |
}); | |
Object.defineProperty(this, 'events', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: new Map() | |
}); | |
this.setOptions(t); | |
for (let e of Object.getOwnPropertyNames(Object.getPrototypeOf(this))) | |
e.startsWith('on') && typeof this[e] == 'function' && (this[e] = this[e].bind(this)); | |
} | |
setOptions(t) { | |
this.options = t ? E({}, this.constructor.defaults, t) : {}; | |
for (let [e, i] of Object.entries(this.option('on') || {})) | |
this.on(e, i); | |
} | |
option(t, ...e) { | |
let i = xe(t, this.options); | |
return i && typeof i == 'function' && (i = i.call(this, this, ...e)), i; | |
} | |
optionFor(t, e, i, ...n) { | |
let s = xe(e, t); | |
var a; | |
typeof (a = s) != 'string' || isNaN(a) || isNaN(parseFloat(a)) || (s = parseFloat(s)); | |
s === 'true' && (s = true); | |
s === 'false' && (s = false); | |
s && typeof s == 'function' && (s = s.call(this, this, t, ...n)); | |
let r = xe(e, this.options); | |
return r && typeof r == 'function' ? s = r.call(this, this, t, ...n, s) : s === void 0 && (s = r), s === void 0 ? i : s; | |
} | |
cn(t) { | |
let e = this.options.classes; | |
return e && e[t] || ''; | |
} | |
localize(t, e = []) { | |
t = String(t).replace(/\{\{(\w+).?(\w+)?\}\}/g, (i, n, s) => { | |
let a = ''; | |
return s ? a = this.option(`${ n[0] + n.toLowerCase().substring(1) }.l10n.${ s }`) : n && (a = this.option(`l10n.${ n }`)), a || (a = i), a; | |
}); | |
for (let i = 0; i < e.length; i++) { | |
t = t.split(e[i][0]).join(e[i][1]); | |
} | |
return t = t.replace(/\{\{(.*?)\}\}/g, (i, n) => n); | |
} | |
on(t, e) { | |
let i = []; | |
typeof t == 'string' ? i = t.split(' ') : Array.isArray(t) && (i = t); | |
this.events || (this.events = new Map()); | |
i.forEach(n => { | |
let s = this.events.get(n); | |
s || (this.events.set(n, []), s = []); | |
s.includes(e) || s.push(e); | |
this.events.set(n, s); | |
}); | |
} | |
off(t, e) { | |
let i = []; | |
typeof t == 'string' ? i = t.split(' ') : Array.isArray(t) && (i = t); | |
i.forEach(n => { | |
let s = this.events.get(n); | |
if (Array.isArray(s)) { | |
let a = s.indexOf(e); | |
a > -1 && s.splice(a, 1); | |
} | |
}); | |
} | |
emit(t, ...e) { | |
[...this.events.get(t) || []].forEach(i => i(this, ...e)); | |
t !== '*' && this.emit('*', t, ...e); | |
} | |
}; | |
Object.defineProperty(dt, 'version', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: '5.0.36' | |
}); | |
Object.defineProperty(dt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: {} | |
}); | |
var Qt = class extends dt { | |
constructor(t = {}) { | |
super(t); | |
Object.defineProperty(this, 'plugins', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: {} | |
}); | |
} | |
attachPlugins(t = {}) { | |
let e = new Map(); | |
for (let [i, n] of Object.entries(t)) { | |
let s = this.option(i), a = this.plugins[i]; | |
a || s === false ? a && s === false && (a.detach(), delete this.plugins[i]) : e.set(i, new n(this, s || {})); | |
} | |
for (let [i, n] of e) | |
this.plugins[i] = n, n.attach(); | |
} | |
detachPlugins(t) { | |
t = t || Object.keys(this.plugins); | |
for (let e of t) { | |
let i = this.plugins[e]; | |
i && i.detach(); | |
delete this.plugins[e]; | |
} | |
return this.emit('detachPlugins'), this; | |
} | |
}, U; | |
(function (o) { | |
o[o.Init = 0] = 'Init'; | |
o[o.Error = 1] = 'Error'; | |
o[o.Ready = 2] = 'Ready'; | |
o[o.Panning = 3] = 'Panning'; | |
o[o.Mousemove = 4] = 'Mousemove'; | |
o[o.Destroy = 5] = 'Destroy'; | |
}(U || (U = {}))); | |
var j = [ | |
'a', | |
'b', | |
'c', | |
'd', | |
'e', | |
'f' | |
], jn = { | |
content: null, | |
width: 'auto', | |
height: 'auto', | |
panMode: 'drag', | |
touch: true, | |
dragMinThreshold: 3, | |
lockAxis: false, | |
mouseMoveFactor: 1, | |
mouseMoveFriction: 0.12, | |
zoom: true, | |
pinchToZoom: true, | |
panOnlyZoomed: 'auto', | |
minScale: 1, | |
maxScale: 2, | |
friction: 0.25, | |
dragFriction: 0.35, | |
decelFriction: 0.05, | |
click: 'toggleZoom', | |
dblClick: false, | |
wheel: 'zoom', | |
wheelLimit: 7, | |
spinner: true, | |
bounds: 'auto', | |
infinite: false, | |
rubberband: true, | |
bounce: true, | |
maxVelocity: 75, | |
transformParent: false, | |
classes: { | |
content: 'f-panzoom__content', | |
isLoading: 'is-loading', | |
canZoomIn: 'can-zoom_in', | |
canZoomOut: 'can-zoom_out', | |
isDraggable: 'is-draggable', | |
isDragging: 'is-dragging', | |
inFullscreen: 'in-fullscreen', | |
htmlHasFullscreen: 'with-panzoom-in-fullscreen' | |
}, | |
l10n: Xi | |
}, ze = '<div class="f-spinner"><svg viewBox="0 0 50 50"><circle cx="25" cy="25" r="20"></circle><circle cx="25" cy="25" r="20"></circle></svg></div>', C = o => o && o !== null && o instanceof Element && 'nodeType' in o, x = (o, t) => { | |
o && Se(t).forEach(e => { | |
o.classList.remove(e); | |
}); | |
}, y = (o, t) => { | |
o && Se(t).forEach(e => { | |
o.classList.add(e); | |
}); | |
}, Ue = null, Le = null, nt = class o extends Qt { | |
get fits() { | |
return this.contentRect.width - this.contentRect.fitWidth < 1 && this.contentRect.height - this.contentRect.fitHeight < 1; | |
} | |
get isTouchDevice() { | |
return Le === null && (Le = window.matchMedia('(hover: none)').matches), Le; | |
} | |
get isMobile() { | |
return Ue === null && (Ue = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent)), Ue; | |
} | |
get panMode() { | |
return this.options.panMode !== 'mousemove' || this.isTouchDevice ? 'drag' : 'mousemove'; | |
} | |
get panOnlyZoomed() { | |
let t = this.options.panOnlyZoomed; | |
return t === 'auto' ? this.isTouchDevice : t; | |
} | |
get isInfinite() { | |
return this.option('infinite'); | |
} | |
get angle() { | |
return 180 * Math.atan2(this.current.b, this.current.a) / Math.PI || 0; | |
} | |
get targetAngle() { | |
return 180 * Math.atan2(this.target.b, this.target.a) / Math.PI || 0; | |
} | |
get scale() { | |
let { | |
a: t, | |
b: e | |
} = this.current; | |
return Math.sqrt(t * t + e * e) || 1; | |
} | |
get targetScale() { | |
let { | |
a: t, | |
b: e | |
} = this.target; | |
return Math.sqrt(t * t + e * e) || 1; | |
} | |
get minScale() { | |
return this.option('minScale') || 1; | |
} | |
get fullScale() { | |
let {contentRect: t} = this; | |
return t.fullWidth / t.fitWidth || 1; | |
} | |
get maxScale() { | |
return this.fullScale * (this.option('maxScale') || 1) || 1; | |
} | |
get coverScale() { | |
let { | |
containerRect: t, | |
contentRect: e | |
} = this, i = Math.max(t.height / e.fitHeight, t.width / e.fitWidth) || 1; | |
return Math.min(this.fullScale, i); | |
} | |
get isScaling() { | |
return Math.abs(this.targetScale - this.scale) > 0.00001 && !this.isResting; | |
} | |
get isContentLoading() { | |
let t = this.content; | |
return !!(t && t instanceof HTMLImageElement) && !t.complete; | |
} | |
get isResting() { | |
if (this.isBouncingX || this.isBouncingY) { | |
return false; | |
} | |
for (let t of j) { | |
let e = t == 'e' || t === 'f' ? 0.0001 : 0.00001; | |
if (Math.abs(this.target[t] - this.current[t]) > e) { | |
return false; | |
} | |
} | |
return !(!this.ignoreBounds && !this.checkBounds().inBounds); | |
} | |
constructor(t, e = {}, i = {}) { | |
var n; | |
if (super(e), Object.defineProperty(this, 'pointerTracker', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'resizeObserver', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'updateTimer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'clickTimer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'rAF', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'isTicking', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}), Object.defineProperty(this, 'ignoreBounds', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}), Object.defineProperty(this, 'isBouncingX', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}), Object.defineProperty(this, 'isBouncingY', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}), Object.defineProperty(this, 'clicks', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'trackingPoints', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: [] | |
}), Object.defineProperty(this, 'pwt', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'cwd', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'pmme', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}), Object.defineProperty(this, 'friction', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'state', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: U.Init | |
}), Object.defineProperty(this, 'isDragging', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}), Object.defineProperty(this, 'container', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}), Object.defineProperty(this, 'content', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}), Object.defineProperty(this, 'spinner', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'containerRect', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
width: 0, | |
height: 0, | |
innerWidth: 0, | |
innerHeight: 0 | |
} | |
}), Object.defineProperty(this, 'contentRect', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
top: 0, | |
right: 0, | |
bottom: 0, | |
left: 0, | |
fullWidth: 0, | |
fullHeight: 0, | |
fitWidth: 0, | |
fitHeight: 0, | |
width: 0, | |
height: 0 | |
} | |
}), Object.defineProperty(this, 'dragStart', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
x: 0, | |
y: 0, | |
top: 0, | |
left: 0, | |
time: 0 | |
} | |
}), Object.defineProperty(this, 'dragOffset', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
x: 0, | |
y: 0, | |
time: 0 | |
} | |
}), Object.defineProperty(this, 'current', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: Object.assign({}, Wt) | |
}), Object.defineProperty(this, 'target', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: Object.assign({}, Wt) | |
}), Object.defineProperty(this, 'velocity', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
a: 0, | |
b: 0, | |
c: 0, | |
d: 0, | |
e: 0, | |
f: 0 | |
} | |
}), Object.defineProperty(this, 'lockedAxis', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}), !t) { | |
throw new Error('Container Element Not Found'); | |
} | |
this.container = t; | |
this.initContent(); | |
this.attachPlugins(Object.assign(Object.assign({}, o.Plugins), i)); | |
this.emit('attachPlugins'); | |
this.emit('init'); | |
let s = this.content; | |
if (s.addEventListener('load', this.onLoad), s.addEventListener('error', this.onError), this.isContentLoading) { | |
if (this.option('spinner')) { | |
t.classList.add(this.cn('isLoading')); | |
let a = S(ze); | |
!t.contains(s) || s.parentElement instanceof HTMLPictureElement ? this.spinner = t.appendChild(a) : this.spinner = ((n = s.parentElement) === null || n === void 0 ? void 0 : n.insertBefore(a, s)) || null; | |
} | |
this.emit('beforeLoad'); | |
} else { | |
queueMicrotask(() => { | |
this.enable(); | |
}); | |
} | |
} | |
initContent() { | |
let {container: t} = this, e = this.cn('content'), i = this.option('content') || t.querySelector(`.${ e }`); | |
if (i || (i = t.querySelector('img,picture') || t.firstElementChild, i && y(i, e)), i instanceof HTMLPictureElement && (i = i.querySelector('img')), !i) { | |
throw new Error('No content found'); | |
} | |
this.content = i; | |
} | |
onLoad() { | |
let { | |
spinner: t, | |
container: e, | |
state: i | |
} = this; | |
t && (t.remove(), this.spinner = null); | |
this.option('spinner') && e.classList.remove(this.cn('isLoading')); | |
this.emit('afterLoad'); | |
i === U.Init ? this.enable() : this.updateMetrics(); | |
} | |
onError() { | |
this.state !== U.Destroy && (this.spinner && (this.spinner.remove(), this.spinner = null), this.stop(), this.detachEvents(), this.state = U.Error, this.emit('error')); | |
} | |
getNextScale(t) { | |
let { | |
fullScale: e, | |
targetScale: i, | |
coverScale: n, | |
maxScale: s, | |
minScale: a | |
} = this, r = a; | |
switch (t) { | |
case 'toggleMax': | |
r = i - a < 0.5 * (s - a) ? s : a; | |
break; | |
case 'toggleCover': | |
r = i - a < 0.5 * (n - a) ? n : a; | |
break; | |
case 'toggleZoom': | |
r = i - a < 0.5 * (e - a) ? e : a; | |
break; | |
case 'iterateZoom': | |
let l = [ | |
1, | |
e, | |
s | |
].sort((d, u) => d - u), c = l.findIndex(d => d > i + 0.00001); | |
r = l[c] || 1; | |
} | |
return r; | |
} | |
attachObserver() { | |
var t; | |
let e = () => { | |
let { | |
container: i, | |
containerRect: n | |
} = this; | |
return Math.abs(n.width - i.getBoundingClientRect().width) > 0.1 || Math.abs(n.height - i.getBoundingClientRect().height) > 0.1; | |
}; | |
this.resizeObserver || window.ResizeObserver === void 0 || (this.resizeObserver = new ResizeObserver(() => { | |
this.updateTimer || (e() ? (this.onResize(), this.isMobile && (this.updateTimer = setTimeout(() => { | |
e() && this.onResize(); | |
this.updateTimer = null; | |
}, 500))) : this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null)); | |
})); | |
(t = this.resizeObserver) === null || t === void 0 || t.observe(this.container); | |
} | |
detachObserver() { | |
var t; | |
(t = this.resizeObserver) === null || t === void 0 || t.disconnect(); | |
} | |
attachEvents() { | |
let {container: t} = this; | |
t.addEventListener('click', this.onClick, { | |
passive: false, | |
capture: false | |
}); | |
t.addEventListener('wheel', this.onWheel, { passive: false }); | |
this.pointerTracker = new Ge(t, { | |
start: this.onPointerDown, | |
move: this.onPointerMove, | |
end: this.onPointerUp | |
}); | |
document.addEventListener('mousemove', this.onMouseMove); | |
} | |
detachEvents() { | |
var t; | |
let {container: e} = this; | |
e.removeEventListener('click', this.onClick, { | |
passive: false, | |
capture: false | |
}); | |
e.removeEventListener('wheel', this.onWheel, { passive: false }); | |
(t = this.pointerTracker) === null || t === void 0 || t.stop(); | |
this.pointerTracker = null; | |
document.removeEventListener('mousemove', this.onMouseMove); | |
document.removeEventListener('keydown', this.onKeydown, true); | |
this.clickTimer && (clearTimeout(this.clickTimer), this.clickTimer = null); | |
this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null); | |
} | |
animate() { | |
this.setTargetForce(); | |
let t = this.friction, e = this.option('maxVelocity'); | |
for (let i of j) | |
t ? (this.velocity[i] *= 1 - t, e && !this.isScaling && (this.velocity[i] = Math.max(Math.min(this.velocity[i], e), -1 * e)), this.current[i] += this.velocity[i]) : this.current[i] = this.target[i]; | |
this.setTransform(); | |
this.setEdgeForce(); | |
!this.isResting || this.isDragging ? this.rAF = requestAnimationFrame(() => this.animate()) : this.stop('current'); | |
} | |
setTargetForce() { | |
for (let t of j) | |
t === 'e' && this.isBouncingX || t === 'f' && this.isBouncingY || (this.velocity[t] = (1 / (1 - this.friction) - 1) * (this.target[t] - this.current[t])); | |
} | |
checkBounds(t = 0, e = 0) { | |
let {current: i} = this, n = i.e + t, s = i.f + e, a = this.getBounds(), { | |
x: r, | |
y: l | |
} = a, c = r.min, d = r.max, u = l.min, m = l.max, h = 0, b = 0; | |
return c !== 1e+400 && n < c ? h = c - n : d !== 1e+400 && n > d && (h = d - n), u !== 1e+400 && s < u ? b = u - s : m !== 1e+400 && s > m && (b = m - s), Math.abs(h) < 0.0001 && (h = 0), Math.abs(b) < 0.0001 && (b = 0), Object.assign(Object.assign({}, a), { | |
xDiff: h, | |
yDiff: b, | |
inBounds: !h && !b | |
}); | |
} | |
clampTargetBounds() { | |
let {target: t} = this, { | |
x: e, | |
y: i | |
} = this.getBounds(); | |
e.min !== 1e+400 && (t.e = Math.max(t.e, e.min)); | |
e.max !== 1e+400 && (t.e = Math.min(t.e, e.max)); | |
i.min !== 1e+400 && (t.f = Math.max(t.f, i.min)); | |
i.max !== 1e+400 && (t.f = Math.min(t.f, i.max)); | |
} | |
calculateContentDim(t = this.current) { | |
let { | |
content: e, | |
contentRect: i | |
} = this, { | |
fitWidth: n, | |
fitHeight: s, | |
fullWidth: a, | |
fullHeight: r | |
} = i, l = a, c = r; | |
if (this.option('zoom') || this.angle !== 0) { | |
let d = !(e instanceof HTMLImageElement) && (window.getComputedStyle(e).maxWidth === 'none' || window.getComputedStyle(e).maxHeight === 'none'), u = d ? a : n, m = d ? r : s, h = this.getMatrix(t), b = new DOMPoint(0, 0).matrixTransform(h), p = new DOMPoint(0 + u, 0).matrixTransform(h), f = new DOMPoint(0 + u, 0 + m).matrixTransform(h), g = new DOMPoint(0, 0 + m).matrixTransform(h), F = Math.abs(f.x - b.x), v = Math.abs(f.y - b.y), B = Math.abs(g.x - p.x), k = Math.abs(g.y - p.y); | |
l = Math.max(F, B); | |
c = Math.max(v, k); | |
} | |
return { | |
contentWidth: l, | |
contentHeight: c | |
}; | |
} | |
setEdgeForce() { | |
if (this.ignoreBounds || this.isDragging || this.panMode === 'mousemove' || this.targetScale < this.scale) { | |
return this.isBouncingX = false, void (this.isBouncingY = false); | |
} | |
let {target: t} = this, { | |
x: e, | |
y: i, | |
xDiff: n, | |
yDiff: s | |
} = this.checkBounds(), a = this.option('maxVelocity'), r = this.velocity.e, l = this.velocity.f; | |
n !== 0 ? (this.isBouncingX = true, n * r <= 0 ? r += 0.14 * n : (r = 0.14 * n, e.min !== 1e+400 && (this.target.e = Math.max(t.e, e.min)), e.max !== 1e+400 && (this.target.e = Math.min(t.e, e.max))), a && (r = Math.max(Math.min(r, a), -1 * a))) : this.isBouncingX = false; | |
s !== 0 ? (this.isBouncingY = true, s * l <= 0 ? l += 0.14 * s : (l = 0.14 * s, i.min !== 1e+400 && (this.target.f = Math.max(t.f, i.min)), i.max !== 1e+400 && (this.target.f = Math.min(t.f, i.max))), a && (l = Math.max(Math.min(l, a), -1 * a))) : this.isBouncingY = false; | |
this.isBouncingX && (this.velocity.e = r); | |
this.isBouncingY && (this.velocity.f = l); | |
} | |
enable() { | |
let {content: t} = this, e = new DOMMatrixReadOnly(window.getComputedStyle(t).transform); | |
for (let i of j) | |
this.current[i] = this.target[i] = e[i]; | |
this.updateMetrics(); | |
this.attachObserver(); | |
this.attachEvents(); | |
this.state = U.Ready; | |
this.emit('ready'); | |
} | |
onClick(t) { | |
var e; | |
t.type === 'click' && t.detail === 0 && (this.dragOffset.x = 0, this.dragOffset.y = 0); | |
this.isDragging && ((e = this.pointerTracker) === null || e === void 0 || e.clear(), this.trackingPoints = [], this.startDecelAnim()); | |
let i = t.target; | |
if (!i || t.defaultPrevented) { | |
return; | |
} | |
if (i.hasAttribute('disabled')) { | |
return t.preventDefault(), void t.stopPropagation(); | |
} | |
if ((() => { | |
let h = window.getSelection(); | |
return h && h.type === 'Range'; | |
})() && !i.closest('button')) { | |
return; | |
} | |
let n = i.closest('[data-panzoom-action]'), s = i.closest('[data-panzoom-change]'), a = n || s, r = a && C(a) ? a.dataset : null; | |
if (r) { | |
let h = r.panzoomChange, b = r.panzoomAction; | |
if ((h || b) && t.preventDefault(), h) { | |
let p = {}; | |
try { | |
p = JSON.parse(h); | |
} catch { | |
console && console.warn('The given data was not valid JSON'); | |
} | |
return void this.applyChange(p); | |
} | |
if (b) { | |
return void (this[b] && this[b]()); | |
} | |
} | |
if (Math.abs(this.dragOffset.x) > 3 || Math.abs(this.dragOffset.y) > 3) { | |
return t.preventDefault(), void t.stopPropagation(); | |
} | |
if (i.closest('[data-fancybox]')) { | |
return; | |
} | |
let l = this.content.getBoundingClientRect(), c = this.dragStart; | |
if (c.time && !this.canZoomOut() && (Math.abs(l.x - c.x) > 2 || Math.abs(l.y - c.y) > 2)) { | |
return; | |
} | |
this.dragStart.time = 0; | |
let d = h => { | |
this.option('zoom', t) && h && typeof h == 'string' && /(iterateZoom)|(toggle(Zoom|Full|Cover|Max)|(zoomTo(Fit|Cover|Max)))/.test(h) && typeof this[h] == 'function' && (t.preventDefault(), this[h]({ event: t })); | |
}, u = this.option('click', t), m = this.option('dblClick', t); | |
m ? (this.clicks++, this.clicks == 1 && (this.clickTimer = setTimeout(() => { | |
this.clicks === 1 ? (this.emit('click', t), !t.defaultPrevented && u && d(u)) : (this.emit('dblClick', t), t.defaultPrevented || d(m)); | |
this.clicks = 0; | |
this.clickTimer = null; | |
}, 350))) : (this.emit('click', t), !t.defaultPrevented && u && d(u)); | |
} | |
addTrackingPoint(t) { | |
let e = this.trackingPoints.filter(i => i.time > Date.now() - 100); | |
e.push(t); | |
this.trackingPoints = e; | |
} | |
onPointerDown(t, e, i) { | |
var n; | |
if (this.option('touch', t) === false) { | |
return false; | |
} | |
this.pwt = 0; | |
this.dragOffset = { | |
x: 0, | |
y: 0, | |
time: 0 | |
}; | |
this.trackingPoints = []; | |
let s = this.content.getBoundingClientRect(); | |
if (this.dragStart = { | |
x: s.x, | |
y: s.y, | |
top: s.top, | |
left: s.left, | |
time: Date.now() | |
}, this.clickTimer) { | |
return false; | |
} | |
if (this.panMode === 'mousemove' && this.targetScale > 1) { | |
return t.preventDefault(), t.stopPropagation(), false; | |
} | |
let a = t.composedPath()[0]; | |
if (!i.length) { | |
if ([ | |
'TEXTAREA', | |
'OPTION', | |
'INPUT', | |
'SELECT', | |
'VIDEO', | |
'IFRAME' | |
].includes(a.nodeName) || a.closest('[contenteditable],[data-selectable],[data-draggable],[data-clickable],[data-panzoom-change],[data-panzoom-action]')) { | |
return false; | |
} | |
(n = window.getSelection()) === null || n === void 0 || n.removeAllRanges(); | |
} | |
if (t.type === 'mousedown') { | |
[ | |
'A', | |
'BUTTON' | |
].includes(a.nodeName) || t.preventDefault(); | |
} else { | |
if (Math.abs(this.velocity.a) > 0.3) { | |
return false; | |
} | |
} | |
return this.target.e = this.current.e, this.target.f = this.current.f, this.stop(), this.isDragging || (this.isDragging = true, this.addTrackingPoint(e), this.emit('touchStart', t)), true; | |
} | |
onPointerMove(t, e, i) { | |
if (this.option('touch', t) === false || !this.isDragging || e.length < 2 && this.panOnlyZoomed && Q(this.targetScale) <= Q(this.minScale) || (this.emit('touchMove', t), t.defaultPrevented)) { | |
return; | |
} | |
this.addTrackingPoint(e[0]); | |
let {content: n} = this, s = hi(i[0], i[1]), a = hi(e[0], e[1]), r = 0, l = 0; | |
if (e.length > 1) { | |
let v = n.getBoundingClientRect(); | |
r = s.clientX - v.left - 0.5 * v.width; | |
l = s.clientY - v.top - 0.5 * v.height; | |
} | |
let c = di(i[0], i[1]), d = di(e[0], e[1]), u = c ? d / c : 1, m = a.clientX - s.clientX, h = a.clientY - s.clientY; | |
this.dragOffset.x += m; | |
this.dragOffset.y += h; | |
this.dragOffset.time = Date.now() - this.dragStart.time; | |
let b = Q(this.targetScale) === Q(this.minScale) && this.option('lockAxis'); | |
if (b && !this.lockedAxis) { | |
if (b === 'xy' || b === 'y' || t.type === 'touchmove') { | |
if (Math.abs(this.dragOffset.x) < 6 && Math.abs(this.dragOffset.y) < 6) { | |
return void t.preventDefault(); | |
} | |
let v = Math.abs(180 * Math.atan2(this.dragOffset.y, this.dragOffset.x) / Math.PI); | |
this.lockedAxis = v > 45 && v < 135 ? 'y' : 'x'; | |
this.dragOffset.x = 0; | |
this.dragOffset.y = 0; | |
m = 0; | |
h = 0; | |
} else { | |
this.lockedAxis = b; | |
} | |
} | |
if (Gt(t.target, this.content) && (b = 'x', this.dragOffset.y = 0), b && b !== 'xy' && this.lockedAxis !== b && Q(this.targetScale) === Q(this.minScale)) { | |
return; | |
} | |
t.cancelable && t.preventDefault(); | |
this.container.classList.add(this.cn('isDragging')); | |
let p = this.checkBounds(m, h); | |
this.option('rubberband') ? (this.isInfinite !== 'x' && (p.xDiff > 0 && m < 0 || p.xDiff < 0 && m > 0) && (m *= Math.max(0, 0.5 - Math.abs(0.75 / this.contentRect.fitWidth * p.xDiff))), this.isInfinite !== 'y' && (p.yDiff > 0 && h < 0 || p.yDiff < 0 && h > 0) && (h *= Math.max(0, 0.5 - Math.abs(0.75 / this.contentRect.fitHeight * p.yDiff)))) : (p.xDiff && (m = 0), p.yDiff && (h = 0)); | |
let f = this.targetScale, g = this.minScale, F = this.maxScale; | |
f < 0.5 * g && (u = Math.max(u, g)); | |
f > 1.5 * F && (u = Math.min(u, F)); | |
this.lockedAxis === 'y' && Q(f) === Q(g) && (m = 0); | |
this.lockedAxis === 'x' && Q(f) === Q(g) && (h = 0); | |
this.applyChange({ | |
originX: r, | |
originY: l, | |
panX: m, | |
panY: h, | |
scale: u, | |
friction: this.option('dragFriction'), | |
ignoreBounds: true | |
}); | |
} | |
onPointerUp(t, e, i) { | |
if (i.length) { | |
return this.dragOffset.x = 0, this.dragOffset.y = 0, void (this.trackingPoints = []); | |
} | |
this.container.classList.remove(this.cn('isDragging')); | |
this.isDragging && (this.addTrackingPoint(e), this.panOnlyZoomed && this.contentRect.width - this.contentRect.fitWidth < 1 && this.contentRect.height - this.contentRect.fitHeight < 1 && (this.trackingPoints = []), Gt(t.target, this.content) && this.lockedAxis === 'y' && (this.trackingPoints = []), this.emit('touchEnd', t), this.isDragging = false, this.lockedAxis = false, this.state !== U.Destroy && (t.defaultPrevented || this.startDecelAnim())); | |
} | |
startDecelAnim() { | |
var t; | |
let e = this.isScaling; | |
this.rAF && (cancelAnimationFrame(this.rAF), this.rAF = null); | |
this.isBouncingX = false; | |
this.isBouncingY = false; | |
for (let v of j) | |
this.velocity[v] = 0; | |
this.target.e = this.current.e; | |
this.target.f = this.current.f; | |
x(this.container, 'is-scaling'); | |
x(this.container, 'is-animating'); | |
this.isTicking = false; | |
let {trackingPoints: i} = this, n = i[0], s = i[i.length - 1], a = 0, r = 0, l = 0; | |
s && n && (a = s.clientX - n.clientX, r = s.clientY - n.clientY, l = s.time - n.time); | |
let c = ((t = window.visualViewport) === null || t === void 0 ? void 0 : t.scale) || 1; | |
c !== 1 && (a *= c, r *= c); | |
let d = 0, u = 0, m = 0, h = 0, b = this.option('decelFriction'), p = this.targetScale; | |
if (l > 0) { | |
m = Math.abs(a) > 3 ? a / (l / 30) : 0; | |
h = Math.abs(r) > 3 ? r / (l / 30) : 0; | |
let v = this.option('maxVelocity'); | |
v && (m = Math.max(Math.min(m, v), -1 * v), h = Math.max(Math.min(h, v), -1 * v)); | |
} | |
m && (d = m / (1 / (1 - b) - 1)); | |
h && (u = h / (1 / (1 - b) - 1)); | |
(this.option('lockAxis') === 'y' || this.option('lockAxis') === 'xy' && this.lockedAxis === 'y' && Q(p) === this.minScale) && (d = m = 0); | |
(this.option('lockAxis') === 'x' || this.option('lockAxis') === 'xy' && this.lockedAxis === 'x' && Q(p) === this.minScale) && (u = h = 0); | |
let f = this.dragOffset.x, g = this.dragOffset.y, F = this.option('dragMinThreshold') || 0; | |
Math.abs(f) < F && Math.abs(g) < F && (d = u = 0, m = h = 0); | |
(this.option('zoom') && (p < this.minScale - 0.00001 || p > this.maxScale + 0.00001) || e && !d && !u) && (b = 0.35); | |
this.applyChange({ | |
panX: d, | |
panY: u, | |
friction: b | |
}); | |
this.emit('decel', m, h, f, g); | |
} | |
onWheel(t) { | |
var e = [ | |
-t.deltaX || 0, | |
-t.deltaY || 0, | |
-t.detail || 0 | |
].reduce(function (s, a) { | |
return Math.abs(a) > Math.abs(s) ? a : s; | |
}); | |
let i = Math.max(-1, Math.min(1, e)); | |
if (this.emit('wheel', t, i), this.panMode === 'mousemove' || t.defaultPrevented) { | |
return; | |
} | |
let n = this.option('wheel'); | |
n === 'pan' ? (t.preventDefault(), this.panOnlyZoomed && !this.canZoomOut() || this.applyChange({ | |
panX: 2 * -t.deltaX, | |
panY: 2 * -t.deltaY, | |
bounce: false | |
})) : n === 'zoom' && this.option('zoom') !== false && this.zoomWithWheel(t); | |
} | |
onMouseMove(t) { | |
this.panWithMouse(t); | |
} | |
onKeydown(t) { | |
t.key === 'Escape' && this.toggleFS(); | |
} | |
onResize() { | |
this.updateMetrics(); | |
this.checkBounds().inBounds || this.requestTick(); | |
} | |
setTransform() { | |
this.emit('beforeTransform'); | |
let { | |
current: t, | |
target: e, | |
content: i, | |
contentRect: n | |
} = this, s = Object.assign({}, Wt); | |
for (let f of j) { | |
let g = f == 'e' || f === 'f' ? 10000 : 100000; | |
s[f] = Q(t[f], g); | |
Math.abs(e[f] - t[f]) < (f == 'e' || f === 'f' ? 0.51 : 0.001) && (t[f] = e[f]); | |
} | |
let { | |
a, | |
b: r, | |
c: l, | |
d: c, | |
e: d, | |
f: u | |
} = s, m = `matrix(${ a }, ${ r }, ${ l }, ${ c }, ${ d }, ${ u })`, h = i.parentElement instanceof HTMLPictureElement ? i.parentElement : i; | |
if (this.option('transformParent') && (h = h.parentElement || h), h.style.transform === m) { | |
return; | |
} | |
h.style.transform = m; | |
let { | |
contentWidth: b, | |
contentHeight: p | |
} = this.calculateContentDim(); | |
n.width = b; | |
n.height = p; | |
this.emit('afterTransform'); | |
} | |
updateMetrics(t = false) { | |
var e; | |
if (!this || this.state === U.Destroy || this.isContentLoading) { | |
return; | |
} | |
let i = Math.max(1, ((e = window.visualViewport) === null || e === void 0 ? void 0 : e.scale) || 1), { | |
container: n, | |
content: s | |
} = this, a = s instanceof HTMLImageElement, r = n.getBoundingClientRect(), l = getComputedStyle(this.container), c = r.width * i, d = r.height * i, u = parseFloat(l.paddingTop) + parseFloat(l.paddingBottom), m = c - (parseFloat(l.paddingLeft) + parseFloat(l.paddingRight)), h = d - u; | |
this.containerRect = { | |
width: c, | |
height: d, | |
innerWidth: m, | |
innerHeight: h | |
}; | |
let b = parseFloat(s.dataset.width || '') || (W => { | |
let P = 0; | |
return P = W instanceof HTMLImageElement ? W.naturalWidth : W instanceof SVGElement ? W.width.baseVal.value : Math.max(W.offsetWidth, W.scrollWidth), P || 0; | |
})(s), p = parseFloat(s.dataset.height || '') || (W => { | |
let P = 0; | |
return P = W instanceof HTMLImageElement ? W.naturalHeight : W instanceof SVGElement ? W.height.baseVal.value : Math.max(W.offsetHeight, W.scrollHeight), P || 0; | |
})(s), f = this.option('width', b) || 'auto', g = this.option('height', p) || 'auto', F = f === 'auto', v = g === 'auto'; | |
typeof f != 'number' && (f = b); | |
typeof g != 'number' && (g = p); | |
F && (f = b * (g / p)); | |
v && (g = p / (b / f)); | |
let B = s.parentElement instanceof HTMLPictureElement ? s.parentElement : s; | |
this.option('transformParent') && (B = B.parentElement || B); | |
let k = B.getAttribute('style') || ''; | |
B.style.setProperty('transform', 'none', 'important'); | |
a && (B.style.width = '', B.style.height = ''); | |
B.offsetHeight; | |
let X = s.getBoundingClientRect(), L = X.width * i, G = X.height * i, Pi = L, _i = G; | |
L = Math.min(L, f); | |
G = Math.min(G, g); | |
a ? { | |
width: L, | |
height: G | |
} = ((W, P, Ki, qi) => { | |
let $i = Ki / W, tn = qi / P, He = Math.min($i, tn); | |
return { | |
width: W *= He, | |
height: P *= He | |
}; | |
})(f, g, L, G) : (L = Math.min(L, f), G = Math.min(G, g)); | |
let je = 0.5 * (_i - G), Je = 0.5 * (Pi - L); | |
this.contentRect = Object.assign(Object.assign({}, this.contentRect), { | |
top: X.top - r.top + je, | |
bottom: r.bottom - X.bottom + je, | |
left: X.left - r.left + Je, | |
right: r.right - X.right + Je, | |
fitWidth: L, | |
fitHeight: G, | |
width: L, | |
height: G, | |
fullWidth: f, | |
fullHeight: g | |
}); | |
B.style.cssText = k; | |
a && (B.style.width = `${ L }px`, B.style.height = `${ G }px`); | |
this.setTransform(); | |
t !== true && this.emit('refresh'); | |
this.ignoreBounds || (Q(this.targetScale) < Q(this.minScale) ? this.zoomTo(this.minScale, { friction: 0 }) : this.targetScale > this.maxScale ? this.zoomTo(this.maxScale, { friction: 0 }) : this.state === U.Init || this.checkBounds().inBounds || this.requestTick()); | |
this.updateControls(); | |
} | |
calculateBounds() { | |
let { | |
contentWidth: t, | |
contentHeight: e | |
} = this.calculateContentDim(this.target), { | |
targetScale: i, | |
lockedAxis: n | |
} = this, { | |
fitWidth: s, | |
fitHeight: a | |
} = this.contentRect, r = 0, l = 0, c = 0, d = 0, u = this.option('infinite'); | |
if (u === true || n && u === n) { | |
r = null; | |
c = null; | |
l = null; | |
d = null; | |
} else { | |
let { | |
containerRect: m, | |
contentRect: h | |
} = this, b = Q(s * i, 10000), p = Q(a * i, 10000), { | |
innerWidth: f, | |
innerHeight: g | |
} = m; | |
if (m.width === b && (f = m.width), m.width === p && (g = m.height), t > f) { | |
c = 0.5 * (t - f); | |
r = -1 * c; | |
let F = 0.5 * (h.right - h.left); | |
r += F; | |
c += F; | |
} | |
if (s > f && t < f && (r -= 0.5 * (s - f), c -= 0.5 * (s - f)), e > g) { | |
d = 0.5 * (e - g); | |
l = -1 * d; | |
let F = 0.5 * (h.bottom - h.top); | |
l += F; | |
d += F; | |
} | |
a > g && e < g && (r -= 0.5 * (a - g), c -= 0.5 * (a - g)); | |
} | |
return { | |
x: { | |
min: r, | |
max: c | |
}, | |
y: { | |
min: l, | |
max: d | |
} | |
}; | |
} | |
getBounds() { | |
let t = this.option('bounds'); | |
return t !== 'auto' ? t : this.calculateBounds(); | |
} | |
updateControls() { | |
let t = this, e = t.container, { | |
panMode: i, | |
contentRect: n, | |
targetScale: s, | |
minScale: a | |
} = t, r = a, l = t.option('click') || false; | |
l && (r = t.getNextScale(l)); | |
let c = t.canZoomIn(), d = t.canZoomOut(), u = i === 'drag' && !!this.option('touch'), m = d && u; | |
if (u && (Q(s) < Q(a) && !this.panOnlyZoomed && (m = true), (Q(n.width, 1) > Q(n.fitWidth, 1) || Q(n.height, 1) > Q(n.fitHeight, 1)) && (m = true)), Q(n.width * s, 1) < Q(n.fitWidth, 1) && (m = false), i === 'mousemove' && (m = false), z(e, this.cn('isDraggable'), m), !this.option('zoom')) { | |
return; | |
} | |
let h = c && Q(r) > Q(s), b = !h && !m && d && Q(r) < Q(s); | |
z(e, this.cn('canZoomIn'), h); | |
z(e, this.cn('canZoomOut'), b); | |
for (let p of e.querySelectorAll('[data-panzoom-action]')) { | |
let f = false, g = false; | |
switch (p.dataset.panzoomAction) { | |
case 'zoomIn': | |
c ? f = true : g = true; | |
break; | |
case 'zoomOut': | |
d ? f = true : g = true; | |
break; | |
case 'toggleZoom': | |
case 'iterateZoom': | |
c || d ? f = true : g = true; | |
let F = p.querySelector('g'); | |
F && (F.style.display = c ? '' : 'none'); | |
} | |
f ? (p.removeAttribute('disabled'), p.removeAttribute('tabindex')) : g && (p.setAttribute('disabled', ''), p.setAttribute('tabindex', '-1')); | |
} | |
} | |
panTo({ | |
x: t = this.target.e, | |
y: e = this.target.f, | |
scale: i = this.targetScale, | |
friction: n = this.option('friction'), | |
angle: s = 0, | |
originX: a = 0, | |
originY: r = 0, | |
flipX: l = false, | |
flipY: c = false, | |
ignoreBounds: d = false | |
}) { | |
this.state !== U.Destroy && this.applyChange({ | |
panX: t - this.target.e, | |
panY: e - this.target.f, | |
scale: i / this.targetScale, | |
angle: s, | |
originX: a, | |
originY: r, | |
friction: n, | |
flipX: l, | |
flipY: c, | |
ignoreBounds: d | |
}); | |
} | |
applyChange({ | |
panX: t = 0, | |
panY: e = 0, | |
scale: i = 1, | |
angle: n = 0, | |
originX: s = -this.current.e, | |
originY: a = -this.current.f, | |
friction: r = this.option('friction'), | |
flipX: l = false, | |
flipY: c = false, | |
ignoreBounds: d = false, | |
bounce: u = this.option('bounce') | |
}) { | |
let m = this.state; | |
if (m === U.Destroy) { | |
return; | |
} | |
this.rAF && (cancelAnimationFrame(this.rAF), this.rAF = null); | |
this.friction = r || 0; | |
this.ignoreBounds = d; | |
let {current: h} = this, b = h.e, p = h.f, f = this.getMatrix(this.target), g = new DOMMatrix().translate(b, p).translate(s, a).translate(t, e); | |
if (this.option('zoom')) { | |
if (!d) { | |
let F = this.targetScale, v = this.minScale, B = this.maxScale; | |
F * i < v && (i = v / F); | |
F * i > B && (i = B / F); | |
} | |
g = g.scale(i); | |
} | |
g = g.translate(-s, -a).translate(-b, -p).multiply(f); | |
n && (g = g.rotate(n)); | |
l && (g = g.scale(-1, 1)); | |
c && (g = g.scale(1, -1)); | |
for (let F of j) | |
F !== 'e' && F !== 'f' && (g[F] > this.minScale + 0.00001 || g[F] < this.minScale - 0.00001) ? this.target[F] = g[F] : this.target[F] = Q(g[F], 10000); | |
(this.targetScale < this.scale || Math.abs(i - 1) > 0.1 || this.panMode === 'mousemove' || u === false) && !d && this.clampTargetBounds(); | |
m === U.Init ? this.animate() : this.isResting || (this.state = U.Panning, this.requestTick()); | |
} | |
stop(t = false) { | |
if (this.state === U.Init || this.state === U.Destroy) { | |
return; | |
} | |
let e = this.isTicking; | |
this.rAF && (cancelAnimationFrame(this.rAF), this.rAF = null); | |
this.isBouncingX = false; | |
this.isBouncingY = false; | |
for (let i of j) | |
this.velocity[i] = 0, t === 'current' ? this.current[i] = this.target[i] : t === 'target' && (this.target[i] = this.current[i]); | |
this.setTransform(); | |
x(this.container, 'is-scaling'); | |
x(this.container, 'is-animating'); | |
this.isTicking = false; | |
this.state = U.Ready; | |
e && (this.emit('endAnimation'), this.updateControls()); | |
} | |
requestTick() { | |
this.isTicking || (this.emit('startAnimation'), this.updateControls(), y(this.container, 'is-animating'), this.isScaling && y(this.container, 'is-scaling')); | |
this.isTicking = true; | |
this.rAF || (this.rAF = requestAnimationFrame(() => this.animate())); | |
} | |
panWithMouse(t, e = this.option('mouseMoveFriction')) { | |
if (this.pmme = t, this.panMode !== 'mousemove' || !t || Q(this.targetScale) <= Q(this.minScale)) { | |
return; | |
} | |
this.emit('mouseMove', t); | |
let { | |
container: i, | |
containerRect: n, | |
contentRect: s | |
} = this, a = n.width, r = n.height, l = i.getBoundingClientRect(), c = (t.clientX || 0) - l.left, d = (t.clientY || 0) - l.top, { | |
contentWidth: u, | |
contentHeight: m | |
} = this.calculateContentDim(this.target), h = this.option('mouseMoveFactor'); | |
h > 1 && (u !== a && (u *= h), m !== r && (m *= h)); | |
let b = 0.5 * (u - a) - c / a * 100 / 100 * (u - a); | |
b += 0.5 * (s.right - s.left); | |
let p = 0.5 * (m - r) - d / r * 100 / 100 * (m - r); | |
p += 0.5 * (s.bottom - s.top); | |
this.applyChange({ | |
panX: b - this.target.e, | |
panY: p - this.target.f, | |
friction: e | |
}); | |
} | |
zoomWithWheel(t) { | |
if (this.state === U.Destroy || this.state === U.Init) { | |
return; | |
} | |
let e = Date.now(); | |
if (e - this.pwt < 45) { | |
return void t.preventDefault(); | |
} | |
this.pwt = e; | |
var i = [ | |
-t.deltaX || 0, | |
-t.deltaY || 0, | |
-t.detail || 0 | |
].reduce(function (c, d) { | |
return Math.abs(d) > Math.abs(c) ? d : c; | |
}); | |
let n = Math.max(-1, Math.min(1, i)), { | |
targetScale: s, | |
maxScale: a, | |
minScale: r | |
} = this, l = s * (100 + 45 * n) / 100; | |
Q(l) < Q(r) && Q(s) <= Q(r) ? (this.cwd += Math.abs(n), l = r) : Q(l) > Q(a) && Q(s) >= Q(a) ? (this.cwd += Math.abs(n), l = a) : (this.cwd = 0, l = Math.max(Math.min(l, a), r)); | |
this.cwd > this.option('wheelLimit') || (t.preventDefault(), Q(l) !== Q(s) && this.zoomTo(l, { event: t })); | |
} | |
canZoomIn() { | |
return this.option('zoom') && (Q(this.contentRect.width, 1) < Q(this.contentRect.fitWidth, 1) || Q(this.targetScale) < Q(this.maxScale)); | |
} | |
canZoomOut() { | |
return this.option('zoom') && Q(this.targetScale) > Q(this.minScale); | |
} | |
zoomIn(t = 1.25, e) { | |
this.zoomTo(this.targetScale * t, e); | |
} | |
zoomOut(t = 0.8, e) { | |
this.zoomTo(this.targetScale * t, e); | |
} | |
zoomToFit(t) { | |
this.zoomTo('fit', t); | |
} | |
zoomToCover(t) { | |
this.zoomTo('cover', t); | |
} | |
zoomToFull(t) { | |
this.zoomTo('full', t); | |
} | |
zoomToMax(t) { | |
this.zoomTo('max', t); | |
} | |
toggleZoom(t) { | |
this.zoomTo(this.getNextScale('toggleZoom'), t); | |
} | |
toggleMax(t) { | |
this.zoomTo(this.getNextScale('toggleMax'), t); | |
} | |
toggleCover(t) { | |
this.zoomTo(this.getNextScale('toggleCover'), t); | |
} | |
iterateZoom(t) { | |
this.zoomTo('next', t); | |
} | |
zoomTo(t = 1, { | |
friction: e = 'auto', | |
originX: i = 'auto', | |
originY: n = 'auto', | |
event: s | |
} = {}) { | |
if (this.isContentLoading || this.state === U.Destroy) { | |
return; | |
} | |
let { | |
targetScale: a, | |
fullScale: r, | |
maxScale: l, | |
coverScale: c | |
} = this; | |
if (this.stop(), this.panMode === 'mousemove' && (s = this.pmme || s), s || i === 'auto' || n === 'auto') { | |
let u = this.content.getBoundingClientRect(), m = this.container.getBoundingClientRect(), h = s ? s.clientX : m.left + 0.5 * m.width, b = s ? s.clientY : m.top + 0.5 * m.height; | |
i = h - u.left - 0.5 * u.width; | |
n = b - u.top - 0.5 * u.height; | |
} | |
let d = 1; | |
typeof t == 'number' ? d = t : t === 'full' ? d = r : t === 'cover' ? d = c : t === 'max' ? d = l : t === 'fit' ? d = 1 : t === 'next' && (d = this.getNextScale('iterateZoom')); | |
d = d / a || 1; | |
e = e === 'auto' ? d > 1 ? 0.15 : 0.25 : e; | |
this.applyChange({ | |
scale: d, | |
originX: i, | |
originY: n, | |
friction: e | |
}); | |
s && this.panMode === 'mousemove' && this.panWithMouse(s, e); | |
} | |
rotateCCW() { | |
this.applyChange({ angle: -90 }); | |
} | |
rotateCW() { | |
this.applyChange({ angle: 90 }); | |
} | |
flipX() { | |
this.applyChange({ flipX: true }); | |
} | |
flipY() { | |
this.applyChange({ flipY: true }); | |
} | |
fitX() { | |
this.stop('target'); | |
let { | |
containerRect: t, | |
contentRect: e, | |
target: i | |
} = this; | |
this.applyChange({ | |
panX: 0.5 * t.width - (e.left + 0.5 * e.fitWidth) - i.e, | |
panY: 0.5 * t.height - (e.top + 0.5 * e.fitHeight) - i.f, | |
scale: t.width / e.fitWidth / this.targetScale, | |
originX: 0, | |
originY: 0, | |
ignoreBounds: true | |
}); | |
} | |
fitY() { | |
this.stop('target'); | |
let { | |
containerRect: t, | |
contentRect: e, | |
target: i | |
} = this; | |
this.applyChange({ | |
panX: 0.5 * t.width - (e.left + 0.5 * e.fitWidth) - i.e, | |
panY: 0.5 * t.innerHeight - (e.top + 0.5 * e.fitHeight) - i.f, | |
scale: t.height / e.fitHeight / this.targetScale, | |
originX: 0, | |
originY: 0, | |
ignoreBounds: true | |
}); | |
} | |
toggleFS() { | |
let {container: t} = this, e = this.cn('inFullscreen'), i = this.cn('htmlHasFullscreen'); | |
t.classList.toggle(e); | |
let n = t.classList.contains(e); | |
n ? (document.documentElement.classList.add(i), document.addEventListener('keydown', this.onKeydown, true)) : (document.documentElement.classList.remove(i), document.removeEventListener('keydown', this.onKeydown, true)); | |
this.updateMetrics(); | |
this.emit(n ? 'enterFS' : 'exitFS'); | |
} | |
getMatrix(t = this.current) { | |
let { | |
a: e, | |
b: i, | |
c: n, | |
d: s, | |
e: a, | |
f: r | |
} = t; | |
return new DOMMatrix([ | |
e, | |
i, | |
n, | |
s, | |
a, | |
r | |
]); | |
} | |
reset(t) { | |
if (this.state !== U.Init && this.state !== U.Destroy) { | |
this.stop('current'); | |
for (let e of j) | |
this.target[e] = 0; | |
this.target.a = this.minScale; | |
this.target.d = this.minScale; | |
this.clampTargetBounds(); | |
this.isResting || (this.friction = t === void 0 ? this.option('friction') : t, this.state = U.Panning, this.requestTick()); | |
} | |
} | |
destroy() { | |
this.stop(); | |
this.state = U.Destroy; | |
this.detachEvents(); | |
this.detachObserver(); | |
let { | |
container: t, | |
content: e | |
} = this, i = this.option('classes') || {}; | |
for (let n of Object.values(i)) | |
t.classList.remove(n + ''); | |
e && (e.removeEventListener('load', this.onLoad), e.removeEventListener('error', this.onError)); | |
this.detachPlugins(); | |
} | |
}; | |
Object.defineProperty(nt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: jn | |
}); | |
Object.defineProperty(nt, 'Plugins', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: {} | |
}); | |
var pi = function (o, t) { | |
let e = true; | |
return (...i) => { | |
e && (e = false, o(...i), setTimeout(() => { | |
e = true; | |
}, t)); | |
}; | |
}, fi = (o, t) => { | |
let e = []; | |
return o.childNodes.forEach(i => { | |
i.nodeType !== Node.ELEMENT_NODE || t && !i.matches(t) || e.push(i); | |
}), e; | |
}, Hn = { | |
viewport: null, | |
track: null, | |
enabled: true, | |
slides: [], | |
axis: 'x', | |
transition: 'fade', | |
preload: 1, | |
slidesPerPage: 'auto', | |
initialPage: 0, | |
friction: 0.12, | |
Panzoom: { decelFriction: 0.12 }, | |
center: true, | |
infinite: true, | |
fill: true, | |
dragFree: false, | |
adaptiveHeight: false, | |
direction: 'ltr', | |
classes: { | |
container: 'f-carousel', | |
viewport: 'f-carousel__viewport', | |
track: 'f-carousel__track', | |
slide: 'f-carousel__slide', | |
isLTR: 'is-ltr', | |
isRTL: 'is-rtl', | |
isHorizontal: 'is-horizontal', | |
isVertical: 'is-vertical', | |
inTransition: 'in-transition', | |
isSelected: 'is-selected' | |
}, | |
l10n: { | |
NEXT: 'Next slide', | |
PREV: 'Previous slide', | |
GOTO: 'Go to slide #%d' | |
} | |
}, w; | |
(function (o) { | |
o[o.Init = 0] = 'Init'; | |
o[o.Ready = 1] = 'Ready'; | |
o[o.Destroy = 2] = 'Destroy'; | |
}(w || (w = {}))); | |
var we = o => { | |
if (typeof o == 'string' || o instanceof HTMLElement) { | |
o = { html: o }; | |
} else { | |
let t = o.thumb; | |
t !== void 0 && (typeof t == 'string' && (o.thumbSrc = t), t instanceof HTMLImageElement && (o.thumbEl = t, o.thumbElSrc = t.src, o.thumbSrc = t.src), delete o.thumb); | |
} | |
return Object.assign({ | |
html: '', | |
el: null, | |
isDom: false, | |
class: '', | |
customClass: '', | |
index: -1, | |
dim: 0, | |
gap: 0, | |
pos: 0, | |
transition: false | |
}, o); | |
}, Pn = (o = {}) => Object.assign({ | |
index: -1, | |
slides: [], | |
dim: 0, | |
pos: -1 | |
}, o), D = class extends dt { | |
constructor(t, e) { | |
super(e); | |
Object.defineProperty(this, 'instance', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: t | |
}); | |
} | |
attach() { | |
} | |
detach() { | |
} | |
}, _n = { | |
classes: { | |
list: 'f-carousel__dots', | |
isDynamic: 'is-dynamic', | |
hasDots: 'has-dots', | |
dot: 'f-carousel__dot', | |
isBeforePrev: 'is-before-prev', | |
isPrev: 'is-prev', | |
isCurrent: 'is-current', | |
isNext: 'is-next', | |
isAfterNext: 'is-after-next' | |
}, | |
dotTpl: '<button type="button" data-carousel-page="%i" aria-label="{{GOTO}}"><span class="f-carousel__dot" aria-hidden="true"></span></button>', | |
dynamicFrom: 11, | |
maxCount: 1e+400, | |
minCount: 2 | |
}, Vt = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'isDynamic', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
Object.defineProperty(this, 'list', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
} | |
onRefresh() { | |
this.refresh(); | |
} | |
build() { | |
let t = this.list; | |
if (!t) { | |
t = document.createElement('ul'); | |
y(t, this.cn('list')); | |
t.setAttribute('role', 'tablist'); | |
let e = this.instance.container; | |
e.appendChild(t); | |
y(e, this.cn('hasDots')); | |
this.list = t; | |
} | |
return t; | |
} | |
refresh() { | |
var t; | |
let e = this.instance.pages.length, i = Math.min(2, this.option('minCount')), n = Math.max(2000, this.option('maxCount')), s = this.option('dynamicFrom'); | |
if (e < i || e > n) { | |
return void this.cleanup(); | |
} | |
let a = typeof s == 'number' && e > 5 && e >= s, r = !this.list || this.isDynamic !== a || this.list.children.length !== e; | |
r && this.cleanup(); | |
let l = this.build(); | |
if (z(l, this.cn('isDynamic'), !!a), r) { | |
for (let u = 0; u < e; u++) { | |
l.append(this.createItem(u)); | |
} | |
} | |
let c, d = 0; | |
for (let u of [...l.children]) { | |
let m = d === this.instance.page; | |
m && (c = u); | |
z(u, this.cn('isCurrent'), m); | |
(t = u.children[0]) === null || t === void 0 || t.setAttribute('aria-selected', m ? 'true' : 'false'); | |
for (let h of [ | |
'isBeforePrev', | |
'isPrev', | |
'isNext', | |
'isAfterNext' | |
]) | |
x(u, this.cn(h)); | |
d++; | |
} | |
if (c = c || l.firstChild, a && c) { | |
let u = c.previousElementSibling, m = u && u.previousElementSibling; | |
y(u, this.cn('isPrev')); | |
y(m, this.cn('isBeforePrev')); | |
let h = c.nextElementSibling, b = h && h.nextElementSibling; | |
y(h, this.cn('isNext')); | |
y(b, this.cn('isAfterNext')); | |
} | |
this.isDynamic = a; | |
} | |
createItem(t = 0) { | |
var e; | |
let i = document.createElement('li'); | |
i.setAttribute('role', 'presentation'); | |
let n = S(this.instance.localize(this.option('dotTpl'), [[ | |
'%d', | |
t + 1 | |
]]).replace(/\%i/g, t + '')); | |
return i.appendChild(n), (e = i.children[0]) === null || e === void 0 || e.setAttribute('role', 'tab'), i; | |
} | |
cleanup() { | |
this.list && (this.list.remove(), this.list = null); | |
this.isDynamic = false; | |
x(this.instance.container, this.cn('hasDots')); | |
} | |
attach() { | |
this.instance.on([ | |
'refresh', | |
'change' | |
], this.onRefresh); | |
} | |
detach() { | |
this.instance.off([ | |
'refresh', | |
'change' | |
], this.onRefresh); | |
this.cleanup(); | |
} | |
}; | |
Object.defineProperty(Vt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: _n | |
}); | |
var It = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'container', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'prev', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'next', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'isDom', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
} | |
onRefresh() { | |
let t = this.instance, e = t.pages.length, i = t.page; | |
if (e < 2) { | |
return void this.cleanup(); | |
} | |
this.build(); | |
let n = this.prev, s = this.next; | |
n && s && (n.removeAttribute('disabled'), s.removeAttribute('disabled'), t.isInfinite || (i <= 0 && n.setAttribute('disabled', ''), i >= e - 1 && s.setAttribute('disabled', ''))); | |
} | |
addBtn(t) { | |
var e; | |
let i = this.instance, n = document.createElement('button'); | |
n.setAttribute('tabindex', '0'); | |
n.setAttribute('title', i.localize(`{{${ t.toUpperCase() }}}`)); | |
y(n, this.cn('button') + ' ' + this.cn(t === 'next' ? 'isNext' : 'isPrev')); | |
let s = i.isRTL ? t === 'next' ? 'prev' : 'next' : t; | |
var a; | |
return n.innerHTML = i.localize(this.option(`${ s }Tpl`)), n.dataset[`carousel${ a = t, a ? a.match('^[a-z]') ? a.charAt(0).toUpperCase() + a.substring(1) : a : '' }`] = 'true', (e = this.container) === null || e === void 0 || e.appendChild(n), n; | |
} | |
build() { | |
let t = this.instance.container, e = this.cn('container'), { | |
container: i, | |
prev: n, | |
next: s | |
} = this; | |
i || (i = t.querySelector('.' + e), this.isDom = !!i); | |
i || (i = document.createElement('div'), y(i, e), t.appendChild(i)); | |
this.container = i; | |
s || (s = i.querySelector('[data-carousel-next]')); | |
s || (s = this.addBtn('next')); | |
this.next = s; | |
n || (n = i.querySelector('[data-carousel-prev]')); | |
n || (n = this.addBtn('prev')); | |
this.prev = n; | |
} | |
cleanup() { | |
this.isDom || (this.prev && this.prev.remove(), this.next && this.next.remove(), this.container && this.container.remove()); | |
this.prev = null; | |
this.next = null; | |
this.container = null; | |
this.isDom = false; | |
} | |
attach() { | |
this.instance.on([ | |
'refresh', | |
'change' | |
], this.onRefresh); | |
} | |
detach() { | |
this.instance.off([ | |
'refresh', | |
'change' | |
], this.onRefresh); | |
this.cleanup(); | |
} | |
}; | |
Object.defineProperty(It, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
classes: { | |
container: 'f-carousel__nav', | |
button: 'f-button', | |
isNext: 'is-next', | |
isPrev: 'is-prev' | |
}, | |
nextTpl: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" tabindex="-1"><path d="M9 3l9 9-9 9"/></svg>', | |
prevTpl: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" tabindex="-1"><path d="M15 3l-9 9 9 9"/></svg>' | |
} | |
}); | |
var St = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'selectedIndex', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'target', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'nav', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
} | |
addAsTargetFor(t) { | |
this.target = this.instance; | |
this.nav = t; | |
this.attachEvents(); | |
} | |
addAsNavFor(t) { | |
this.nav = this.instance; | |
this.target = t; | |
this.attachEvents(); | |
} | |
attachEvents() { | |
let { | |
nav: t, | |
target: e | |
} = this; | |
t && e && (t.options.initialSlide = e.options.initialPage, t.state === w.Ready ? this.onNavReady(t) : t.on('ready', this.onNavReady), e.state === w.Ready ? this.onTargetReady(e) : e.on('ready', this.onTargetReady)); | |
} | |
onNavReady(t) { | |
t.on('createSlide', this.onNavCreateSlide); | |
t.on('Panzoom.click', this.onNavClick); | |
t.on('Panzoom.touchEnd', this.onNavTouch); | |
this.onTargetChange(); | |
} | |
onTargetReady(t) { | |
t.on('change', this.onTargetChange); | |
t.on('Panzoom.refresh', this.onTargetChange); | |
this.onTargetChange(); | |
} | |
onNavClick(t, e, i) { | |
this.onNavTouch(t, t.panzoom, i); | |
} | |
onNavTouch(t, e, i) { | |
var n, s; | |
if (Math.abs(e.dragOffset.x) > 3 || Math.abs(e.dragOffset.y) > 3) { | |
return; | |
} | |
let a = i.target, { | |
nav: r, | |
target: l | |
} = this; | |
if (!r || !l || !a) { | |
return; | |
} | |
let c = a.closest('[data-index]'); | |
if (i.stopPropagation(), i.preventDefault(), !c) { | |
return; | |
} | |
let d = parseInt(c.dataset.index || '', 10) || 0, u = l.getPageForSlide(d), m = r.getPageForSlide(d); | |
r.slideTo(m); | |
l.slideTo(u, { friction: ((s = (n = this.nav) === null || n === void 0 ? void 0 : n.plugins) === null || s === void 0 ? void 0 : s.Sync.option('friction')) || 0 }); | |
this.markSelectedSlide(d); | |
} | |
onNavCreateSlide(t, e) { | |
e.index === this.selectedIndex && this.markSelectedSlide(e.index); | |
} | |
onTargetChange() { | |
var t, e; | |
let { | |
target: i, | |
nav: n | |
} = this; | |
if (!i || !n || n.state !== w.Ready || i.state !== w.Ready) { | |
return; | |
} | |
let s = (e = (t = i.pages[i.page]) === null || t === void 0 ? void 0 : t.slides[0]) === null || e === void 0 ? void 0 : e.index, a = n.getPageForSlide(s); | |
this.markSelectedSlide(s); | |
n.slideTo(a, n.prevPage === null && i.prevPage === null ? { friction: 0 } : void 0); | |
} | |
markSelectedSlide(t) { | |
let e = this.nav; | |
e && e.state === w.Ready && (this.selectedIndex = t, [...e.slides].map(i => { | |
i.el && i.el.classList[i.index === t ? 'add' : 'remove']('is-nav-selected'); | |
})); | |
} | |
attach() { | |
let t = this, e = t.options.target, i = t.options.nav; | |
e ? t.addAsNavFor(e) : i && t.addAsTargetFor(i); | |
} | |
detach() { | |
let t = this, e = t.nav, i = t.target; | |
e && (e.off('ready', t.onNavReady), e.off('createSlide', t.onNavCreateSlide), e.off('Panzoom.click', t.onNavClick), e.off('Panzoom.touchEnd', t.onNavTouch)); | |
; | |
i && (i.off('ready', t.onTargetReady), i.off('refresh', t.onTargetChange), i.off('change', t.onTargetChange)); | |
; | |
} | |
}; | |
Object.defineProperty(St, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { friction: 0.35 } | |
}); | |
var Kn = { | |
Navigation: It, | |
Dots: Vt, | |
Sync: St | |
}, ct = class o extends Qt { | |
get axis() { | |
return this.isHorizontal ? 'e' : 'f'; | |
} | |
get isEnabled() { | |
return this.state === w.Ready; | |
} | |
get isInfinite() { | |
let t = false, { | |
contentDim: e, | |
viewportDim: i, | |
pages: n, | |
slides: s | |
} = this, a = s[0]; | |
return n.length >= 2 && a && e + a.dim >= i && (t = this.option('infinite')), t; | |
} | |
get isRTL() { | |
return this.option('direction') === 'rtl'; | |
} | |
get isHorizontal() { | |
return this.option('axis') === 'x'; | |
} | |
constructor(t, e = {}, i = {}) { | |
if (super(), Object.defineProperty(this, 'bp', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: '' | |
}), Object.defineProperty(this, 'lp', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'userOptions', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: {} | |
}), Object.defineProperty(this, 'userPlugins', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: {} | |
}), Object.defineProperty(this, 'state', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: w.Init | |
}), Object.defineProperty(this, 'page', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'prevPage', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'container', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}), Object.defineProperty(this, 'viewport', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'track', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'slides', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: [] | |
}), Object.defineProperty(this, 'pages', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: [] | |
}), Object.defineProperty(this, 'panzoom', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}), Object.defineProperty(this, 'inTransition', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: new Set() | |
}), Object.defineProperty(this, 'contentDim', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), Object.defineProperty(this, 'viewportDim', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}), typeof t == 'string' && (t = document.querySelector(t)), !t || !C(t)) { | |
throw new Error('No Element found'); | |
} | |
this.container = t; | |
this.slideNext = pi(this.slideNext.bind(this), 150); | |
this.slidePrev = pi(this.slidePrev.bind(this), 150); | |
this.userOptions = e; | |
this.userPlugins = i; | |
queueMicrotask(() => { | |
this.processOptions(); | |
}); | |
} | |
processOptions() { | |
var t, e; | |
let i = E({}, o.defaults, this.userOptions), n = '', s = i.breakpoints; | |
if (s && Ve(s)) { | |
for (let [a, r] of Object.entries(s)) | |
window.matchMedia(a).matches && Ve(r) && (n += a, E(i, r)); | |
} | |
n === this.bp && this.state !== w.Init || (this.bp = n, this.state === w.Ready && (i.initialSlide = ((e = (t = this.pages[this.page]) === null || t === void 0 ? void 0 : t.slides[0]) === null || e === void 0 ? void 0 : e.index) || 0), this.state !== w.Init && this.destroy(), super.setOptions(i), this.option('enabled') === false ? this.attachEvents() : setTimeout(() => { | |
this.init(); | |
}, 0)); | |
} | |
init() { | |
this.state = w.Init; | |
this.emit('init'); | |
this.attachPlugins(Object.assign(Object.assign({}, o.Plugins), this.userPlugins)); | |
this.emit('attachPlugins'); | |
this.initLayout(); | |
this.initSlides(); | |
this.updateMetrics(); | |
this.setInitialPosition(); | |
this.initPanzoom(); | |
this.attachEvents(); | |
this.state = w.Ready; | |
this.emit('ready'); | |
} | |
initLayout() { | |
let {container: t} = this, e = this.option('classes'); | |
y(t, this.cn('container')); | |
z(t, e.isLTR, !this.isRTL); | |
z(t, e.isRTL, this.isRTL); | |
z(t, e.isVertical, !this.isHorizontal); | |
z(t, e.isHorizontal, this.isHorizontal); | |
let i = this.option('viewport') || t.querySelector(`.${ e.viewport }`); | |
i || (i = document.createElement('div'), y(i, e.viewport), i.append(...fi(t, `.${ e.slide }`)), t.prepend(i)); | |
i.addEventListener('scroll', this.onScroll); | |
let n = this.option('track') || t.querySelector(`.${ e.track }`); | |
n || (n = document.createElement('div'), y(n, e.track), n.append(...Array.from(i.childNodes))); | |
n.setAttribute('aria-live', 'polite'); | |
i.contains(n) || i.prepend(n); | |
this.viewport = i; | |
this.track = n; | |
this.emit('initLayout'); | |
} | |
initSlides() { | |
let {track: t} = this; | |
if (!t) { | |
return; | |
} | |
let e = [...this.slides], i = []; | |
[...fi(t, `.${ this.cn('slide') }`)].forEach(n => { | |
if (C(n)) { | |
let s = we({ | |
el: n, | |
isDom: true, | |
index: this.slides.length | |
}); | |
i.push(s); | |
} | |
}); | |
for (let n of [ | |
...this.option('slides', []) || [], | |
...e | |
]) | |
i.push(we(n)); | |
this.slides = i; | |
for (let n = 0; n < this.slides.length; n++) { | |
this.slides[n].index = n; | |
} | |
for (let n of i) | |
this.emit('beforeInitSlide', n, n.index), this.emit('initSlide', n, n.index); | |
this.emit('initSlides'); | |
} | |
setInitialPage() { | |
let t = this.option('initialSlide'); | |
this.page = typeof t == 'number' ? this.getPageForSlide(t) : parseInt(this.option('initialPage', 0) + '', 10) || 0; | |
} | |
setInitialPosition() { | |
let { | |
track: t, | |
pages: e, | |
isHorizontal: i | |
} = this; | |
if (!t || !e.length) { | |
return; | |
} | |
let n = this.page; | |
e[n] || (this.page = n = 0); | |
let s = (e[n].pos || 0) * (this.isRTL && i ? 1 : -1), a = i ? `${ s }px` : '0', r = i ? '0' : `${ s }px`; | |
t.style.transform = `translate3d(${ a }, ${ r }, 0) scale(1)`; | |
this.option('adaptiveHeight') && this.setViewportHeight(); | |
} | |
initPanzoom() { | |
this.panzoom && (this.panzoom.destroy(), this.panzoom = null); | |
let t = this.option('Panzoom') || {}; | |
this.panzoom = new nt(this.viewport, E({}, { | |
content: this.track, | |
zoom: false, | |
panOnlyZoomed: false, | |
lockAxis: this.isHorizontal ? 'x' : 'y', | |
infinite: this.isInfinite, | |
click: false, | |
dblClick: false, | |
touch: e => !(this.pages.length < 2 && !e.options.infinite), | |
bounds: () => this.getBounds(), | |
maxVelocity: e => Math.abs(e.target[this.axis] - e.current[this.axis]) < 2 * this.viewportDim ? 100 : 0 | |
}, t)); | |
this.panzoom.on('*', (e, i, ...n) => { | |
this.emit(`Panzoom.${ i }`, e, ...n); | |
}); | |
this.panzoom.on('decel', this.onDecel); | |
this.panzoom.on('refresh', this.onRefresh); | |
this.panzoom.on('beforeTransform', this.onBeforeTransform); | |
this.panzoom.on('endAnimation', this.onEndAnimation); | |
} | |
attachEvents() { | |
let t = this.container; | |
t && (t.addEventListener('click', this.onClick, { | |
passive: false, | |
capture: false | |
}), t.addEventListener('slideTo', this.onSlideTo)); | |
window.addEventListener('resize', this.onResize); | |
} | |
createPages() { | |
let t = [], { | |
contentDim: e, | |
viewportDim: i | |
} = this, n = this.option('slidesPerPage'); | |
n = (n === 'auto' || e <= i) && this.option('fill') !== false ? 1e+400 : parseFloat(n + ''); | |
let s = 0, a = 0, r = 0; | |
for (let l of this.slides) | |
(!t.length || a + l.dim - i > 0.05 || r >= n) && (t.push(Pn()), s = t.length - 1, a = 0, r = 0), t[s].slides.push(l), a += l.dim + l.gap, r++; | |
return t; | |
} | |
processPages() { | |
let t = this.pages, { | |
contentDim: e, | |
viewportDim: i, | |
isInfinite: n | |
} = this, s = this.option('center'), a = this.option('fill'), r = a && s && e > i && !n; | |
if (t.forEach((d, u) => { | |
var m; | |
d.index = u; | |
d.pos = ((m = d.slides[0]) === null || m === void 0 ? void 0 : m.pos) || 0; | |
d.dim = 0; | |
for (let [h, b] of d.slides.entries()) | |
d.dim += b.dim, h < d.slides.length - 1 && (d.dim += b.gap); | |
r && d.pos + 0.5 * d.dim < 0.5 * i ? d.pos = 0 : r && d.pos + 0.5 * d.dim >= e - 0.5 * i ? d.pos = e - i : s && (d.pos += -0.5 * (i - d.dim)); | |
}), t.forEach(d => { | |
a && !n && e > i && (d.pos = Math.max(d.pos, 0), d.pos = Math.min(d.pos, e - i)); | |
d.pos = Q(d.pos, 1000); | |
d.dim = Q(d.dim, 1000); | |
Math.abs(d.pos) <= 0.1 && (d.pos = 0); | |
}), n) { | |
return t; | |
} | |
let l = [], c; | |
return t.forEach(d => { | |
let u = Object.assign({}, d); | |
c && u.pos === c.pos ? (c.dim += u.dim, c.slides = [ | |
...c.slides, | |
...u.slides | |
]) : (u.index = l.length, c = u, l.push(u)); | |
}), l; | |
} | |
getPageFromIndex(t = 0) { | |
let e = this.pages.length, i; | |
return t = parseInt((t || 0).toString()) || 0, i = this.isInfinite ? (t % e + e) % e : Math.max(Math.min(t, e - 1), 0), i; | |
} | |
getSlideMetrics(t) { | |
var e, i; | |
let n = this.isHorizontal ? 'width' : 'height', s = 0, a = 0, r = t.el, l = !(!r || r.parentNode); | |
if (r ? s = parseFloat(r.dataset[n] || '') || 0 : (r = document.createElement('div'), r.style.visibility = 'hidden', (this.track || document.body).prepend(r)), y(r, this.cn('slide') + ' ' + t.class + ' ' + t.customClass), s) { | |
r.style[n] = `${ s }px`; | |
r.style[n === 'width' ? 'height' : 'width'] = ''; | |
} else { | |
l && (this.track || document.body).prepend(r); | |
s = r.getBoundingClientRect()[n] * Math.max(1, ((e = window.visualViewport) === null || e === void 0 ? void 0 : e.scale) || 1); | |
let d = r[this.isHorizontal ? 'offsetWidth' : 'offsetHeight']; | |
d - 1 > s && (s = d); | |
} | |
let c = getComputedStyle(r); | |
return c.boxSizing === 'content-box' && (this.isHorizontal ? (s += parseFloat(c.paddingLeft) || 0, s += parseFloat(c.paddingRight) || 0) : (s += parseFloat(c.paddingTop) || 0, s += parseFloat(c.paddingBottom) || 0)), a = parseFloat(c[this.isHorizontal ? 'marginRight' : 'marginBottom']) || 0, l ? (i = r.parentElement) === null || i === void 0 || i.removeChild(r) : t.el || r.remove(), { | |
dim: Q(s, 1000), | |
gap: Q(a, 1000) | |
}; | |
} | |
getBounds() { | |
let { | |
isInfinite: t, | |
isRTL: e, | |
isHorizontal: i, | |
pages: n | |
} = this; | |
if (t) { | |
s = { | |
min: null, | |
max: null | |
}; | |
} else { | |
if (n.length) { | |
let a = n[0].pos, r = n[n.length - 1].pos; | |
s = e && i ? { | |
min: a, | |
max: r | |
} : { | |
min: -1 * r, | |
max: -1 * a | |
}; | |
} | |
} | |
return { | |
x: i ? s : { | |
min: 0, | |
max: 0 | |
}, | |
y: i ? { | |
min: 0, | |
max: 0 | |
} : s | |
}; | |
} | |
repositionSlides() { | |
let t, { | |
isHorizontal: e, | |
isRTL: i, | |
isInfinite: n, | |
viewport: s, | |
viewportDim: a, | |
contentDim: r, | |
page: l, | |
pages: c, | |
slides: d, | |
panzoom: u | |
} = this, m = 0, h = 0, b = 0, p = 0; | |
u ? p = -1 * u.current[this.axis] : c[l] && (p = c[l].pos || 0); | |
t = e ? i ? 'right' : 'left' : 'top'; | |
i && e && (p *= -1); | |
for (let v of d) { | |
let B = v.el; | |
B ? (t === 'top' ? (B.style.right = '', B.style.left = '') : B.style.top = '', v.index !== m ? B.style[t] = h === 0 ? '' : `${ Q(h, 1000) }px` : B.style[t] = '', b += v.dim + v.gap, m++) : h += v.dim + v.gap; | |
} | |
if (n && b && s) { | |
let v = getComputedStyle(s), k = e ? 'Right' : 'Bottom', X = parseFloat(v['padding' + (e ? 'Left' : 'Top')]); | |
p -= X; | |
a += X; | |
a += parseFloat(v['padding' + k]); | |
for (let L of d) | |
L.el && (Q(L.pos) < Q(a) && Q(L.pos + L.dim + L.gap) < Q(p) && Q(p) > Q(r - a) && (L.el.style[t] = `${ Q(h + b, 1000) }px`), Q(L.pos + L.gap) >= Q(r - a) && Q(L.pos) > Q(p + a) && Q(p) < Q(a) && (L.el.style[t] = `-${ Q(b, 1000) }px`)); | |
} | |
let f, g, F = [...this.inTransition]; | |
if (F.length > 1 && (f = c[F[0]], g = c[F[1]]), f && g) { | |
let v = 0; | |
for (let B of d) | |
B.el ? this.inTransition.has(B.index) && f.slides.indexOf(B) < 0 && (B.el.style[t] = `${ Q(v + (f.pos - g.pos), 1000) }px`) : v += B.dim + B.gap; | |
} | |
} | |
createSlideEl(t) { | |
let { | |
track: e, | |
slides: i | |
} = this; | |
if (!e || !t || t.el && t.el.parentNode) { | |
return; | |
} | |
let n = t.el || document.createElement('div'); | |
y(n, this.cn('slide')); | |
y(n, t.class); | |
y(n, t.customClass); | |
let s = t.html; | |
s && (s instanceof HTMLElement ? n.appendChild(s) : n.innerHTML = t.html + ''); | |
let a = []; | |
i.forEach((d, u) => { | |
d.el && a.push(u); | |
}); | |
let r = t.index, l = null; | |
a.length && (l = i[a.reduce((d, u) => Math.abs(u - r) < Math.abs(d - r) ? u : d)]); | |
let c = l && l.el && l.el.parentNode ? l.index < t.index ? l.el.nextSibling : l.el : null; | |
e.insertBefore(n, e.contains(c) ? c : null); | |
; | |
this.emit('createSlide', t); | |
} | |
removeSlideEl(t, e = false) { | |
let i = t?.el; | |
if (!i || !i.parentNode) { | |
return; | |
} | |
let n = this.cn('isSelected'); | |
if (i.classList.contains(n) && (x(i, n), this.emit('unselectSlide', t)), t.isDom && !e) { | |
return i.removeAttribute('aria-hidden'), i.removeAttribute('data-index'), void (i.style.left = ''); | |
} | |
this.emit('removeSlide', t); | |
let s = new CustomEvent('animationend'); | |
i.dispatchEvent(s); | |
t.el && (t.el.remove(), t.el = null); | |
} | |
transitionTo(t = 0, e = this.option('transition')) { | |
var i, n, s, a; | |
if (!e) { | |
return false; | |
} | |
let r = this.page, { | |
pages: l, | |
panzoom: c | |
} = this; | |
t = parseInt((t || 0).toString()) || 0; | |
let d = this.getPageFromIndex(t); | |
if (!c || !l[d] || l.length < 2 || Math.abs((((n = (i = l[r]) === null || i === void 0 ? void 0 : i.slides[0]) === null || n === void 0 ? void 0 : n.dim) || 0) - this.viewportDim) > 1) { | |
return false; | |
} | |
let u = t > r ? 1 : -1; | |
this.isInfinite && (r === 0 && t === l.length - 1 && (u = -1), r === l.length - 1 && t === 0 && (u = 1)); | |
let m = l[d].pos * (this.isRTL ? 1 : -1); | |
if (r === d && Math.abs(m - c.target[this.axis]) < 1) { | |
return false; | |
} | |
this.clearTransitions(); | |
let h = c.isResting; | |
y(this.container, this.cn('inTransition')); | |
let b = ((s = l[r]) === null || s === void 0 ? void 0 : s.slides[0]) || null, p = ((a = l[d]) === null || a === void 0 ? void 0 : a.slides[0]) || null; | |
this.inTransition.add(p.index); | |
this.createSlideEl(p); | |
let f = b.el, g = p.el; | |
h || e === 'slide' || (e = 'fadeFast', f = null); | |
let F = this.isRTL ? 'next' : 'prev', v = this.isRTL ? 'prev' : 'next'; | |
return f && (this.inTransition.add(b.index), b.transition = e, f.addEventListener('animationend', this.onAnimationEnd), f.classList.add(`f-${ e }Out`, `to-${ u > 0 ? v : F }`)), g && (p.transition = e, g.addEventListener('animationend', this.onAnimationEnd), g.classList.add(`f-${ e }In`, `from-${ u > 0 ? F : v }`)), c.current[this.axis] = m, c.target[this.axis] = m, c.requestTick(), this.onChange(d), true; | |
} | |
manageSlideVisiblity() { | |
let t = new Set(), e = new Set(), i = this.getVisibleSlides(parseFloat(this.option('preload', 0) + '') || 0); | |
for (let n of this.slides) | |
i.has(n) ? t.add(n) : e.add(n); | |
for (let n of this.inTransition) | |
t.add(this.slides[n]); | |
for (let n of t) | |
this.createSlideEl(n), this.lazyLoadSlide(n); | |
for (let n of e) | |
t.has(n) || this.removeSlideEl(n); | |
this.markSelectedSlides(); | |
this.repositionSlides(); | |
} | |
markSelectedSlides() { | |
if (!this.pages[this.page] || !this.pages[this.page].slides) { | |
return; | |
} | |
let e = this.cn('isSelected'); | |
if (e) { | |
for (let i of this.slides) { | |
let n = i.el; | |
n && (n.dataset.index = `${ i.index }`, n.classList.contains('f-thumbs__slide') ? this.getVisibleSlides(0).has(i) ? n.removeAttribute('aria-hidden') : n.setAttribute('aria-hidden', 'true') : this.pages[this.page].slides.includes(i) ? (n.classList.contains(e) || (y(n, e), this.emit('selectSlide', i)), n.removeAttribute('aria-hidden')) : (n.classList.contains(e) && (x(n, e), this.emit('unselectSlide', i)), n.setAttribute('aria-hidden', 'true'))); | |
} | |
} | |
} | |
flipInfiniteTrack() { | |
let { | |
axis: t, | |
isHorizontal: e, | |
isInfinite: i, | |
isRTL: n, | |
viewportDim: s, | |
contentDim: a | |
} = this, r = this.panzoom; | |
if (!r || !i) { | |
return; | |
} | |
let l = r.current[t], c = r.target[t] - l, d = 0, u = 0.5 * s; | |
n && e ? (l < -u && (d = -1, l += a), l > a - u && (d = 1, l -= a)) : (l > u && (d = 1, l -= a), l < -a + u && (d = -1, l += a)); | |
d && (r.current[t] = l, r.target[t] = l + c); | |
} | |
lazyLoadImg(t, e) { | |
let i = this, a = false, r = null, l = () => { | |
a || (a = true, r && (r.remove(), r = null), x(e, 'is-preloading'), e.complete && (y(e, 'f-fadeIn'), setTimeout(() => { | |
x(e, 'f-fadeIn'); | |
}, 350)), this.option('adaptiveHeight') && t.el && this.pages[this.page].slides.indexOf(t) > -1 && (i.updateMetrics(), i.setViewportHeight()), this.emit('load', t)); | |
}; | |
y(e, 'is-preloading'); | |
e.src = e.dataset.lazySrcset || e.dataset.lazySrc || ''; | |
delete e.dataset.lazySrc; | |
delete e.dataset.lazySrcset; | |
e.addEventListener('error', () => { | |
l(); | |
}); | |
e.addEventListener('load', () => { | |
l(); | |
}); | |
setTimeout(() => { | |
let c = e.parentNode; | |
c && t.el && (e.complete ? l() : a || (r = S(ze), c.insertBefore(r, e))); | |
}, 300); | |
} | |
lazyLoadSlide(t) { | |
let e = t && t.el; | |
if (!e) { | |
return; | |
} | |
let i = new Set(), n = Array.from(e.querySelectorAll('[data-lazy-src],[data-lazy-srcset]')); | |
e.dataset.lazySrc && n.push(e); | |
n.map(s => { | |
s instanceof HTMLImageElement ? i.add(s) : s instanceof HTMLElement && s.dataset.lazySrc && (s.style.backgroundImage = `url('${ s.dataset.lazySrc }')`, delete s.dataset.lazySrc); | |
}); | |
for (let s of i) | |
this.lazyLoadImg(t, s); | |
} | |
onAnimationEnd(t) { | |
var e; | |
let i = t.target, n = i ? parseInt(i.dataset.index || '', 10) || 0 : -1, s = this.slides[n], a = t.animationName; | |
if (!i || !s || !a) { | |
return; | |
} | |
let r = !!this.inTransition.has(n) && s.transition; | |
r && a.substring(0, r.length + 2) === `f-${ r }` && this.inTransition.delete(n); | |
this.inTransition.size || this.clearTransitions(); | |
n === this.page && (!((e = this.panzoom) === null || e === void 0) && e.isResting) && this.emit('settle'); | |
} | |
onDecel(t, e = 0, i = 0, n = 0, s = 0) { | |
if (this.option('dragFree')) { | |
return void this.setPageFromPosition(); | |
} | |
let { | |
isRTL: a, | |
isHorizontal: r, | |
axis: l, | |
pages: c | |
} = this, d = c.length, u = Math.abs(Math.atan2(i, e) / (Math.PI / 180)), m = 0; | |
if (m = u > 45 && u < 135 ? r ? 0 : i : r ? e : 0, !d) { | |
return; | |
} | |
let h = this.page, b = a && r ? 1 : -1, p = t.current[l] * b, {pageIndex: f} = this.getPageFromPosition(p); | |
Math.abs(m) > 5 ? (c[h].dim < document.documentElement['client' + (this.isHorizontal ? 'Width' : 'Height')] - 1 && (h = f), h = a && r ? m < 0 ? h - 1 : h + 1 : m < 0 ? h + 1 : h - 1) : h = n === 0 && s === 0 ? h : f; | |
this.slideTo(h, { | |
transition: false, | |
friction: t.option('decelFriction') | |
}); | |
} | |
onClick(t) { | |
let e = t.target, i = e && C(e) ? e.dataset : null, n, s; | |
i && (i.carouselPage !== void 0 ? (s = 'slideTo', n = i.carouselPage) : i.carouselNext !== void 0 ? s = 'slideNext' : i.carouselPrev !== void 0 && (s = 'slidePrev')); | |
s ? (t.preventDefault(), t.stopPropagation(), e && !e.hasAttribute('disabled') && this[s](n)) : this.emit('click', t); | |
} | |
onSlideTo(t) { | |
let e = t.detail || 0; | |
this.slideTo(this.getPageForSlide(e), { friction: 0 }); | |
} | |
onChange(t, e = 0) { | |
let i = this.page; | |
this.prevPage = i; | |
this.page = t; | |
this.option('adaptiveHeight') && this.setViewportHeight(); | |
t !== i && (this.markSelectedSlides(), this.emit('change', t, i, e)); | |
} | |
onRefresh() { | |
let t = this.contentDim, e = this.viewportDim; | |
this.updateMetrics(); | |
this.contentDim === t && this.viewportDim === e || this.slideTo(this.page, { | |
friction: 0, | |
transition: false | |
}); | |
} | |
onScroll() { | |
var t; | |
(t = this.viewport) === null || t === void 0 || t.scroll(0, 0); | |
} | |
onResize() { | |
this.option('breakpoints') && this.processOptions(); | |
} | |
onBeforeTransform(t) { | |
this.lp !== t.current[this.axis] && (this.flipInfiniteTrack(), this.manageSlideVisiblity()); | |
this.lp = t.current.e; | |
} | |
onEndAnimation() { | |
this.inTransition.size || this.emit('settle'); | |
} | |
reInit(t = null, e = null) { | |
this.destroy(); | |
this.state = w.Init; | |
this.prevPage = null; | |
this.userOptions = t || this.userOptions; | |
this.userPlugins = e || this.userPlugins; | |
this.processOptions(); | |
} | |
slideTo(t = 0, { | |
friction: e = this.option('friction'), | |
transition: i = this.option('transition') | |
} = {}) { | |
if (this.state === w.Destroy) { | |
return; | |
} | |
t = parseInt((t || 0).toString()) || 0; | |
let n = this.getPageFromIndex(t), { | |
axis: s, | |
isHorizontal: a, | |
isRTL: r, | |
pages: l, | |
panzoom: c | |
} = this, d = l.length, u = r && a ? 1 : -1; | |
if (!c || !d) { | |
return; | |
} | |
if (this.page !== n) { | |
let h = new Event('beforeChange', { | |
bubbles: true, | |
cancelable: true | |
}); | |
if (this.emit('beforeChange', h, t), h.defaultPrevented) { | |
return; | |
} | |
} | |
if (this.transitionTo(t, i)) { | |
return; | |
} | |
let m = l[n].pos; | |
if (this.isInfinite) { | |
let h = this.contentDim, b = c.target[s] * u; | |
d === 2 ? m += h * Math.floor(parseFloat(t + '') / 2) : m = [ | |
m, | |
m - h, | |
m + h | |
].reduce(function (p, f) { | |
return Math.abs(f - b) < Math.abs(p - b) ? f : p; | |
}); | |
} | |
m *= u; | |
Math.abs(c.target[s] - m) < 1 || (c.panTo({ | |
x: a ? m : 0, | |
y: a ? 0 : m, | |
friction: e | |
}), this.onChange(n)); | |
} | |
slideToClosest(t) { | |
if (this.panzoom) { | |
let {pageIndex: e} = this.getPageFromPosition(); | |
this.slideTo(e, t); | |
} | |
} | |
slideNext() { | |
this.slideTo(this.page + 1); | |
} | |
slidePrev() { | |
this.slideTo(this.page - 1); | |
} | |
clearTransitions() { | |
this.inTransition.clear(); | |
x(this.container, this.cn('inTransition')); | |
let t = [ | |
'to-prev', | |
'to-next', | |
'from-prev', | |
'from-next' | |
]; | |
for (let e of this.slides) { | |
let i = e.el; | |
if (i) { | |
i.removeEventListener('animationend', this.onAnimationEnd); | |
i.classList.remove(...t); | |
let n = e.transition; | |
n && i.classList.remove(`f-${ n }Out`, `f-${ n }In`); | |
} | |
} | |
this.manageSlideVisiblity(); | |
} | |
addSlide(t, e) { | |
var i, n, s, a; | |
let r = this.panzoom, l = ((i = this.pages[this.page]) === null || i === void 0 ? void 0 : i.pos) || 0, c = ((n = this.pages[this.page]) === null || n === void 0 ? void 0 : n.dim) || 0, d = this.contentDim < this.viewportDim, u = Array.isArray(e) ? e : [e], m = []; | |
for (let h of u) | |
m.push(we(h)); | |
this.slides.splice(t, 0, ...m); | |
for (let h = 0; h < this.slides.length; h++) { | |
this.slides[h].index = h; | |
} | |
for (let h of m) | |
this.emit('beforeInitSlide', h, h.index); | |
if (this.page >= t && (this.page += m.length), this.updateMetrics(), r) { | |
let h = ((s = this.pages[this.page]) === null || s === void 0 ? void 0 : s.pos) || 0, b = ((a = this.pages[this.page]) === null || a === void 0 ? void 0 : a.dim) || 0, p = this.pages.length || 1, f = this.isRTL ? c - b : b - c, g = this.isRTL ? l - h : h - l; | |
d && p === 1 ? (t <= this.page && (r.current[this.axis] -= f, r.target[this.axis] -= f), r.panTo({ [this.isHorizontal ? 'x' : 'y']: -1 * h })) : g && t <= this.page && (r.target[this.axis] -= g, r.current[this.axis] -= g, r.requestTick()); | |
} | |
for (let h of m) | |
this.emit('initSlide', h, h.index); | |
} | |
prependSlide(t) { | |
this.addSlide(0, t); | |
} | |
appendSlide(t) { | |
this.addSlide(this.slides.length, t); | |
} | |
removeSlide(t) { | |
let e = this.slides.length; | |
t = (t % e + e) % e; | |
let i = this.slides[t]; | |
if (i) { | |
this.removeSlideEl(i, true); | |
this.slides.splice(t, 1); | |
for (let n = 0; n < this.slides.length; n++) { | |
this.slides[n].index = n; | |
} | |
this.updateMetrics(); | |
this.slideTo(this.page, { | |
friction: 0, | |
transition: false | |
}); | |
this.emit('destroySlide', i); | |
} | |
} | |
updateMetrics() { | |
let { | |
panzoom: t, | |
viewport: e, | |
track: i, | |
slides: n, | |
isHorizontal: s, | |
isInfinite: a | |
} = this; | |
if (!i) { | |
return; | |
} | |
let r = s ? 'width' : 'height', l = s ? 'offsetWidth' : 'offsetHeight'; | |
if (e) { | |
let u = Math.max(e[l], Q(e.getBoundingClientRect()[r], 1000)), m = getComputedStyle(e), b = s ? 'Right' : 'Bottom'; | |
u -= parseFloat(m['padding' + (s ? 'Left' : 'Top')]) + parseFloat(m['padding' + b]); | |
this.viewportDim = u; | |
} | |
let c, d = 0; | |
for (let [u, m] of n.entries()) { | |
let h = 0, b = 0; | |
!m.el && c ? (h = c.dim, b = c.gap) : ({ | |
dim: h, | |
gap: b | |
} = this.getSlideMetrics(m), c = m); | |
h = Q(h, 1000); | |
b = Q(b, 1000); | |
m.dim = h; | |
m.gap = b; | |
m.pos = d; | |
d += h; | |
(a || u < n.length - 1) && (d += b); | |
} | |
d = Q(d, 1000); | |
this.contentDim = d; | |
t && (t.contentRect[r] = d, t.contentRect[s ? 'fullWidth' : 'fullHeight'] = d); | |
this.pages = this.createPages(); | |
this.pages = this.processPages(); | |
this.state === w.Init && this.setInitialPage(); | |
this.page = Math.max(0, Math.min(this.page, this.pages.length - 1)); | |
this.manageSlideVisiblity(); | |
this.emit('refresh'); | |
} | |
getProgress(t, e = false, i = false) { | |
t === void 0 && (t = this.page); | |
let n = this, s = n.panzoom, a = n.contentDim, r = n.pages[t] || 0; | |
if (!r || !s) { | |
return t > this.page ? -1 : 1; | |
} | |
let l = -1 * s.current.e, c = Q((l - r.pos) / (1 * r.dim), 1000), d = c, u = c; | |
this.isInfinite && i !== true && (d = Q((l - r.pos + a) / (1 * r.dim), 1000), u = Q((l - r.pos - a) / (1 * r.dim), 1000)); | |
let m = [ | |
c, | |
d, | |
u | |
].reduce(function (h, b) { | |
return Math.abs(b) < Math.abs(h) ? b : h; | |
}); | |
return e ? m : m > 1 ? 1 : m < -1 ? -1 : m; | |
} | |
setViewportHeight() { | |
let { | |
page: t, | |
pages: e, | |
viewport: i, | |
isHorizontal: n | |
} = this; | |
if (!i || !e[t]) { | |
return; | |
} | |
let s = 0; | |
n && this.track && (this.track.style.height = 'auto', e[t].slides.forEach(a => { | |
a.el && (s = Math.max(s, a.el.offsetHeight)); | |
})); | |
i.style.height = s ? `${ s }px` : ''; | |
} | |
getPageForSlide(t) { | |
for (let e of this.pages) | |
for (let i of e.slides) | |
if (i.index === t) { | |
return e.index; | |
} | |
return -1; | |
} | |
getVisibleSlides(t = 0) { | |
var e; | |
let i = new Set(), { | |
panzoom: n, | |
contentDim: s, | |
viewportDim: a, | |
pages: r, | |
page: l | |
} = this; | |
if (a) { | |
s = s + ((e = this.slides[this.slides.length - 1]) === null || e === void 0 ? void 0 : e.gap) || 0; | |
let c = 0; | |
c = n && n.state !== U.Init && n.state !== U.Destroy ? -1 * n.current[this.axis] : r[l] && r[l].pos || 0; | |
this.isInfinite && (c -= Math.floor(c / s) * s); | |
this.isRTL && this.isHorizontal && (c *= -1); | |
let d = c - a * t, u = c + a * (t + 1), m = this.isInfinite ? [ | |
-1, | |
0, | |
1 | |
] : [0]; | |
for (let h of this.slides) | |
for (let b of m) { | |
let p = h.pos + b * s, f = p + h.dim + h.gap; | |
p < u && f > d && i.add(h); | |
} | |
} | |
return i; | |
} | |
getPageFromPosition(t) { | |
let { | |
viewportDim: e, | |
contentDim: i, | |
slides: n, | |
pages: s, | |
panzoom: a | |
} = this, r = s.length, l = n.length, c = n[0], d = n[l - 1], u = this.option('center'), m = 0, h = 0, b = 0, p = t === void 0 ? -1 * (a?.target[this.axis] || 0) : t; | |
u && (p += 0.5 * e); | |
this.isInfinite ? (p < c.pos - 0.5 * d.gap && (p -= i, b = -1), p > d.pos + d.dim + 0.5 * d.gap && (p -= i, b = 1)) : p = Math.max(c.pos || 0, Math.min(p, d.pos)); | |
let f = d, g = n.find(F => { | |
let v = F.pos - 0.5 * f.gap, B = F.pos + F.dim + 0.5 * F.gap; | |
return f = F, p >= v && p < B; | |
}); | |
return g || (g = d), h = this.getPageForSlide(g.index), m = h + b * r, { | |
page: m, | |
pageIndex: h | |
}; | |
} | |
setPageFromPosition() { | |
let {pageIndex: t} = this.getPageFromPosition(); | |
this.onChange(t); | |
} | |
destroy() { | |
if ([w.Destroy].includes(this.state)) { | |
return; | |
} | |
this.state = w.Destroy; | |
let { | |
container: t, | |
viewport: e, | |
track: i, | |
slides: n, | |
panzoom: s | |
} = this, a = this.option('classes'); | |
t.removeEventListener('click', this.onClick, { | |
passive: false, | |
capture: false | |
}); | |
t.removeEventListener('slideTo', this.onSlideTo); | |
window.removeEventListener('resize', this.onResize); | |
s && (s.destroy(), this.panzoom = null); | |
n && n.forEach(l => { | |
this.removeSlideEl(l); | |
}); | |
this.detachPlugins(); | |
e && (e.removeEventListener('scroll', this.onScroll), e.offsetParent && i && i.offsetParent && e.replaceWith(...i.childNodes)); | |
for (let [l, c] of Object.entries(a)) | |
l !== 'container' && c && t.classList.remove(c); | |
this.track = null; | |
this.viewport = null; | |
this.page = 0; | |
this.slides = []; | |
let r = this.events.get('ready'); | |
this.events = new Map(); | |
r && this.events.set('ready', r); | |
} | |
}; | |
Object.defineProperty(ct, 'Panzoom', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: nt | |
}); | |
Object.defineProperty(ct, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: Hn | |
}); | |
Object.defineProperty(ct, 'Plugins', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: Kn | |
}); | |
var Gi = function (o) { | |
if (!C(o)) { | |
return 0; | |
} | |
let t = window.scrollY, e = window.innerHeight, i = t + e, n = o.getBoundingClientRect(), s = n.y + t, a = n.height, r = s + a; | |
if (t > r || i < s) { | |
return 0; | |
} | |
if (t < s && i > r || s < t && r > i) { | |
return 100; | |
} | |
let l = a; | |
s < t && (l -= t - s); | |
r > i && (l -= r - i); | |
let c = l / e * 100; | |
return Math.round(c); | |
}, gt = !(typeof window > 'u' || !window.document || !window.document.createElement), Ae, We = [ | |
'a[href]', | |
'area[href]', | |
'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', | |
'select:not([disabled]):not([aria-hidden])', | |
'textarea:not([disabled]):not([aria-hidden])', | |
'button:not([disabled]):not([aria-hidden]):not(.fancybox-focus-guard)', | |
'iframe', | |
'object', | |
'embed', | |
'video', | |
'audio', | |
'[contenteditable]', | |
'[tabindex]:not([tabindex^="-"]):not([disabled]):not([aria-hidden])' | |
].join(','), Fi = o => { | |
if (o && gt) { | |
Ae === void 0 && document.createElement('div').focus({ | |
get preventScroll() { | |
return Ae = true, false; | |
} | |
}); | |
try { | |
if (Ae) { | |
o.focus({ preventScroll: true }); | |
} else { | |
let t = window.scrollY || document.body.scrollTop, e = window.scrollX || document.body.scrollLeft; | |
o.focus(); | |
document.body.scrollTo({ | |
top: t, | |
left: e, | |
behavior: 'auto' | |
}); | |
} | |
} catch { | |
} | |
} | |
}, Vi = () => { | |
let o = document, t, e = '', i = '', n = ''; | |
return o.fullscreenEnabled ? (e = 'requestFullscreen', i = 'exitFullscreen', n = 'fullscreenElement') : o.webkitFullscreenEnabled && (e = 'webkitRequestFullscreen', i = 'webkitExitFullscreen', n = 'webkitFullscreenElement'), e && (t = { | |
request: function (s = o.documentElement) { | |
return e === 'webkitRequestFullscreen' ? s[e](Element.ALLOW_KEYBOARD_INPUT) : s[e](); | |
}, | |
exit: function () { | |
return o[n] && o[i](); | |
}, | |
isFullscreen: function () { | |
return o[n]; | |
} | |
}), t; | |
}, Ie = { | |
animated: true, | |
autoFocus: true, | |
backdropClick: 'close', | |
Carousel: { | |
classes: { | |
container: 'fancybox__carousel', | |
viewport: 'fancybox__viewport', | |
track: 'fancybox__track', | |
slide: 'fancybox__slide' | |
} | |
}, | |
closeButton: 'auto', | |
closeExisting: false, | |
commonCaption: false, | |
compact: () => window.matchMedia('(max-width: 578px), (max-height: 578px)').matches, | |
contentClick: 'toggleZoom', | |
contentDblClick: false, | |
defaultType: 'image', | |
defaultDisplay: 'flex', | |
dragToClose: true, | |
Fullscreen: { autoStart: false }, | |
groupAll: false, | |
groupAttr: 'data-fancybox', | |
hideClass: 'f-fadeOut', | |
hideScrollbar: true, | |
idle: 3500, | |
keyboard: { | |
Escape: 'close', | |
Delete: 'close', | |
Backspace: 'close', | |
PageUp: 'next', | |
PageDown: 'prev', | |
ArrowUp: 'prev', | |
ArrowDown: 'next', | |
ArrowRight: 'next', | |
ArrowLeft: 'prev' | |
}, | |
l10n: Object.assign(Object.assign({}, Xi), { | |
CLOSE: 'Close', | |
NEXT: 'Next', | |
PREV: 'Previous', | |
MODAL: 'You can close this modal content with the ESC key', | |
ERROR: 'Something Went Wrong, Please Try Again Later', | |
IMAGE_ERROR: 'Image Not Found', | |
ELEMENT_NOT_FOUND: 'HTML Element Not Found', | |
AJAX_NOT_FOUND: 'Error Loading AJAX : Not Found', | |
AJAX_FORBIDDEN: 'Error Loading AJAX : Forbidden', | |
IFRAME_ERROR: 'Error Loading Page', | |
TOGGLE_ZOOM: 'Toggle zoom level', | |
TOGGLE_THUMBS: 'Toggle thumbnails', | |
TOGGLE_SLIDESHOW: 'Toggle slideshow', | |
TOGGLE_FULLSCREEN: 'Toggle full-screen mode', | |
DOWNLOAD: 'Download' | |
}), | |
parentEl: null, | |
placeFocusBack: true, | |
showClass: 'f-zoomInUp', | |
startIndex: 0, | |
tpl: { | |
closeButton: '<button data-fancybox-close class="f-button is-close-btn" title="{{CLOSE}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" tabindex="-1"><path d="M20 20L4 4m16 0L4 20"/></svg></button>', | |
main: `<div class="fancybox__container" role="dialog" aria-modal="true" aria-label="{{MODAL}}" tabindex="-1"> | |
<div class="fancybox__backdrop"></div> | |
<div class="fancybox__carousel"></div> | |
<div class="fancybox__footer"></div> | |
</div>` | |
}, | |
trapFocus: true, | |
wheel: 'zoom' | |
}, A, Z; | |
(function (o) { | |
o[o.Init = 0] = 'Init'; | |
o[o.Ready = 1] = 'Ready'; | |
o[o.Closing = 2] = 'Closing'; | |
o[o.CustomClosing = 3] = 'CustomClosing'; | |
o[o.Destroy = 4] = 'Destroy'; | |
}(A || (A = {}))); | |
(function (o) { | |
o[o.Loading = 0] = 'Loading'; | |
o[o.Opening = 1] = 'Opening'; | |
o[o.Ready = 2] = 'Ready'; | |
o[o.Closing = 3] = 'Closing'; | |
}(Z || (Z = {}))); | |
var yi = '', ft = false, Yt = false, et = null, Ii = () => { | |
let o = '', t = '', e = M.getInstance(); | |
if (e) { | |
let i = e.carousel, n = e.getSlide(); | |
if (i && n) { | |
let s = n.slug || void 0, a = n.triggerEl || void 0; | |
t = s || e.option('slug') || ''; | |
!t && a && a.dataset && (t = a.dataset.fancybox || ''); | |
t && t !== 'true' && (o = '#' + t + (!s && i.slides.length > 1 ? '-' + (n.index + 1) : '')); | |
} | |
} | |
return { | |
hash: o, | |
slug: t, | |
index: 1 | |
}; | |
}, zt = () => { | |
let o = new URL(document.URL).hash, t = o.slice(1).split('-'), e = t[t.length - 1], i = e && /^\+?\d+$/.test(e) && parseInt(t.pop() || '1', 10) || 1; | |
return { | |
hash: o, | |
slug: t.join('-'), | |
index: i | |
}; | |
}, Si = () => { | |
let { | |
slug: o, | |
index: t | |
} = zt(); | |
if (!o) { | |
return; | |
} | |
let e = document.querySelector(`[data-slug="${ o }"]`); | |
if (e && e.dispatchEvent(new CustomEvent('click', { | |
bubbles: true, | |
cancelable: true | |
})), M.getInstance()) { | |
return; | |
} | |
let i = document.querySelectorAll(`[data-fancybox="${ o }"]`); | |
i.length && (e = i[t - 1], e && e.dispatchEvent(new CustomEvent('click', { | |
bubbles: true, | |
cancelable: true | |
}))); | |
}, zi = () => { | |
if (M.defaults.Hash === false) { | |
return; | |
} | |
let o = M.getInstance(); | |
if (o?.options.Hash === false) { | |
return; | |
} | |
let { | |
slug: t, | |
index: e | |
} = zt(), {slug: i} = Ii(); | |
o && (t === i ? o.jumpTo(e - 1) : (ft = true, o.close())); | |
Si(); | |
}, Ti = () => { | |
et && clearTimeout(et); | |
queueMicrotask(() => { | |
zi(); | |
}); | |
}, vi = () => { | |
window.addEventListener('hashchange', Ti, false); | |
setTimeout(() => { | |
zi(); | |
}, 500); | |
}; | |
gt && (/complete|interactive|loaded/.test(document.readyState) ? vi() : document.addEventListener('DOMContentLoaded', vi)); | |
var Tt = class extends D { | |
onCreateSlide(t, e, i) { | |
let n = this.instance.optionFor(i, 'src') || ''; | |
i.el && i.type === 'image' && typeof n == 'string' && this.setImage(i, n); | |
} | |
onRemoveSlide(t, e, i) { | |
i.panzoom && i.panzoom.destroy(); | |
i.panzoom = void 0; | |
i.imageEl = void 0; | |
} | |
onChange(t, e, i, n) { | |
x(this.instance.container, 'is-zooming-in'); | |
for (let s of e.slides) { | |
let a = s.panzoom; | |
a && s.index !== i && a.reset(0.35); | |
} | |
} | |
onClose() { | |
var t; | |
let e = this.instance, i = e.container, n = e.getSlide(); | |
if (!i || !i.parentElement || !n) { | |
return; | |
} | |
let { | |
el: s, | |
contentEl: a, | |
panzoom: r, | |
thumbElSrc: l | |
} = n; | |
if (!s || !l || !a || !r || r.isContentLoading || r.state === U.Init || r.state === U.Destroy) { | |
return; | |
} | |
r.updateMetrics(); | |
let c = this.getZoomInfo(n); | |
if (!c) { | |
return; | |
} | |
this.instance.state = A.CustomClosing; | |
i.classList.remove('is-zooming-in'); | |
i.classList.add('is-zooming-out'); | |
a.style.backgroundImage = `url('${ l }')`; | |
let d = i.getBoundingClientRect(); | |
(((t = window.visualViewport) === null || t === void 0 ? void 0 : t.scale) || 1) === 1 && Object.assign(i.style, { | |
position: 'absolute', | |
top: `${ i.offsetTop + window.scrollY }px`, | |
left: `${ i.offsetLeft + window.scrollX }px`, | |
bottom: 'auto', | |
right: 'auto', | |
width: `${ d.width }px`, | |
height: `${ d.height }px`, | |
overflow: 'hidden' | |
}); | |
let { | |
x: u, | |
y: m, | |
scale: h, | |
opacity: b | |
} = c; | |
if (b) { | |
let p = ((f, g, F, v) => { | |
let B = g - f, k = v - F; | |
return X => F + ((X - f) / B * k || 0); | |
})(r.scale, h, 1, 0); | |
r.on('afterTransform', () => { | |
a.style.opacity = p(r.scale) + ''; | |
}); | |
} | |
r.on('endAnimation', () => { | |
e.destroy(); | |
}); | |
r.target.a = h; | |
r.target.b = 0; | |
r.target.c = 0; | |
r.target.d = h; | |
r.panTo({ | |
x: u, | |
y: m, | |
scale: h, | |
friction: b ? 0.2 : 0.33, | |
ignoreBounds: true | |
}); | |
r.isResting && e.destroy(); | |
} | |
setImage(t, e) { | |
let i = this.instance; | |
; | |
this.process(t, e).then(n => { | |
let { | |
contentEl: s, | |
imageEl: a, | |
thumbElSrc: r, | |
el: l | |
} = t; | |
if (i.isClosing() || !s || !a) { | |
return; | |
} | |
s.offsetHeight; | |
let c = !!i.isOpeningSlide(t) && this.getZoomInfo(t); | |
if (this.option('protected') && l) { | |
l.addEventListener('contextmenu', m => { | |
m.preventDefault(); | |
}); | |
let u = document.createElement('div'); | |
y(u, 'fancybox-protected'); | |
s.appendChild(u); | |
} | |
if (r && c) { | |
let u = n.contentRect, m = Math.max(u.fullWidth, u.fullHeight), h = null; | |
!c.opacity && m > 1200 && (h = document.createElement('img'), y(h, 'fancybox-ghost'), h.src = r, s.appendChild(h)); | |
let b = () => { | |
h && (y(h, 'f-fadeFastOut'), setTimeout(() => { | |
h && (h.remove(), h = null); | |
}, 200)); | |
}; | |
(d = r, new Promise((p, f) => { | |
let g = new Image(); | |
g.onload = p; | |
g.onerror = f; | |
g.src = d; | |
})).then(() => { | |
i.hideLoading(t); | |
; | |
this.instance.emit('reveal', t); | |
this.zoomIn(t).then(() => { | |
b(); | |
this.instance.done(t); | |
}, () => { | |
}); | |
h && setTimeout(() => { | |
b(); | |
}, m > 2500 ? 800 : 200); | |
}, () => { | |
i.hideLoading(t); | |
i.revealContent(t); | |
}); | |
} else { | |
let u = this.optionFor(t, 'initialSize'), m = this.optionFor(t, 'zoom'), h = { | |
event: i.prevMouseMoveEvent || i.options.event, | |
friction: m ? 0.12 : 0 | |
}, b = i.optionFor(t, 'showClass') || void 0, p = true; | |
i.isOpeningSlide(t) && (u === 'full' ? n.zoomToFull(h) : u === 'cover' ? n.zoomToCover(h) : u === 'max' ? n.zoomToMax(h) : p = false, n.stop('current')); | |
p && b && (b = n.isDragging ? 'f-fadeIn' : ''); | |
i.hideLoading(t); | |
i.revealContent(t, b); | |
} | |
var d; | |
}, () => { | |
i.setError(t, '{{IMAGE_ERROR}}'); | |
}); | |
} | |
process(t, e) { | |
return new Promise((i, n) => { | |
var s; | |
let a = this.instance, r = t.el; | |
a.clearContent(t); | |
a.showLoading(t); | |
let l = this.optionFor(t, 'content'); | |
if (typeof l == 'string' && (l = S(l)), !l || !C(l)) { | |
if (l = document.createElement('img'), l instanceof HTMLImageElement) { | |
let c = '', d = t.caption; | |
c = typeof d == 'string' && d ? d.replace(/<[^>]+>/gi, '').substring(0, 1000) : `Image ${ t.index + 1 } of ${ ((s = a.carousel) === null || s === void 0 ? void 0 : s.pages.length) || 1 }`; | |
l.src = e || ''; | |
l.alt = c; | |
l.draggable = false; | |
t.srcset && l.setAttribute('srcset', t.srcset); | |
this.instance.isOpeningSlide(t) && (l.fetchPriority = 'high'); | |
} | |
t.sizes && l.setAttribute('sizes', t.sizes); | |
} | |
y(l, 'fancybox-image'); | |
; | |
a.setContent(t, l, false); | |
; | |
}); | |
} | |
zoomIn(t) { | |
return new Promise((e, i) => { | |
let n = this.instance, s = n.container, { | |
panzoom: a, | |
contentEl: r, | |
el: l | |
} = t; | |
a && a.updateMetrics(); | |
let c = this.getZoomInfo(t); | |
if (!(c && l && r && a && s)) { | |
return void i(); | |
} | |
let { | |
x: d, | |
y: u, | |
scale: m, | |
opacity: h | |
} = c, b = () => { | |
t.state !== Z.Closing && (h && (r.style.opacity = Math.max(Math.min(1, 1 - (1 - a.scale) / (1 - m)), 0) + ''), a.scale >= 1 && a.scale > a.targetScale - 0.1 && e(a)); | |
}, p = F => { | |
(F.scale < 0.99 || F.scale > 1.01) && !F.isDragging || (x(s, 'is-zooming-in'), r.style.opacity = '', F.off('endAnimation', p), F.off('touchStart', p), F.off('afterTransform', b), e(F)); | |
}; | |
a.on('endAnimation', p); | |
a.on('touchStart', p); | |
a.on('afterTransform', b); | |
a.on([ | |
'error', | |
'destroy' | |
], () => { | |
i(); | |
}); | |
a.panTo({ | |
x: d, | |
y: u, | |
scale: m, | |
friction: 0, | |
ignoreBounds: true | |
}); | |
a.stop('current'); | |
let f = { event: a.panMode === 'mousemove' ? n.prevMouseMoveEvent || n.options.event : void 0 }, g = this.optionFor(t, 'initialSize'); | |
y(s, 'is-zooming-in'); | |
n.hideLoading(t); | |
g === 'full' ? a.zoomToFull(f) : g === 'cover' ? a.zoomToCover(f) : g === 'max' ? a.zoomToMax(f) : a.reset(0.172); | |
}); | |
} | |
getZoomInfo(t) { | |
let { | |
el: e, | |
imageEl: i, | |
thumbEl: n, | |
panzoom: s | |
} = t, a = this.instance, r = a.container; | |
if (!e || !i || !n || !s || Gi(n) < 3 || !this.optionFor(t, 'zoom') || !r || a.state === A.Destroy || getComputedStyle(r).getPropertyValue('--f-images-zoom') === '0') { | |
return false; | |
} | |
let l = window.visualViewport || null; | |
if ((l ? l.scale : 1) !== 1) { | |
return false; | |
} | |
let { | |
top: c, | |
left: d, | |
width: u, | |
height: m | |
} = n.getBoundingClientRect(), { | |
top: h, | |
left: b, | |
fitWidth: p, | |
fitHeight: f | |
} = s.contentRect; | |
if (!(u && m && p && f)) { | |
return false; | |
} | |
let g = s.container.getBoundingClientRect(); | |
b += g.left; | |
h += g.top; | |
let F = -1 * (b + 0.5 * p - (d + 0.5 * u)), v = -1 * (h + 0.5 * f - (c + 0.5 * m)), B = u / p, k = this.option('zoomOpacity') || false; | |
return k === 'auto' && (k = Math.abs(u / m - p / f) > 0.1), { | |
x: F, | |
y: v, | |
scale: B, | |
opacity: k | |
}; | |
} | |
attach() { | |
let t = this, e = t.instance; | |
e.on('Carousel.change', t.onChange); | |
e.on('Carousel.createSlide', t.onCreateSlide); | |
e.on('Carousel.removeSlide', t.onRemoveSlide); | |
e.on('close', t.onClose); | |
} | |
detach() { | |
let t = this, e = t.instance; | |
e.off('Carousel.change', t.onChange); | |
e.off('Carousel.createSlide', t.onCreateSlide); | |
e.off('Carousel.removeSlide', t.onRemoveSlide); | |
e.off('close', t.onClose); | |
} | |
}; | |
Object.defineProperty(Tt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
initialSize: 'fit', | |
Panzoom: { maxScale: 1 }, | |
protected: false, | |
zoom: true, | |
zoomOpacity: 'auto' | |
} | |
}); | |
typeof SuppressedError == 'function' && SuppressedError; | |
var xi = (o, t = {}) => { | |
let e = new URL(o), i = new URLSearchParams(e.search), n = new URLSearchParams(); | |
for (let [r, l] of [ | |
...i, | |
...Object.entries(t) | |
]) { | |
let c = l + ''; | |
if (r === 't') { | |
let d = c.match(/((\d*)m)?(\d*)s?/); | |
d && n.set('start', 60 * parseInt(d[2] || '0') + parseInt(d[3] || '0') + ''); | |
} else { | |
n.set(r, c); | |
} | |
} | |
let s = n + '', a = o.match(/#t=((.*)?\d+s)/); | |
return a && (s += `#t=${ a[1] }`), s; | |
}, qn = { | |
ajax: null, | |
autoSize: true, | |
iframeAttr: { | |
allow: 'autoplay; fullscreen', | |
scrolling: 'auto' | |
}, | |
preload: true, | |
videoAutoplay: true, | |
videoRatio: 1.7777777777777777, | |
videoTpl: `<video class="fancybox__html5video" playsinline controls controlsList="nodownload" poster="{{poster}}"> | |
<source src="{{src}}" type="{{format}}" />Sorry, your browser doesn't support embedded videos.</video>`, | |
videoFormat: '', | |
vimeo: { | |
byline: 1, | |
color: '00adef', | |
controls: 1, | |
dnt: 1, | |
muted: 0 | |
}, | |
youtube: { | |
controls: 1, | |
enablejsapi: 1, | |
nocookie: 1, | |
rel: 0, | |
fs: 1 | |
} | |
}, $n = [ | |
'image', | |
'html', | |
'ajax', | |
'inline', | |
'clone', | |
'iframe', | |
'map', | |
'pdf', | |
'html5video', | |
'youtube', | |
'vimeo' | |
], jt = class extends D { | |
onBeforeInitSlide(t, e, i) { | |
this.processType(i); | |
} | |
onCreateSlide(t, e, i) { | |
this.setContent(i); | |
} | |
onClearContent(t, e) { | |
e.xhr && (e.xhr.abort(), e.xhr = null); | |
let i = e.iframeEl; | |
i && (i.onload = i.onerror = null, i.src = '//about:blank', e.iframeEl = null); | |
let n = e.contentEl, s = e.placeholderEl; | |
if (e.type === 'inline' && n && s) { | |
n.classList.remove('fancybox__content'); | |
getComputedStyle(n).getPropertyValue('display') !== 'none' && (n.style.display = 'none'); | |
setTimeout(() => { | |
s && (n && s.parentNode && s.parentNode.insertBefore(n, s), s.remove()); | |
}, 0); | |
e.contentEl = void 0; | |
e.placeholderEl = void 0; | |
} else { | |
for (; e.el && e.el.firstChild;) { | |
e.el.removeChild(e.el.firstChild); | |
} | |
} | |
} | |
onSelectSlide(t, e, i) { | |
i.state === Z.Ready && this.playVideo(); | |
} | |
onUnselectSlide(t, e, i) { | |
var n, s; | |
if (i.type === 'html5video') { | |
try { | |
(s = (n = i.el) === null || n === void 0 ? void 0 : n.querySelector('video')) === null || s === void 0 || s.pause(); | |
} catch { | |
} | |
return; | |
} | |
let a; | |
i.type === 'vimeo' ? a = { | |
method: 'pause', | |
value: 'true' | |
} : i.type === 'youtube' && (a = { | |
event: 'command', | |
func: 'pauseVideo' | |
}); | |
a && i.iframeEl && i.iframeEl.contentWindow && i.iframeEl.contentWindow.postMessage(JSON.stringify(a), '*'); | |
i.poller && clearTimeout(i.poller); | |
} | |
onDone(t, e) { | |
t.isCurrentSlide(e) && !t.isClosing() && this.playVideo(); | |
} | |
onRefresh(t, e) { | |
e.slides.forEach(i => { | |
i.el && (this.resizeIframe(i), this.setAspectRatio(i)); | |
}); | |
} | |
onMessage(t) { | |
try { | |
let e = JSON.parse(t.data); | |
if (t.origin === 'https://player.vimeo.com') { | |
if (e.event === 'ready') { | |
for (let i of Array.from(document.getElementsByClassName('fancybox__iframe'))) | |
i instanceof HTMLIFrameElement && i.contentWindow === t.source && (i.dataset.ready = 'true'); | |
} | |
} else { | |
if (t.origin.match(/^https:\/\/(www.)?youtube(-nocookie)?.com$/) && e.event === 'onReady') { | |
let i = document.getElementById(e.id); | |
i && (i.dataset.ready = 'true'); | |
} | |
} | |
} catch { | |
} | |
} | |
loadAjaxContent(t) { | |
let e = this.instance.optionFor(t, 'src') || ''; | |
this.instance.showLoading(t); | |
let i = this.instance, n = new XMLHttpRequest(); | |
i.showLoading(t); | |
n.onreadystatechange = function () { | |
n.readyState === XMLHttpRequest.DONE && i.state === A.Ready && (i.hideLoading(t), n.status === 200 ? i.setContent(t, n.responseText) : i.setError(t, n.status === 404 ? '{{AJAX_NOT_FOUND}}' : '{{AJAX_FORBIDDEN}}')); | |
}; | |
let s = t.ajax || null; | |
n.open(s ? 'POST' : 'GET', e + ''); | |
n.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
n.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); | |
n.send(s); | |
; | |
} | |
setInlineContent(t) { | |
let e = null; | |
if (C(t.src)) { | |
e = t.src; | |
} else { | |
if (typeof t.src == 'string') { | |
let i = t.src.split('#', 2).pop(); | |
e = i ? document.getElementById(i) : null; | |
} | |
} | |
if (e) { | |
if (t.type === 'clone' || e.closest('.fancybox__slide')) { | |
e = e.cloneNode(true); | |
let i = e.dataset.animationName; | |
i && (e.classList.remove(i), delete e.dataset.animationName); | |
let n = e.getAttribute('id'); | |
n = n ? `${ n }--clone` : `clone-${ this.instance.id }-${ t.index }`; | |
e.setAttribute('id', n); | |
} else { | |
if (e.parentNode) { | |
let i = document.createElement('div'); | |
i.classList.add('fancybox-placeholder'); | |
e.parentNode.insertBefore(i, e); | |
; | |
} | |
} | |
this.instance.setContent(t, e); | |
} else { | |
this.instance.setError(t, '{{ELEMENT_NOT_FOUND}}'); | |
} | |
} | |
setIframeContent(t) { | |
let { | |
src: e, | |
el: i | |
} = t; | |
if (!e || typeof e != 'string' || !i) { | |
return; | |
} | |
i.classList.add('is-loading'); | |
let n = this.instance, s = document.createElement('iframe'); | |
s.className = 'fancybox__iframe'; | |
s.setAttribute('id', `fancybox__iframe_${ n.id }_${ t.index }`); | |
for (let [r, l] of Object.entries(this.optionFor(t, 'iframeAttr') || {})) | |
s.setAttribute(r, l); | |
s.onerror = () => { | |
n.setError(t, '{{IFRAME_ERROR}}'); | |
}; | |
; | |
let a = this.optionFor(t, 'preload'); | |
if (t.type !== 'iframe' || a === false) { | |
return s.setAttribute('src', t.src + ''), n.setContent(t, s, false), this.resizeIframe(t), void n.revealContent(t); | |
} | |
n.showLoading(t); | |
s.onload = () => { | |
if (!s.src.length) { | |
return; | |
} | |
let r = s.dataset.ready !== 'true'; | |
s.dataset.ready = 'true'; | |
this.resizeIframe(t); | |
r ? n.revealContent(t) : n.hideLoading(t); | |
}; | |
s.setAttribute('src', e); | |
n.setContent(t, s, false); | |
} | |
resizeIframe(t) { | |
let { | |
type: e, | |
iframeEl: i | |
} = t; | |
if (e === 'youtube' || e === 'vimeo') { | |
return; | |
} | |
let n = i?.parentElement; | |
if (!i || !n) { | |
return; | |
} | |
let s = t.autoSize; | |
s === void 0 && (s = this.optionFor(t, 'autoSize')); | |
let a = t.width || 0, r = t.height || 0; | |
a && r && (s = false); | |
let l = n && n.style; | |
if (t.preload !== false && s !== false && l) { | |
try { | |
let c = window.getComputedStyle(n), d = parseFloat(c.paddingLeft) + parseFloat(c.paddingRight), u = parseFloat(c.paddingTop) + parseFloat(c.paddingBottom), m = i.contentWindow; | |
if (m) { | |
let h = m.document, b = h.getElementsByTagName('html')[0], p = h.body; | |
l.width = ''; | |
p.style.overflow = 'hidden'; | |
a = a || b.scrollWidth + d; | |
l.width = `${ a }px`; | |
p.style.overflow = ''; | |
l.flex = '0 0 auto'; | |
l.height = `${ p.scrollHeight }px`; | |
r = b.scrollHeight + u; | |
} | |
} catch { | |
} | |
} | |
if (a || r) { | |
; | |
a && a !== 'auto' && ('' = `${ a }px`); | |
r && r !== 'auto' && ('' = `${ r }px`); | |
Object.assign(l, c); | |
} | |
} | |
playVideo() { | |
let t = this.instance.getSlide(); | |
if (!t) { | |
return; | |
} | |
let {el: e} = t; | |
if (!e || !e.offsetParent || !this.optionFor(t, 'videoAutoplay')) { | |
return; | |
} | |
if (t.type === 'html5video') { | |
try { | |
let n = e.querySelector('video'); | |
if (n) { | |
let s = n.play(); | |
s !== void 0 && s.then(() => { | |
}).catch(a => { | |
n.muted = true; | |
n.play(); | |
}); | |
} | |
} catch { | |
} | |
} | |
if (t.type !== 'youtube' && t.type !== 'vimeo') { | |
return; | |
} | |
let i = () => { | |
if (t.iframeEl && t.iframeEl.contentWindow) { | |
let n; | |
if (t.iframeEl.dataset.ready === 'true') { | |
return n = t.type === 'youtube' ? { | |
event: 'command', | |
func: 'playVideo' | |
} : { | |
method: 'play', | |
value: 'true' | |
}, n && t.iframeEl.contentWindow.postMessage(JSON.stringify(n), '*'), void (t.poller = void 0); | |
} | |
t.type === 'youtube' && (n = { | |
event: 'listening', | |
id: t.iframeEl.getAttribute('id') | |
}, t.iframeEl.contentWindow.postMessage(JSON.stringify(n), '*')); | |
} | |
; | |
}; | |
i(); | |
} | |
processType(t) { | |
if (t.html) { | |
return t.type = 'html', t.src = t.html, void (t.html = ''); | |
} | |
let e = this.instance.optionFor(t, 'src', ''); | |
if (!e || typeof e != 'string') { | |
return; | |
} | |
let i = t.type, n = null; | |
if (n = e.match(/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(?:watch\?(?:.*&)?v=|v\/|u\/|shorts\/|embed\/?)?(videoseries\?list=(?:.*)|[\w-]{11}|\?listType=(?:.*)&list=(?:.*))(?:.*)/i)) { | |
let s = this.optionFor(t, 'youtube'), {nocookie: a} = s, r = function (u, m) { | |
var h = { tabIndex: -1 }; | |
for (var b in u) | |
Object.prototype.hasOwnProperty.call(u, b) && m.indexOf(b) < 0 && (h[b] = u[b]); | |
if (u != null && typeof Object.getOwnPropertySymbols == 'function') { | |
var p = 0; | |
for (b = Object.getOwnPropertySymbols(u); p < b.length; p++) { | |
m.indexOf(b[p]) < 0 && Object.prototype.propertyIsEnumerable.call(u, b[p]) && (h[b[p]] = u[b[p]]); | |
} | |
} | |
return h; | |
}(s, ['nocookie']), l = `www.youtube${ a ? '-nocookie' : '' }.com`, c = xi(e, r), d = encodeURIComponent(n[2]); | |
; | |
; | |
; | |
i = 'youtube'; | |
} else { | |
if (n = e.match(/^.+vimeo.com\/(?:\/)?([\d]+)((\/|\?h=)([a-z0-9]+))?(.*)?/)) { | |
let s = xi(e, this.optionFor(t, 'vimeo')), a = encodeURIComponent(n[1]), r = n[4] || ''; | |
; | |
; | |
i = 'vimeo'; | |
} | |
} | |
if (!i && t.triggerEl) { | |
let s = t.triggerEl.dataset.type; | |
$n.includes(s) && (i = s); | |
} | |
i || typeof e == 'string' && (e.charAt(0) === '#' ? i = 'inline' : (n = e.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i)) ? (i = 'html5video', t.videoFormat = t.videoFormat || 'video/' + (n[1] === 'ogv' ? 'ogg' : n[1])) : e.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i) ? i = 'image' : e.match(/\.(pdf)((\?|#).*)?$/i) && (i = 'pdf')); | |
(n = e.match(/(?:maps\.)?google\.([a-z]{2,3}(?:\.[a-z]{2})?)\/(?:(?:(?:maps\/(?:place\/(?:.*)\/)?\@(.*),(\d+.?\d+?)z))|(?:\?ll=))(.*)?/i)) ? (t.src = `https://maps.google.${ n[1] }/?ll=${ (n[2] ? n[2] + '&z=' + Math.floor(parseFloat(n[3])) + (n[4] ? n[4].replace(/^\//, '&') : '') : n[4] + '').replace(/\?/, '&') }&output=${ n[4] && n[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed' }`, i = 'map') : (n = e.match(/(?:maps\.)?google\.([a-z]{2,3}(?:\.[a-z]{2})?)\/(?:maps\/search\/)(.*)/i)) && (t.src = `https://maps.google.${ n[1] }/maps?q=${ n[2].replace('query=', 'q=').replace('api=1', '') }&output=embed`, i = 'map'); | |
i = i || this.instance.option('defaultType'); | |
; | |
i === 'image' && (t.thumbSrc = t.thumbSrc || t.src); | |
} | |
setContent(t) { | |
let e = this.instance.optionFor(t, 'src') || ''; | |
if (t && t.type && e) { | |
switch (t.type) { | |
case 'html': | |
this.instance.setContent(t, e); | |
break; | |
case 'html5video': | |
let i = this.option('videoTpl'); | |
i && this.instance.setContent(t, i.replace(/\{\{src\}\}/gi, e + '').replace(/\{\{format\}\}/gi, this.optionFor(t, 'videoFormat') || '').replace(/\{\{poster\}\}/gi, t.poster || t.thumbSrc || '')); | |
break; | |
case 'inline': | |
case 'clone': | |
this.setInlineContent(t); | |
break; | |
case 'ajax': | |
this.loadAjaxContent(t); | |
break; | |
case 'pdf': | |
case 'map': | |
case 'youtube': | |
case 'vimeo': | |
; | |
case 'iframe': | |
this.setIframeContent(t); | |
} | |
this.setAspectRatio(t); | |
} | |
} | |
setAspectRatio(t) { | |
let e = t.contentEl; | |
if (!(t.el && e && t.type && [ | |
'youtube', | |
'vimeo', | |
'html5video' | |
].includes(t.type))) { | |
return; | |
} | |
let i, n = t.width || 'auto', s = t.height || 'auto'; | |
if (n === 'auto' || s === 'auto') { | |
i = this.optionFor(t, 'videoRatio'); | |
let c = (i + '').match(/(\d+)\s*\/\s?(\d+)/); | |
i = c && c.length > 2 ? parseFloat(c[1]) / parseFloat(c[2]) : parseFloat(i + ''); | |
} else { | |
n && s && (i = n / s); | |
} | |
if (!i) { | |
return; | |
} | |
e.style.aspectRatio = ''; | |
e.style.width = ''; | |
e.style.height = ''; | |
e.offsetHeight; | |
let a = e.getBoundingClientRect(), r = a.width || 1, l = a.height || 1; | |
e.style.aspectRatio = i + ''; | |
i < r / l ? (s = s === 'auto' ? l : Math.min(l, s), e.style.width = 'auto', e.style.height = `${ s }px`) : (n = n === 'auto' ? r : Math.min(r, n), e.style.width = `${ n }px`, e.style.height = 'auto'); | |
} | |
attach() { | |
let t = this, e = t.instance; | |
e.on('Carousel.beforeInitSlide', t.onBeforeInitSlide); | |
e.on('Carousel.createSlide', t.onCreateSlide); | |
e.on('Carousel.selectSlide', t.onSelectSlide); | |
e.on('Carousel.unselectSlide', t.onUnselectSlide); | |
e.on('Carousel.Panzoom.refresh', t.onRefresh); | |
e.on('done', t.onDone); | |
e.on('clearContent', t.onClearContent); | |
window.addEventListener('message', t.onMessage); | |
} | |
detach() { | |
let t = this, e = t.instance; | |
e.off('Carousel.beforeInitSlide', t.onBeforeInitSlide); | |
e.off('Carousel.createSlide', t.onCreateSlide); | |
e.off('Carousel.selectSlide', t.onSelectSlide); | |
e.off('Carousel.unselectSlide', t.onUnselectSlide); | |
e.off('Carousel.Panzoom.refresh', t.onRefresh); | |
e.off('done', t.onDone); | |
e.off('clearContent', t.onClearContent); | |
window.removeEventListener('message', t.onMessage); | |
} | |
}; | |
Object.defineProperty(jt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: qn | |
}); | |
var Jt = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'state', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 'ready' | |
}); | |
Object.defineProperty(this, 'inHover', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
Object.defineProperty(this, 'timer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'progressBar', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
} | |
get isActive() { | |
return this.state !== 'ready'; | |
} | |
onReady(t) { | |
this.option('autoStart') && (t.isInfinite || t.page < t.pages.length - 1) && this.start(); | |
} | |
onChange() { | |
this.removeProgressBar(); | |
this.pause(); | |
} | |
onSettle() { | |
this.resume(); | |
} | |
onVisibilityChange() { | |
document.visibilityState === 'visible' ? this.resume() : this.pause(); | |
} | |
onMouseEnter() { | |
this.inHover = true; | |
this.pause(); | |
} | |
onMouseLeave() { | |
var t; | |
this.inHover = false; | |
!((t = this.instance.panzoom) === null || t === void 0) && t.isResting && this.resume(); | |
} | |
onTimerEnd() { | |
let t = this.instance; | |
this.state === 'play' && (t.isInfinite || t.page !== t.pages.length - 1 ? t.slideNext() : t.slideTo(0)); | |
} | |
removeProgressBar() { | |
this.progressBar && (this.progressBar.remove(), this.progressBar = null); | |
} | |
createProgressBar() { | |
var t; | |
if (!this.option('showProgress')) { | |
return null; | |
} | |
this.removeProgressBar(); | |
let e = this.instance, i = ((t = e.pages[e.page]) === null || t === void 0 ? void 0 : t.slides) || [], n = this.option('progressParentEl'); | |
if (n || (n = (i.length === 1 ? i[0].el : null) || e.viewport), !n) { | |
return null; | |
} | |
let s = document.createElement('div'); | |
return y(s, 'f-progress'), n.prepend(s), this.progressBar = s, s.offsetHeight, s; | |
} | |
set() { | |
let t = this, e = t.instance; | |
if (e.pages.length < 2 || t.timer) { | |
return; | |
} | |
let i = t.option('timeout'); | |
; | |
y(e.container, 'has-autoplay'); | |
let n = t.createProgressBar(); | |
n && (n.style.transitionDuration = `${ i }ms`, n.style.transform = 'scaleX(1)'); | |
; | |
t.emit('set'); | |
} | |
clear() { | |
let t = this; | |
t.timer && (clearTimeout(t.timer), t.timer = null); | |
t.removeProgressBar(); | |
} | |
start() { | |
let t = this; | |
if (t.set(), t.state !== 'ready') { | |
if (t.option('pauseOnHover')) { | |
let e = t.instance.container; | |
e.addEventListener('mouseenter', t.onMouseEnter, false); | |
e.addEventListener('mouseleave', t.onMouseLeave, false); | |
} | |
document.addEventListener('visibilitychange', t.onVisibilityChange, false); | |
t.emit('start'); | |
} | |
} | |
stop() { | |
let t = this, e = t.state, i = t.instance.container; | |
t.clear(); | |
; | |
i.removeEventListener('mouseenter', t.onMouseEnter, false); | |
i.removeEventListener('mouseleave', t.onMouseLeave, false); | |
document.removeEventListener('visibilitychange', t.onVisibilityChange, false); | |
x(i, 'has-autoplay'); | |
e !== 'ready' && t.emit('stop'); | |
} | |
pause() { | |
let t = this; | |
t.state === 'play' && (t.state = 'pause', t.clear(), t.emit('pause')); | |
} | |
resume() { | |
let t = this, e = t.instance; | |
if (e.isInfinite || e.page !== e.pages.length - 1) { | |
if (t.state !== 'play') { | |
if (t.state === 'pause' && !t.inHover) { | |
let i = new Event('resume', { | |
bubbles: true, | |
cancelable: true | |
}); | |
t.emit('resume', i); | |
i.defaultPrevented || t.set(); | |
} | |
} else { | |
t.set(); | |
} | |
} else { | |
t.stop(); | |
} | |
} | |
toggle() { | |
this.state === 'play' || this.state === 'pause' ? this.stop() : this.start(); | |
} | |
attach() { | |
let t = this, e = t.instance; | |
e.on('ready', t.onReady); | |
e.on('Panzoom.startAnimation', t.onChange); | |
e.on('Panzoom.endAnimation', t.onSettle); | |
e.on('Panzoom.touchMove', t.onChange); | |
} | |
detach() { | |
let t = this, e = t.instance; | |
e.off('ready', t.onReady); | |
e.off('Panzoom.startAnimation', t.onChange); | |
e.off('Panzoom.endAnimation', t.onSettle); | |
e.off('Panzoom.touchMove', t.onChange); | |
t.stop(); | |
} | |
}; | |
Object.defineProperty(Jt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
autoStart: true, | |
pauseOnHover: true, | |
progressParentEl: null, | |
showProgress: true, | |
timeout: 3000 | |
} | |
}); | |
var Ht = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'ref', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
} | |
onPrepare(t) { | |
let e = t.carousel; | |
if (!e) { | |
return; | |
} | |
let i = t.container; | |
i && (e.options.Autoplay = E({ autoStart: false }, this.option('Autoplay') || {}, { | |
pauseOnHover: false, | |
timeout: this.option('timeout'), | |
progressParentEl: () => this.option('progressParentEl') || null, | |
on: { | |
start: () => { | |
t.emit('startSlideshow'); | |
}, | |
set: n => { | |
var s; | |
i.classList.add('has-slideshow'); | |
((s = t.getSlide()) === null || s === void 0 ? void 0 : s.state) !== Z.Ready && n.pause(); | |
}, | |
stop: () => { | |
i.classList.remove('has-slideshow'); | |
t.isCompact || t.endIdle(); | |
t.emit('endSlideshow'); | |
}, | |
resume: (n, s) => { | |
var a, r, l; | |
!s || !s.cancelable || ((a = t.getSlide()) === null || a === void 0 ? void 0 : a.state) === Z.Ready && (!((l = (r = t.carousel) === null || r === void 0 ? void 0 : r.panzoom) === null || l === void 0) && l.isResting) || s.preventDefault(); | |
} | |
} | |
}), e.attachPlugins({ Autoplay: Jt }), this.ref = e.plugins.Autoplay); | |
} | |
onReady(t) { | |
let e = t.carousel, i = this.ref; | |
i && e && this.option('playOnStart') && (e.isInfinite || e.page < e.pages.length - 1) && i.start(); | |
} | |
onDone(t, e) { | |
let i = this.ref, n = t.carousel; | |
if (!i || !n) { | |
return; | |
} | |
let s = e.panzoom; | |
s && s.on('startAnimation', () => { | |
t.isCurrentSlide(e) && i.stop(); | |
}); | |
t.isCurrentSlide(e) && i.resume(); | |
} | |
onKeydown(t, e) { | |
var i; | |
let n = this.ref; | |
n && e === this.option('key') && ((i = document.activeElement) === null || i === void 0 ? void 0 : i.nodeName) !== 'BUTTON' && n.toggle(); | |
} | |
attach() { | |
let t = this, e = t.instance; | |
e.on('Carousel.init', t.onPrepare); | |
e.on('Carousel.ready', t.onReady); | |
e.on('done', t.onDone); | |
e.on('keydown', t.onKeydown); | |
} | |
detach() { | |
let t = this, e = t.instance; | |
e.off('Carousel.init', t.onPrepare); | |
e.off('Carousel.ready', t.onReady); | |
e.off('done', t.onDone); | |
e.off('keydown', t.onKeydown); | |
} | |
}; | |
Object.defineProperty(Ht, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: { | |
key: ' ', | |
playOnStart: false, | |
progressParentEl: o => { | |
var t; | |
return ((t = o.instance.container) === null || t === void 0 ? void 0 : t.querySelector('.fancybox__toolbar [data-fancybox-toggle-slideshow]')) || o.instance.container; | |
}, | |
timeout: 3000 | |
} | |
}); | |
var ji = { | |
classes: { | |
container: 'f-thumbs f-carousel__thumbs', | |
viewport: 'f-thumbs__viewport', | |
track: 'f-thumbs__track', | |
slide: 'f-thumbs__slide', | |
isResting: 'is-resting', | |
isSelected: 'is-selected', | |
isLoading: 'is-loading', | |
hasThumbs: 'has-thumbs' | |
}, | |
minCount: 2, | |
parentEl: null, | |
thumbTpl: '<button class="f-thumbs__slide__button" tabindex="0" type="button" aria-label="{{GOTO}}" data-carousel-index="%i"><img class="f-thumbs__slide__img" data-lazy-src="{{%s}}" alt="" /></button>', | |
type: 'modern' | |
}, H; | |
(function (o) { | |
o[o.Init = 0] = 'Init'; | |
o[o.Ready = 1] = 'Ready'; | |
o[o.Hidden = 2] = 'Hidden'; | |
}(H || (H = {}))); | |
var Ji = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'type', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 'modern' | |
}); | |
Object.defineProperty(this, 'container', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'track', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'carousel', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'thumbWidth', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'thumbClipWidth', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'thumbHeight', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'thumbGap', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'thumbExtraGap', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'state', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: H.Init | |
}); | |
} | |
get isModern() { | |
return this.type === 'modern'; | |
} | |
onInitSlide(o, t) { | |
let e = t.el ? t.el.dataset : void 0; | |
e && (t.thumbSrc = e.thumbSrc || t.thumbSrc || '', t.thumbClipWidth = parseFloat(e.thumbClipWidth || '') || t.thumbClipWidth || 0, t.thumbHeight = parseFloat(e.thumbHeight || '') || t.thumbHeight || 0); | |
this.addSlide(t); | |
} | |
onInitSlides() { | |
this.build(); | |
} | |
onChange() { | |
var o; | |
if (!this.isModern) { | |
return; | |
} | |
let t = this.container, e = this.instance, i = e.panzoom, n = this.carousel, s = n ? n.panzoom : null, a = e.page; | |
if (i && n && s) { | |
if (i.isDragging) { | |
x(t, this.cn('isResting')); | |
let r = ((o = n.pages[a]) === null || o === void 0 ? void 0 : o.pos) || 0; | |
r += e.getProgress(a) * (this.thumbClipWidth + this.thumbGap); | |
let l = s.getBounds(); | |
-1 * r > l.x.min && -1 * r < l.x.max && s.panTo({ | |
x: -1 * r, | |
friction: 0.12 | |
}); | |
} else { | |
z(t, this.cn('isResting'), i.isResting); | |
} | |
this.shiftModern(); | |
} | |
} | |
onRefresh() { | |
this.updateProps(); | |
for (let o of this.instance.slides || []) | |
this.resizeModernSlide(o); | |
this.shiftModern(); | |
} | |
isDisabled() { | |
let o = this.option('minCount') || 0; | |
if (o) { | |
let e = this.instance, i = 0; | |
for (let n of e.slides || []) | |
n.thumbSrc && i++; | |
if (i < o) { | |
return true; | |
} | |
} | |
let t = this.option('type'); | |
return [ | |
'modern', | |
'classic' | |
].indexOf(t) < 0; | |
} | |
getThumb(o) { | |
let t = this.option('thumbTpl') || ''; | |
return { | |
html: this.instance.localize(t, [ | |
[ | |
'%i', | |
o.index | |
], | |
[ | |
'%d', | |
o.index + 1 | |
], | |
[ | |
'%s', | |
o.thumbSrc || 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' | |
] | |
]) | |
}; | |
} | |
addSlide(o) { | |
let t = this.carousel; | |
t && t.addSlide(o.index, this.getThumb(o)); | |
} | |
getSlides() { | |
let o = []; | |
for (let t of this.instance.slides || []) | |
o.push(this.getThumb(t)); | |
return o; | |
} | |
resizeModernSlide(o) { | |
this.isModern && (o.thumbWidth = o.thumbClipWidth && o.thumbHeight ? Math.round(this.thumbHeight * (o.thumbClipWidth / o.thumbHeight)) : this.thumbWidth); | |
} | |
updateProps() { | |
let o = this.container; | |
if (!o) { | |
return; | |
} | |
let t = e => parseFloat(getComputedStyle(o).getPropertyValue('--f-thumb-' + e)) || 0; | |
this.thumbGap = t('gap'); | |
this.thumbExtraGap = t('extra-gap'); | |
this.thumbWidth = t('width') || 40; | |
this.thumbClipWidth = t('clip-width') || 40; | |
this.thumbHeight = t('height') || 40; | |
} | |
build() { | |
let o = this; | |
if (o.state !== H.Init) { | |
return; | |
} | |
if (o.isDisabled()) { | |
return void o.emit('disabled'); | |
} | |
let t = o.instance, e = t.container, i = o.getSlides(), n = o.option('type'); | |
o.type = n; | |
let s = o.option('parentEl'), a = o.cn('container'), r = o.cn('track'), l = s?.querySelector('.' + a); | |
l || (l = document.createElement('div'), y(l, a), s ? s.appendChild(l) : e.after(l)); | |
y(l, `is-${ n }`); | |
y(e, o.cn('hasThumbs')); | |
o.container = l; | |
o.updateProps(); | |
let c = l.querySelector('.' + r); | |
c || (c = document.createElement('div'), y(c, o.cn('track')), l.appendChild(c)); | |
o.track = c; | |
let d = E({}, { | |
track: c, | |
infinite: false, | |
center: true, | |
fill: n === 'classic', | |
dragFree: true, | |
slidesPerPage: 1, | |
transition: false, | |
preload: 0.25, | |
friction: 0.12, | |
Panzoom: { maxVelocity: 0 }, | |
Dots: false, | |
Navigation: false, | |
classes: { | |
container: 'f-thumbs', | |
viewport: 'f-thumbs__viewport', | |
track: 'f-thumbs__track', | |
slide: 'f-thumbs__slide' | |
} | |
}, o.option('Carousel') || {}, { | |
Sync: { target: t }, | |
slides: i | |
}), u = new t.constructor(l, d); | |
u.on('createSlide', (m, h) => { | |
o.setProps(h.index); | |
o.emit('createSlide', h, h.el); | |
}); | |
u.on('ready', () => { | |
o.shiftModern(); | |
o.emit('ready'); | |
}); | |
u.on('refresh', () => { | |
o.shiftModern(); | |
}); | |
u.on('Panzoom.click', (m, h, b) => { | |
o.onClick(b); | |
}); | |
o.carousel = u; | |
o.state = H.Ready; | |
} | |
onClick(o) { | |
o.preventDefault(); | |
o.stopPropagation(); | |
let t = this.instance, { | |
pages: e, | |
page: i | |
} = t, n = p => { | |
if (p) { | |
let f = p.closest('[data-carousel-index]'); | |
if (f) { | |
return [ | |
parseInt(f.dataset.carouselIndex || '', 10) || 0, | |
f | |
]; | |
} | |
} | |
return [ | |
-1, | |
void 0 | |
]; | |
}, s = (p, f) => { | |
let g = document.elementFromPoint(p, f); | |
return g ? n(g) : [ | |
-1, | |
void 0 | |
]; | |
}, [a, r] = n(o.target); | |
if (a > -1) { | |
return; | |
} | |
let l = this.thumbClipWidth, c = o.clientX, d = o.clientY, [u, m] = s(c - l, d), [h, b] = s(c + l, d); | |
m && b ? (a = Math.abs(c - m.getBoundingClientRect().right) < Math.abs(c - b.getBoundingClientRect().left) ? u : h, a === i && (a = a === u ? h : u)) : m ? a = u : b && (a = h); | |
a > -1 && e[a] && t.slideTo(a); | |
} | |
getShift(o) { | |
var t; | |
let e = this, {instance: i} = e, n = e.carousel; | |
if (!i || !n) { | |
return 0; | |
} | |
let s = e.thumbWidth, a = e.thumbClipWidth, r = e.thumbGap, l = e.thumbExtraGap; | |
if (!(!((t = n.slides[o]) === null || t === void 0) && t.el)) { | |
return 0; | |
} | |
let c = 0.5 * (s - a), d = i.pages.length - 1, u = i.getProgress(0), m = i.getProgress(d), h = i.getProgress(o, false, true), b = 0, p = c + l + r, f = u < 0 && u > -1, g = m > 0 && m < 1; | |
return o === 0 ? (b = p * Math.abs(u), g && u === 1 && (b -= p * Math.abs(m))) : o === d ? (b = p * Math.abs(m) * -1, f && m === -1 && (b += p * Math.abs(u))) : f || g ? (b = -1 * p, b += p * Math.abs(u), b += p * (1 - Math.abs(m))) : b = p * h, b; | |
} | |
setProps(o) { | |
var t; | |
let e = this; | |
if (!e.isModern) { | |
return; | |
} | |
let {instance: i} = e, n = e.carousel; | |
if (i && n) { | |
let s = (t = n.slides[o]) === null || t === void 0 ? void 0 : t.el; | |
if (s && s.childNodes.length) { | |
let a = Q(1 - Math.abs(i.getProgress(o))), r = Q(e.getShift(o)); | |
s.style.setProperty('--progress', a ? a + '' : ''); | |
s.style.setProperty('--shift', r + ''); | |
} | |
} | |
} | |
shiftModern() { | |
let o = this; | |
if (!o.isModern) { | |
return; | |
} | |
let { | |
instance: t, | |
track: e | |
} = o, i = t.panzoom, n = o.carousel; | |
if (!(t && e && i && n) || i.state === U.Init || i.state === U.Destroy) { | |
return; | |
} | |
for (let a of t.slides) | |
o.setProps(a.index); | |
let s = (o.thumbClipWidth + o.thumbGap) * (n.slides.length || 0); | |
e.style.setProperty('--width', s + ''); | |
} | |
cleanup() { | |
let o = this; | |
o.carousel && o.carousel.destroy(); | |
o.carousel = null; | |
o.container && o.container.remove(); | |
o.container = null; | |
o.track && o.track.remove(); | |
o.track = null; | |
o.state = H.Init; | |
x(o.instance.container, o.cn('hasThumbs')); | |
} | |
attach() { | |
let o = this, t = o.instance; | |
t.on('initSlide', o.onInitSlide); | |
t.state === w.Init ? t.on('initSlides', o.onInitSlides) : o.onInitSlides(); | |
t.on([ | |
'change', | |
'Panzoom.afterTransform' | |
], o.onChange); | |
t.on('Panzoom.refresh', o.onRefresh); | |
} | |
detach() { | |
let o = this, t = o.instance; | |
t.off('initSlide', o.onInitSlide); | |
t.off('initSlides', o.onInitSlides); | |
t.off([ | |
'change', | |
'Panzoom.afterTransform' | |
], o.onChange); | |
t.off('Panzoom.refresh', o.onRefresh); | |
o.cleanup(); | |
} | |
}; | |
Object.defineProperty(Ji, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: ji | |
}); | |
var ts = Object.assign(Object.assign({}, ji), { | |
key: 't', | |
showOnStart: true, | |
parentEl: null | |
}), Pt = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'ref', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'hidden', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
} | |
get isEnabled() { | |
let t = this.ref; | |
return t && !t.isDisabled(); | |
} | |
get isHidden() { | |
return this.hidden; | |
} | |
onClick(t, e) { | |
e.stopPropagation(); | |
} | |
onCreateSlide(t, e) { | |
var i, n, s; | |
let a = ((s = (n = (i = this.instance) === null || i === void 0 ? void 0 : i.carousel) === null || n === void 0 ? void 0 : n.slides[e.index]) === null || s === void 0 ? void 0 : s.type) || '', r = e.el; | |
if (r && a) { | |
let l = `for-${ a }`; | |
[ | |
'video', | |
'youtube', | |
'vimeo', | |
'html5video' | |
].includes(a) && (l += ' for-video'); | |
y(r, l); | |
} | |
} | |
onInit() { | |
var t; | |
let e = this, i = e.instance, n = i.carousel; | |
if (e.ref || !n) { | |
return; | |
} | |
let s = e.option('parentEl') || i.footer || i.container; | |
if (!s) { | |
return; | |
} | |
let a = E({}, e.options, { | |
parentEl: s, | |
classes: { container: 'f-thumbs fancybox__thumbs' }, | |
Carousel: { Sync: { friction: i.option('Carousel.friction') || 0 } }, | |
on: { | |
ready: r => { | |
let l = r.container; | |
l && this.hidden && (e.refresh(), l.style.transition = 'none', e.hide(), l.offsetHeight, queueMicrotask(() => { | |
l.style.transition = ''; | |
e.show(); | |
})); | |
} | |
} | |
}); | |
; | |
a.Carousel.on = E(((t = e.options.Carousel) === null || t === void 0 ? void 0 : t.on) || {}, { | |
click: this.onClick, | |
createSlide: this.onCreateSlide | |
}); | |
n.options.Thumbs = a; | |
n.attachPlugins({ Thumbs: Ji }); | |
e.ref = n.plugins.Thumbs; | |
e.option('showOnStart') || (e.ref.state = H.Hidden, e.hidden = true); | |
} | |
onResize() { | |
var t; | |
let e = (t = this.ref) === null || t === void 0 ? void 0 : t.container; | |
e && (e.style.maxHeight = ''); | |
} | |
onKeydown(t, e) { | |
let i = this.option('key'); | |
i && i === e && this.toggle(); | |
} | |
toggle() { | |
let t = this.ref; | |
if (t && !t.isDisabled()) { | |
return t.state === H.Hidden ? (t.state = H.Init, void t.build()) : void (this.hidden ? this.show() : this.hide()); | |
} | |
} | |
show() { | |
let t = this.ref; | |
if (!t || t.isDisabled()) { | |
return; | |
} | |
let e = t.container; | |
e && (this.refresh(), e.offsetHeight, e.removeAttribute('aria-hidden'), e.classList.remove('is-masked'), this.hidden = false); | |
} | |
hide() { | |
let t = this.ref, e = t && t.container; | |
e && (this.refresh(), e.offsetHeight, e.classList.add('is-masked'), e.setAttribute('aria-hidden', 'true')); | |
this.hidden = true; | |
} | |
refresh() { | |
let t = this.ref; | |
if (!t || !t.state) { | |
return; | |
} | |
let e = t.container, i = e?.firstChild || null; | |
e && i && i.childNodes.length && (e.style.maxHeight = `${ i.getBoundingClientRect().height }px`); | |
} | |
attach() { | |
let t = this, e = t.instance; | |
e.state === A.Init ? e.on('Carousel.init', t.onInit) : t.onInit(); | |
e.on('resize', t.onResize); | |
e.on('keydown', t.onKeydown); | |
} | |
detach() { | |
var t; | |
let e = this, i = e.instance; | |
i.off('Carousel.init', e.onInit); | |
i.off('resize', e.onResize); | |
i.off('keydown', e.onKeydown); | |
(t = i.carousel) === null || t === void 0 || t.detachPlugins(['Thumbs']); | |
e.ref = null; | |
} | |
}; | |
Object.defineProperty(Pt, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: ts | |
}); | |
var Ee = { | |
panLeft: { | |
icon: '<svg><path d="M5 12h14M5 12l6 6M5 12l6-6"/></svg>', | |
change: { panX: -100 } | |
}, | |
panRight: { | |
icon: '<svg><path d="M5 12h14M13 18l6-6M13 6l6 6"/></svg>', | |
change: { panX: 100 } | |
}, | |
panUp: { | |
icon: '<svg><path d="M12 5v14M18 11l-6-6M6 11l6-6"/></svg>', | |
change: { panY: -100 } | |
}, | |
panDown: { | |
icon: '<svg><path d="M12 5v14M18 13l-6 6M6 13l6 6"/></svg>', | |
change: { panY: 100 } | |
}, | |
zoomIn: { | |
icon: '<svg><circle cx="11" cy="11" r="7.5"/><path d="m21 21-4.35-4.35M11 8v6M8 11h6"/></svg>', | |
action: 'zoomIn' | |
}, | |
zoomOut: { | |
icon: '<svg><circle cx="11" cy="11" r="7.5"/><path d="m21 21-4.35-4.35M8 11h6"/></svg>', | |
action: 'zoomOut' | |
}, | |
toggle1to1: { | |
icon: '<svg><path d="M3.51 3.07c5.74.02 11.48-.02 17.22.02 1.37.1 2.34 1.64 2.18 3.13 0 4.08.02 8.16 0 12.23-.1 1.54-1.47 2.64-2.79 2.46-5.61-.01-11.24.02-16.86-.01-1.36-.12-2.33-1.65-2.17-3.14 0-4.07-.02-8.16 0-12.23.1-1.36 1.22-2.48 2.42-2.46Z"/><path d="M5.65 8.54h1.49v6.92m8.94-6.92h1.49v6.92M11.5 9.4v.02m0 5.18v0"/></svg>', | |
action: 'toggleZoom' | |
}, | |
toggleZoom: { | |
icon: '<svg><g><line x1="11" y1="8" x2="11" y2="14"></line></g><circle cx="11" cy="11" r="7.5"/><path d="m21 21-4.35-4.35M8 11h6"/></svg>', | |
action: 'toggleZoom' | |
}, | |
iterateZoom: { | |
icon: '<svg><g><line x1="11" y1="8" x2="11" y2="14"></line></g><circle cx="11" cy="11" r="7.5"/><path d="m21 21-4.35-4.35M8 11h6"/></svg>', | |
action: 'iterateZoom' | |
}, | |
rotateCCW: { | |
icon: '<svg><path d="M15 4.55a8 8 0 0 0-6 14.9M9 15v5H4M18.37 7.16v.01M13 19.94v.01M16.84 18.37v.01M19.37 15.1v.01M19.94 11v.01"/></svg>', | |
action: 'rotateCCW' | |
}, | |
rotateCW: { | |
icon: '<svg><path d="M9 4.55a8 8 0 0 1 6 14.9M15 15v5h5M5.63 7.16v.01M4.06 11v.01M4.63 15.1v.01M7.16 18.37v.01M11 19.94v.01"/></svg>', | |
action: 'rotateCW' | |
}, | |
flipX: { | |
icon: '<svg style="stroke-width: 1.3"><path d="M12 3v18M16 7v10h5L16 7M8 7v10H3L8 7"/></svg>', | |
action: 'flipX' | |
}, | |
flipY: { | |
icon: '<svg style="stroke-width: 1.3"><path d="M3 12h18M7 16h10L7 21v-5M7 8h10L7 3v5"/></svg>', | |
action: 'flipY' | |
}, | |
fitX: { | |
icon: '<svg><path d="M4 12V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v6M10 18H3M21 18h-7M6 15l-3 3 3 3M18 15l3 3-3 3"/></svg>', | |
action: 'fitX' | |
}, | |
fitY: { | |
icon: '<svg><path d="M12 20H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h6M18 14v7M18 3v7M15 18l3 3 3-3M15 6l3-3 3 3"/></svg>', | |
action: 'fitY' | |
}, | |
reset: { | |
icon: '<svg><path d="M20 11A8.1 8.1 0 0 0 4.5 9M4 5v4h4M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"/></svg>', | |
action: 'reset' | |
}, | |
toggleFS: { | |
icon: '<svg><g><path d="M14.5 9.5 21 3m0 0h-6m6 0v6M3 21l6.5-6.5M3 21v-6m0 6h6"/></g><g><path d="m14 10 7-7m-7 7h6m-6 0V4M3 21l7-7m0 0v6m0-6H4"/></g></svg>', | |
action: 'toggleFS' | |
} | |
}, it; | |
(function (o) { | |
o[o.Init = 0] = 'Init'; | |
o[o.Ready = 1] = 'Ready'; | |
o[o.Disabled = 2] = 'Disabled'; | |
}(it || (it = {}))); | |
var es = { | |
absolute: 'auto', | |
display: { | |
left: ['infobar'], | |
middle: [], | |
right: [ | |
'iterateZoom', | |
'slideshow', | |
'fullscreen', | |
'thumbs', | |
'close' | |
] | |
}, | |
enabled: 'auto', | |
items: { | |
infobar: { tpl: '<div class="fancybox__infobar" tabindex="-1"><span data-fancybox-current-index></span>/<span data-fancybox-count></span></div>' }, | |
download: { tpl: '<a class="f-button" title="{{DOWNLOAD}}" data-fancybox-download href="javasript:;"><svg><path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2M7 11l5 5 5-5M12 4v12"/></svg></a>' }, | |
prev: { tpl: '<button class="f-button" title="{{PREV}}" data-fancybox-prev><svg><path d="m15 6-6 6 6 6"/></svg></button>' }, | |
next: { tpl: '<button class="f-button" title="{{NEXT}}" data-fancybox-next><svg><path d="m9 6 6 6-6 6"/></svg></button>' }, | |
slideshow: { tpl: '<button class="f-button" title="{{TOGGLE_SLIDESHOW}}" data-fancybox-toggle-slideshow><svg><g><path d="M8 4v16l13 -8z"></path></g><g><path d="M8 4v15M17 4v15"/></g></svg></button>' }, | |
fullscreen: { tpl: '<button class="f-button" title="{{TOGGLE_FULLSCREEN}}" data-fancybox-toggle-fullscreen><svg><g><path d="M4 8V6a2 2 0 0 1 2-2h2M4 16v2a2 2 0 0 0 2 2h2M16 4h2a2 2 0 0 1 2 2v2M16 20h2a2 2 0 0 0 2-2v-2"/></g><g><path d="M15 19v-2a2 2 0 0 1 2-2h2M15 5v2a2 2 0 0 0 2 2h2M5 15h2a2 2 0 0 1 2 2v2M5 9h2a2 2 0 0 0 2-2V5"/></g></svg></button>' }, | |
thumbs: { tpl: '<button class="f-button" title="{{TOGGLE_THUMBS}}" data-fancybox-toggle-thumbs><svg><circle cx="5.5" cy="5.5" r="1"/><circle cx="12" cy="5.5" r="1"/><circle cx="18.5" cy="5.5" r="1"/><circle cx="5.5" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="18.5" cy="12" r="1"/><circle cx="5.5" cy="18.5" r="1"/><circle cx="12" cy="18.5" r="1"/><circle cx="18.5" cy="18.5" r="1"/></svg></button>' }, | |
close: { tpl: '<button class="f-button" title="{{CLOSE}}" data-fancybox-close><svg><path d="m19.5 4.5-15 15M4.5 4.5l15 15"/></svg></button>' } | |
}, | |
parentEl: null | |
}, _t = class extends D { | |
constructor() { | |
super(...arguments); | |
Object.defineProperty(this, 'state', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: it.Init | |
}); | |
Object.defineProperty(this, 'container', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
} | |
onReady(t) { | |
var e; | |
if (!t.carousel) { | |
return; | |
} | |
let i = this.option('display'), n = this.option('absolute'), s = this.option('enabled'); | |
if (s === 'auto') { | |
let c = this.instance.carousel, d = 0; | |
if (c) { | |
for (let u of c.slides) | |
(u.panzoom || u.type === 'image') && d++; | |
} | |
d || (s = false); | |
} | |
s || (i = void 0); | |
let a = 0, r = { | |
left: [], | |
middle: [], | |
right: [] | |
}; | |
if (i) { | |
for (let c of [ | |
'left', | |
'middle', | |
'right' | |
]) | |
for (let d of i[c]) { | |
let u = this.createEl(d); | |
u && ((e = r[c]) === null || e === void 0 || e.push(u), a++); | |
} | |
} | |
let l = null; | |
if (a && (l = this.createContainer()), l) { | |
for (let [c, d] of Object.entries(r)) { | |
let u = document.createElement('div'); | |
y(u, 'fancybox__toolbar__column is-' + c); | |
for (let m of d) | |
u.appendChild(m); | |
n !== 'auto' || c !== 'middle' || d.length || (n = true); | |
l.appendChild(u); | |
} | |
n === true && y(l, 'is-absolute'); | |
this.state = it.Ready; | |
this.onRefresh(); | |
} else { | |
this.state = it.Disabled; | |
} | |
} | |
onClick(t) { | |
var e, i; | |
let n = this.instance, s = n.getSlide(), a = s?.panzoom, r = t.target, l = r && C(r) ? r.dataset : null; | |
if (!l) { | |
return; | |
} | |
if (l.fancyboxToggleThumbs !== void 0) { | |
return t.preventDefault(), t.stopPropagation(), void ((e = n.plugins.Thumbs) === null || e === void 0 || e.toggle()); | |
} | |
if (l.fancyboxToggleFullscreen !== void 0) { | |
return t.preventDefault(), t.stopPropagation(), void this.instance.toggleFullscreen(); | |
} | |
if (l.fancyboxToggleSlideshow !== void 0) { | |
t.preventDefault(); | |
t.stopPropagation(); | |
let u = (i = n.carousel) === null || i === void 0 ? void 0 : i.plugins.Autoplay, m = u.isActive; | |
return a && a.panMode === 'mousemove' && !m && a.reset(), void (m ? u.stop() : u.start()); | |
} | |
let c = l.panzoomAction, d = l.panzoomChange; | |
if ((d || c) && (t.preventDefault(), t.stopPropagation()), d) { | |
let u = {}; | |
try { | |
u = JSON.parse(d); | |
} catch { | |
} | |
a && a.applyChange(u); | |
} else { | |
c && a && a[c] && a[c](); | |
} | |
} | |
onChange() { | |
this.onRefresh(); | |
} | |
onRefresh() { | |
if (this.instance.isClosing()) { | |
return; | |
} | |
let t = this.container; | |
if (!t) { | |
return; | |
} | |
let e = this.instance.getSlide(); | |
if (!e || e.state !== Z.Ready) { | |
return; | |
} | |
let i = e && !e.error && e.panzoom; | |
for (let a of t.querySelectorAll('[data-panzoom-action]')) | |
i ? (a.removeAttribute('disabled'), a.removeAttribute('tabindex')) : (a.setAttribute('disabled', ''), a.setAttribute('tabindex', '-1')); | |
let n = i && i.canZoomIn(), s = i && i.canZoomOut(); | |
for (let a of t.querySelectorAll('[data-panzoom-action="zoomIn"]')) | |
n ? (a.removeAttribute('disabled'), a.removeAttribute('tabindex')) : (a.setAttribute('disabled', ''), a.setAttribute('tabindex', '-1')); | |
for (let a of t.querySelectorAll('[data-panzoom-action="zoomOut"]')) | |
s ? (a.removeAttribute('disabled'), a.removeAttribute('tabindex')) : (a.setAttribute('disabled', ''), a.setAttribute('tabindex', '-1')); | |
for (let a of t.querySelectorAll('[data-panzoom-action="toggleZoom"],[data-panzoom-action="iterateZoom"]')) { | |
s || n ? (a.removeAttribute('disabled'), a.removeAttribute('tabindex')) : (a.setAttribute('disabled', ''), a.setAttribute('tabindex', '-1')); | |
let r = a.querySelector('g'); | |
r && (r.style.display = n ? '' : 'none'); | |
} | |
} | |
onDone(t, e) { | |
var i; | |
(i = e.panzoom) === null || i === void 0 || i.on('afterTransform', () => { | |
this.instance.isCurrentSlide(e) && this.onRefresh(); | |
}); | |
this.instance.isCurrentSlide(e) && this.onRefresh(); | |
} | |
createContainer() { | |
let t = this.instance.container; | |
if (!t) { | |
return null; | |
} | |
let e = this.option('parentEl') || t, i = e.querySelector('.fancybox__toolbar'); | |
return i || (i = document.createElement('div'), y(i, 'fancybox__toolbar'), e.prepend(i)), i.addEventListener('click', this.onClick, { | |
passive: false, | |
capture: true | |
}), t && y(t, 'has-toolbar'), this.container = i, i; | |
} | |
createEl(t) { | |
let e = this.instance, i = e.carousel; | |
if (!i || t === 'toggleFS' || t === 'fullscreen' && !Vi()) { | |
return null; | |
} | |
let n = null, s = i.slides.length || 0, a = 0, r = 0; | |
for (let c of i.slides) | |
(c.panzoom || c.type === 'image') && a++, (c.type === 'image' || c.downloadSrc) && r++; | |
if (s < 2 && [ | |
'infobar', | |
'prev', | |
'next' | |
].includes(t)) { | |
return n; | |
} | |
if (Ee[t] !== void 0 && !a || t === 'download' && !r) { | |
return null; | |
} | |
if (t === 'thumbs') { | |
let c = e.plugins.Thumbs; | |
if (!c || !c.isEnabled) { | |
return null; | |
} | |
} | |
if (t === 'slideshow' && (!i.plugins.Autoplay || s < 2)) { | |
return null; | |
} | |
if (Ee[t] !== void 0) { | |
let c = Ee[t]; | |
n = document.createElement('button'); | |
n.setAttribute('title', this.instance.localize(`{{${ t.toUpperCase() }}}`)); | |
y(n, 'f-button'); | |
c.action && (n.dataset.panzoomAction = c.action); | |
c.change && (n.dataset.panzoomChange = JSON.stringify(c.change)); | |
n.appendChild(S(this.instance.localize(c.icon))); | |
} else { | |
let c = (this.option('items') || [])[t]; | |
c && (n = S(this.instance.localize(c.tpl)), typeof c.click == 'function' && n.addEventListener('click', d => { | |
d.preventDefault(); | |
d.stopPropagation(); | |
typeof c.click == 'function' && c.click.call(this, this, d); | |
})); | |
} | |
let l = n?.querySelector('svg'); | |
if (l) { | |
for (let [c, d] of Object.entries(is)) | |
l.getAttribute(c) || l.setAttribute(c, String(d)); | |
} | |
return n; | |
} | |
removeContainer() { | |
let t = this.container; | |
t && t.remove(); | |
this.container = null; | |
this.state = it.Disabled; | |
let e = this.instance.container; | |
e && x(e, 'has-toolbar'); | |
} | |
attach() { | |
let t = this, e = t.instance; | |
e.on('Carousel.initSlides', t.onReady); | |
e.on('done', t.onDone); | |
e.on([ | |
'reveal', | |
'Carousel.change' | |
], t.onChange); | |
t.onReady(t.instance); | |
} | |
detach() { | |
let t = this, e = t.instance; | |
e.off('Carousel.initSlides', t.onReady); | |
e.off('done', t.onDone); | |
e.off([ | |
'reveal', | |
'Carousel.change' | |
], t.onChange); | |
t.removeContainer(); | |
} | |
}; | |
Object.defineProperty(_t, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: es | |
}); | |
var ns = { | |
Hash: class extends D { | |
onReady() { | |
ft = false; | |
} | |
onChange(o) { | |
et && clearTimeout(et); | |
let {hash: t} = Ii(), {hash: e} = zt(), i = o.isOpeningSlide(o.getSlide()); | |
i && (yi = e === t ? '' : e); | |
t && t !== e && (et = setTimeout(() => { | |
try { | |
if (o.state === A.Ready) { | |
let n = 'replaceState'; | |
i && !Yt && (n = 'pushState', Yt = true); | |
window.history[n]({}, document.title, window.location.pathname + window.location.search + t); | |
} | |
} catch { | |
} | |
}, 300)); | |
} | |
onClose(o) { | |
if (et && clearTimeout(et), !ft && Yt) { | |
return Yt = false, ft = false, void window.history.back(); | |
} | |
if (!ft) { | |
try { | |
window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (yi || '')); | |
} catch { | |
} | |
} | |
} | |
attach() { | |
let o = this.instance; | |
o.on('ready', this.onReady); | |
o.on([ | |
'Carousel.ready', | |
'Carousel.change' | |
], this.onChange); | |
o.on('close', this.onClose); | |
} | |
detach() { | |
let o = this.instance; | |
o.off('ready', this.onReady); | |
o.off([ | |
'Carousel.ready', | |
'Carousel.change' | |
], this.onChange); | |
o.off('close', this.onClose); | |
} | |
static parseURL() { | |
return zt(); | |
} | |
static startFromUrl() { | |
Si(); | |
} | |
static destroy() { | |
window.removeEventListener('hashchange', Ti, false); | |
} | |
}, | |
Html: jt, | |
Images: Tt, | |
Slideshow: Ht, | |
Thumbs: Pt, | |
Toolbar: _t | |
}, _ = o => typeof o == 'string', Yi = function () { | |
var o = window.getSelection(); | |
return !!o && o.type === 'Range'; | |
}, N, R = null, tt = null, Oi = 0, Ni = 0, Ri = 0, ki = 0, lt = new Map(), ss = 0, M = class o extends Qt { | |
get isIdle() { | |
return this.idle; | |
} | |
get isCompact() { | |
return this.option('compact'); | |
} | |
constructor(t = [], e = {}, i = {}) { | |
super(e); | |
Object.defineProperty(this, 'userSlides', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: [] | |
}); | |
Object.defineProperty(this, 'userPlugins', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: {} | |
}); | |
Object.defineProperty(this, 'idle', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
Object.defineProperty(this, 'idleTimer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'clickTimer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'pwt', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'ignoreFocusChange', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
Object.defineProperty(this, 'startedFs', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: false | |
}); | |
Object.defineProperty(this, 'state', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: A.Init | |
}); | |
Object.defineProperty(this, 'id', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: 0 | |
}); | |
Object.defineProperty(this, 'container', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'caption', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'footer', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'carousel', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'lastFocus', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: null | |
}); | |
Object.defineProperty(this, 'prevMouseMoveEvent', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: void 0 | |
}); | |
N || (N = Vi()); | |
this.id = e.id || ++ss; | |
lt.set(this.id, this); | |
this.userSlides = t; | |
this.userPlugins = i; | |
queueMicrotask(() => { | |
this.init(); | |
}); | |
} | |
init() { | |
if (this.state === A.Destroy) { | |
return; | |
} | |
this.state = A.Init; | |
this.attachPlugins(Object.assign(Object.assign({}, o.Plugins), this.userPlugins)); | |
this.emit('init'); | |
this.emit('attachPlugins'); | |
this.option('hideScrollbar') === true && (() => { | |
if (!gt) { | |
return; | |
} | |
let e = document, i = e.body, n = e.documentElement; | |
if (i.classList.contains('hide-scrollbar')) { | |
return; | |
} | |
let s = window.innerWidth - n.getBoundingClientRect().width, a = parseFloat(window.getComputedStyle(i).marginRight); | |
s < 0 && (s = 0); | |
n.style.setProperty('--fancybox-scrollbar-compensate', `${ s }px`); | |
a && i.style.setProperty('--fancybox-body-margin', `${ a }px`); | |
i.classList.add('hide-scrollbar'); | |
})(); | |
this.initLayout(); | |
this.scale(); | |
let t = () => { | |
this.initCarousel(this.userSlides); | |
this.state = A.Ready; | |
this.attachEvents(); | |
this.emit('ready'); | |
setTimeout(() => { | |
this.container && this.container.setAttribute('aria-hidden', 'false'); | |
}, 16); | |
}; | |
this.option('Fullscreen.autoStart') && N && !N.isFullscreen() ? N.request().then(() => { | |
this.startedFs = true; | |
t(); | |
}).catch(() => t()) : t(); | |
} | |
initLayout() { | |
var t, e; | |
let i = this.option('parentEl') || document.body, n = S(this.localize(this.option('tpl.main') || '')); | |
if (n) { | |
if (n.setAttribute('id', `fancybox-${ this.id }`), n.setAttribute('aria-label', this.localize('{{MODAL}}')), n.classList.toggle('is-compact', this.isCompact), y(n, this.option('mainClass') || ''), y(n, 'is-opening'), this.container = n, this.footer = n.querySelector('.fancybox__footer'), i.appendChild(n), y(document.documentElement, 'with-fancybox'), R && tt || (R = document.createElement('span'), y(R, 'fancybox-focus-guard'), R.setAttribute('tabindex', '0'), R.setAttribute('aria-hidden', 'true'), R.setAttribute('aria-label', 'Focus guard'), tt = R.cloneNode(), (t = n.parentElement) === null || t === void 0 || t.insertBefore(R, n), (e = n.parentElement) === null || e === void 0 || e.append(tt)), n.addEventListener('mousedown', s => { | |
Oi = s.pageX; | |
Ni = s.pageY; | |
x(n, 'is-using-tab'); | |
}), this.option('closeExisting')) { | |
for (let s of lt.values()) | |
s.id !== this.id && s.close(); | |
} else { | |
this.option('animated') && (y(n, 'is-animated'), setTimeout(() => { | |
this.isClosing() || x(n, 'is-animated'); | |
}, 350)); | |
} | |
this.emit('initLayout'); | |
} | |
} | |
initCarousel(t) { | |
let e = this.container; | |
if (!e) { | |
return; | |
} | |
let i = e.querySelector('.fancybox__carousel'); | |
if (!i) { | |
return; | |
} | |
let n = this.carousel = new ct(i, E({}, { | |
slides: t, | |
transition: 'fade', | |
Panzoom: { | |
lockAxis: this.option('dragToClose') ? 'xy' : 'x', | |
infinite: !!this.option('dragToClose') && 'y' | |
}, | |
Dots: false, | |
Navigation: { | |
classes: { | |
container: 'fancybox__nav', | |
button: 'f-button', | |
isNext: 'is-next', | |
isPrev: 'is-prev' | |
} | |
}, | |
initialPage: this.option('startIndex'), | |
l10n: this.option('l10n') | |
}, this.option('Carousel') || {})); | |
n.on('*', (s, a, ...r) => { | |
this.emit(`Carousel.${ a }`, s, ...r); | |
}); | |
n.on([ | |
'ready', | |
'change' | |
], () => { | |
this.manageCaption(); | |
}); | |
this.on('Carousel.removeSlide', (s, a, r) => { | |
this.clearContent(r); | |
r.state = void 0; | |
}); | |
n.on('Panzoom.touchStart', () => { | |
var s, a; | |
this.isCompact || this.endIdle(); | |
!((s = document.activeElement) === null || s === void 0) && s.closest('.f-thumbs') && ((a = this.container) === null || a === void 0 || a.focus()); | |
}); | |
n.on('settle', () => { | |
this.idleTimer || this.isCompact || !this.option('idle') || this.setIdle(); | |
this.option('autoFocus') && !this.isClosing && this.checkFocus(); | |
}); | |
this.option('dragToClose') && (n.on('Panzoom.afterTransform', (s, a) => { | |
let r = this.getSlide(); | |
if (r && Xe(r.el)) { | |
return; | |
} | |
let l = this.container; | |
if (l) { | |
let c = Math.abs(a.current.f), d = c < 1 ? '' : Math.max(0.5, Math.min(1, 1 - c / a.contentRect.fitHeight * 1.5)); | |
l.style.setProperty('--fancybox-ts', d ? '0s' : ''); | |
l.style.setProperty('--fancybox-opacity', d + ''); | |
} | |
}), n.on('Panzoom.touchEnd', (s, a, r) => { | |
var l; | |
let c = this.getSlide(); | |
if (c && Xe(c.el) || a.isMobile && document.activeElement && [ | |
'TEXTAREA', | |
'INPUT' | |
].indexOf((l = document.activeElement) === null || l === void 0 ? void 0 : l.nodeName) !== -1) { | |
return; | |
} | |
let d = Math.abs(a.dragOffset.y); | |
a.lockedAxis === 'y' && (d >= 200 || d >= 50 && a.dragOffset.time < 300) && (r && r.cancelable && r.preventDefault(), this.close(r, 'f-throwOut' + (a.current.f < 0 ? 'Up' : 'Down'))); | |
})); | |
n.on('change', s => { | |
var a; | |
let r = (a = this.getSlide()) === null || a === void 0 ? void 0 : a.triggerEl; | |
if (r) { | |
let l = new CustomEvent('slideTo', { | |
bubbles: true, | |
cancelable: true, | |
detail: s.page | |
}); | |
r.dispatchEvent(l); | |
} | |
}); | |
n.on([ | |
'refresh', | |
'change' | |
], s => { | |
let a = this.container; | |
if (!a) { | |
return; | |
} | |
for (let c of a.querySelectorAll('[data-fancybox-current-index]')) | |
c.innerHTML = s.page + 1; | |
for (let c of a.querySelectorAll('[data-fancybox-count]')) | |
c.innerHTML = s.pages.length; | |
if (!s.isInfinite) { | |
for (let c of a.querySelectorAll('[data-fancybox-next]')) | |
s.page < s.pages.length - 1 ? (c.removeAttribute('disabled'), c.removeAttribute('tabindex')) : (c.setAttribute('disabled', ''), c.setAttribute('tabindex', '-1')); | |
for (let c of a.querySelectorAll('[data-fancybox-prev]')) | |
s.page > 0 ? (c.removeAttribute('disabled'), c.removeAttribute('tabindex')) : (c.setAttribute('disabled', ''), c.setAttribute('tabindex', '-1')); | |
} | |
let r = this.getSlide(); | |
if (!r) { | |
return; | |
} | |
let l = r.downloadSrc || ''; | |
l || r.type !== 'image' || r.error || !_(r.src) || (l = r.src); | |
for (let c of a.querySelectorAll('[data-fancybox-download]')) { | |
let d = r.downloadFilename; | |
l ? (c.removeAttribute('disabled'), c.removeAttribute('tabindex'), c.setAttribute('href', l), c.setAttribute('download', d || l), c.setAttribute('target', '_blank')) : (c.setAttribute('disabled', ''), c.setAttribute('tabindex', '-1'), c.removeAttribute('href'), c.removeAttribute('download')); | |
} | |
}); | |
this.emit('initCarousel'); | |
} | |
attachEvents() { | |
let t = this, e = t.container; | |
if (!e) { | |
return; | |
} | |
e.addEventListener('click', t.onClick, { | |
passive: false, | |
capture: false | |
}); | |
e.addEventListener('wheel', t.onWheel, { | |
passive: false, | |
capture: false | |
}); | |
document.addEventListener('keydown', t.onKeydown, { | |
passive: false, | |
capture: true | |
}); | |
document.addEventListener('visibilitychange', t.onVisibilityChange, false); | |
document.addEventListener('mousemove', t.onMousemove); | |
t.option('trapFocus') && document.addEventListener('focus', t.onFocus, true); | |
window.addEventListener('resize', t.onResize); | |
let i = window.visualViewport; | |
i && (i.addEventListener('scroll', t.onResize), i.addEventListener('resize', t.onResize)); | |
} | |
detachEvents() { | |
let t = this, e = t.container; | |
if (!e) { | |
return; | |
} | |
document.removeEventListener('keydown', t.onKeydown, { | |
passive: false, | |
capture: true | |
}); | |
e.removeEventListener('wheel', t.onWheel, { | |
passive: false, | |
capture: false | |
}); | |
e.removeEventListener('click', t.onClick, { | |
passive: false, | |
capture: false | |
}); | |
document.removeEventListener('mousemove', t.onMousemove); | |
window.removeEventListener('resize', t.onResize); | |
let i = window.visualViewport; | |
i && (i.removeEventListener('resize', t.onResize), i.removeEventListener('scroll', t.onResize)); | |
document.removeEventListener('visibilitychange', t.onVisibilityChange, false); | |
document.removeEventListener('focus', t.onFocus, true); | |
} | |
scale() { | |
let t = this.container; | |
if (!t) { | |
return; | |
} | |
let e = window.visualViewport, i = Math.max(1, e?.scale || 1), n = '', s = '', a = ''; | |
if (e && i > 1) { | |
let r = `${ e.offsetLeft }px`, l = `${ e.offsetTop }px`; | |
n = e.width * i + 'px'; | |
s = e.height * i + 'px'; | |
a = `translate3d(${ r }, ${ l }, 0) scale(${ 1 / i })`; | |
} | |
t.style.transform = a; | |
t.style.width = n; | |
t.style.height = s; | |
} | |
onClick(t) { | |
var e; | |
let { | |
container: i, | |
isCompact: n | |
} = this; | |
if (!i || this.isClosing()) { | |
return; | |
} | |
!n && this.option('idle') && this.resetIdle(); | |
let s = t.composedPath()[0]; | |
if (s.closest('.fancybox-spinner') || s.closest('[data-fancybox-close]')) { | |
return t.preventDefault(), void this.close(t); | |
} | |
if (s.closest('[data-fancybox-prev]')) { | |
return t.preventDefault(), void this.prev(); | |
} | |
if (s.closest('[data-fancybox-next]')) { | |
return t.preventDefault(), void this.next(); | |
} | |
if (t.type === 'click' && t.detail === 0 || Math.abs(t.pageX - Oi) > 30 || Math.abs(t.pageY - Ni) > 30) { | |
return; | |
} | |
let a = document.activeElement; | |
if (Yi() && a && i.contains(a)) { | |
return; | |
} | |
if (n && ((e = this.getSlide()) === null || e === void 0 ? void 0 : e.type) === 'image') { | |
return void (this.clickTimer ? (clearTimeout(this.clickTimer), this.clickTimer = null) : this.clickTimer = setTimeout(() => { | |
this.toggleIdle(); | |
this.clickTimer = null; | |
}, 350)); | |
} | |
if (this.emit('click', t), t.defaultPrevented) { | |
return; | |
} | |
let r = false; | |
if (s.closest('.fancybox__content')) { | |
if (a) { | |
if (a.closest('[contenteditable]')) { | |
return; | |
} | |
s.matches(We) || a.blur(); | |
} | |
if (Yi()) { | |
return; | |
} | |
r = this.option('contentClick'); | |
} else { | |
s.closest('.fancybox__carousel') && !s.matches(We) && (r = this.option('backdropClick')); | |
} | |
r === 'close' ? (t.preventDefault(), this.close(t)) : r === 'next' ? (t.preventDefault(), this.next()) : r === 'prev' && (t.preventDefault(), this.prev()); | |
} | |
onWheel(t) { | |
let e = t.target, i = this.option('wheel', t); | |
e.closest('.fancybox__thumbs') && (i = 'slide'); | |
let n = i === 'slide', s = [ | |
-t.deltaX || 0, | |
-t.deltaY || 0, | |
-t.detail || 0 | |
].reduce(function (l, c) { | |
return Math.abs(c) > Math.abs(l) ? c : l; | |
}), a = Math.max(-1, Math.min(1, s)), r = Date.now(); | |
this.pwt && r - this.pwt < 300 ? n && t.preventDefault() : (this.pwt = r, this.emit('wheel', t, a), t.defaultPrevented || (i === 'close' ? (t.preventDefault(), this.close(t)) : i === 'slide' && (Gt(e) || (t.preventDefault(), this[a > 0 ? 'prev' : 'next']())))); | |
} | |
onScroll() { | |
window.scrollTo(Ri, ki); | |
} | |
onKeydown(t) { | |
if (!this.isTopmost()) { | |
return; | |
} | |
this.isCompact || !this.option('idle') || this.isClosing() || this.resetIdle(); | |
let e = t.key, i = this.option('keyboard'); | |
if (!i) { | |
return; | |
} | |
let n = t.composedPath()[0], s = document.activeElement && document.activeElement.classList, a = s && s.contains('f-button') || n.dataset.carouselPage || n.dataset.carouselIndex; | |
if (e !== 'Escape' && !a && C(n) && (n.isContentEditable || [ | |
'TEXTAREA', | |
'OPTION', | |
'INPUT', | |
'SELECT', | |
'VIDEO' | |
].indexOf(n.nodeName) !== -1) || (t.key === 'Tab' ? y(this.container, 'is-using-tab') : x(this.container, 'is-using-tab'), t.ctrlKey || t.altKey || t.shiftKey)) { | |
return; | |
} | |
this.emit('keydown', e, t); | |
let r = i[e]; | |
r && typeof this[r] == 'function' && (t.preventDefault(), this[r]()); | |
} | |
onResize() { | |
let t = this.container; | |
if (!t) { | |
return; | |
} | |
let e = this.isCompact; | |
t.classList.toggle('is-compact', e); | |
this.manageCaption(this.getSlide()); | |
this.isCompact ? this.clearIdle() : this.endIdle(); | |
this.scale(); | |
this.emit('resize'); | |
} | |
onFocus(t) { | |
this.isTopmost() && this.checkFocus(t); | |
} | |
onMousemove(t) { | |
this.prevMouseMoveEvent = t; | |
!this.isCompact && this.option('idle') && this.resetIdle(); | |
} | |
onVisibilityChange() { | |
document.visibilityState === 'visible' ? this.checkFocus() : this.endIdle(); | |
} | |
manageCloseBtn(t) { | |
let e = this.optionFor(t, 'closeButton') || false; | |
if (e === 'auto') { | |
let n = this.plugins.Toolbar; | |
if (n && n.state === it.Ready) { | |
return; | |
} | |
} | |
if (!e || !t.contentEl || t.closeBtnEl) { | |
return; | |
} | |
let i = this.option('tpl.closeButton'); | |
if (i) { | |
let n = S(this.localize(i)); | |
; | |
t.el && y(t.el, 'has-close-btn'); | |
} | |
} | |
manageCaption(t = void 0) { | |
var e, i; | |
let s = this.container; | |
if (!s) { | |
return; | |
} | |
x(s, 'has-caption'); | |
let a = this.isCompact || this.option('commonCaption'), r = !a; | |
if (this.caption && this.stop(this.caption), r && this.caption && (this.caption.remove(), this.caption = null), a && !this.caption) { | |
for (let u of ((e = this.carousel) === null || e === void 0 ? void 0 : e.slides) || []) | |
u.captionEl && (u.captionEl.remove(), u.captionEl = void 0, x(u.el, 'has-caption'), (i = u.el) === null || i === void 0 || i.removeAttribute('aria-labelledby')); | |
} | |
if (t || (t = this.getSlide()), !t || a && !this.isCurrentSlide(t)) { | |
return; | |
} | |
let l = t.el, c = this.optionFor(t, 'caption', ''); | |
if (!c) { | |
return void (a && this.caption && this.animate(this.caption, 'f-fadeOut', () => { | |
this.caption && (this.caption.innerHTML = ''); | |
})); | |
} | |
let d = null; | |
if (r) { | |
if (d = t.captionEl || null, l && !d) { | |
let u = 'fancybox__caption' + `_${ this.id }_${ t.index }`; | |
d = document.createElement('div'); | |
y(d, 'fancybox__caption'); | |
d.setAttribute('id', u); | |
; | |
y(l, 'has-caption'); | |
l.setAttribute('aria-labelledby', u); | |
} | |
} else { | |
d = this.caption; | |
d || (d = s.querySelector('.fancybox__caption')); | |
!d && (d = document.createElement('div'), d.dataset.fancyboxCaption = '', y(d, 'fancybox__caption'), (this.footer || s).prepend(d)); | |
y(s, 'has-caption'); | |
this.caption = d; | |
} | |
d && (d.innerHTML = '', _(c) || typeof c == 'number' ? d.innerHTML = c + '' : c instanceof HTMLElement && d.appendChild(c)); | |
} | |
checkFocus(t) { | |
this.focus(t); | |
} | |
focus(t) { | |
var e; | |
if (this.ignoreFocusChange) { | |
return; | |
} | |
let i = document.activeElement || null, n = t?.target || null, s = this.container, a = (e = this.carousel) === null || e === void 0 ? void 0 : e.viewport; | |
if (!s || !a || !t && i && s.contains(i)) { | |
return; | |
} | |
let r = this.getSlide(), l = r && r.state === Z.Ready ? r.el : null; | |
if (!l || l.contains(i) || s === i) { | |
return; | |
} | |
t && t.cancelable && t.preventDefault(); | |
this.ignoreFocusChange = true; | |
let c = Array.from(s.querySelectorAll(We)), d = [], u = null; | |
for (let h of c) { | |
let b = !h.offsetParent || !!h.closest('[aria-hidden="true"]'), p = l && l.contains(h), f = !a.contains(h); | |
if (h === s || (p || f) && !b) { | |
d.push(h); | |
let g = h.dataset.origTabindex; | |
g !== void 0 && g && (h.tabIndex = parseFloat(g)); | |
h.removeAttribute('data-orig-tabindex'); | |
!h.hasAttribute('autoFocus') && u || (u = h); | |
} else { | |
let g = h.dataset.origTabindex === void 0 ? h.getAttribute('tabindex') || '' : h.dataset.origTabindex; | |
g && (h.dataset.origTabindex = g); | |
; | |
} | |
} | |
let m = null; | |
t ? (!n || d.indexOf(n) < 0) && (m = u || s, d.length && (i === tt ? m = d[0] : this.lastFocus !== s && i !== R || (m = d[d.length - 1]))) : m = r && r.type === 'image' ? s : u || s; | |
m && Fi(m); | |
this.lastFocus = document.activeElement; | |
this.ignoreFocusChange = false; | |
} | |
next() { | |
let t = this.carousel; | |
t && t.pages.length > 1 && t.slideNext(); | |
} | |
prev() { | |
let t = this.carousel; | |
t && t.pages.length > 1 && t.slidePrev(); | |
} | |
jumpTo(...t) { | |
this.carousel && this.carousel.slideTo(...t); | |
} | |
isTopmost() { | |
var t; | |
return ((t = o.getInstance()) === null || t === void 0 ? void 0 : t.id) == this.id; | |
} | |
animate(t = null, e = '', i) { | |
if (!t || !e) { | |
return void (i && i()); | |
} | |
this.stop(t); | |
let n = s => { | |
s.target === t && t.dataset.animationName && (t.removeEventListener('animationend', n), delete t.dataset.animationName, i && i(), x(t, e)); | |
}; | |
t.dataset.animationName = e; | |
t.addEventListener('animationend', n); | |
y(t, e); | |
} | |
stop(t) { | |
t && t.dispatchEvent(new CustomEvent('animationend', { | |
bubbles: false, | |
cancelable: true, | |
currentTarget: t | |
})); | |
} | |
setContent(t, e = '', i = true) { | |
if (this.isClosing()) { | |
return; | |
} | |
let n = t.el; | |
if (!n) { | |
return; | |
} | |
let s = null; | |
if (C(e) ? s = e : (s = S(e + ''), C(s) || (s = document.createElement('div'), s.innerHTML = e + '')), [ | |
'img', | |
'picture', | |
'iframe', | |
'video', | |
'audio' | |
].includes(s.nodeName.toLowerCase())) { | |
let a = document.createElement('div'); | |
a.appendChild(s); | |
s = a; | |
} | |
C(s) && t.filter && !t.error && (s = s.querySelector(t.filter)); | |
s && C(s) ? (y(s, 'fancybox__content'), t.id && s.setAttribute('id', t.id), n.classList.add(`has-${ t.error ? 'error' : t.type || 'unknown' }`), n.prepend(s), s.style.display === 'none' && (s.style.display = ''), getComputedStyle(s).getPropertyValue('display') === 'none' && (s.style.display = t.display || this.option('defaultDisplay') || 'flex'), t.contentEl = s, i && this.revealContent(t), this.manageCloseBtn(t), this.manageCaption(t)) : this.setError(t, '{{ELEMENT_NOT_FOUND}}'); | |
} | |
revealContent(t, e) { | |
let i = t.el, n = t.contentEl; | |
i && n && (this.emit('reveal', t), this.hideLoading(t), t.state = Z.Opening, (e = this.isOpeningSlide(t) ? e === void 0 ? this.optionFor(t, 'showClass') : e : 'f-fadeIn') ? this.animate(n, e, () => { | |
this.done(t); | |
}) : this.done(t)); | |
} | |
done(t) { | |
this.isClosing() || (t.state = Z.Ready, this.emit('done', t), y(t.el, 'is-done'), this.isCurrentSlide(t) && this.option('autoFocus') && queueMicrotask(() => { | |
var e; | |
(e = t.panzoom) === null || e === void 0 || e.updateControls(); | |
this.option('autoFocus') && this.focus(); | |
}), this.isOpeningSlide(t) && (x(this.container, 'is-opening'), !this.isCompact && this.option('idle') && this.setIdle())); | |
} | |
isCurrentSlide(t) { | |
let e = this.getSlide(); | |
return !(!t || !e) && e.index === t.index; | |
} | |
isOpeningSlide(t) { | |
var e, i; | |
return ((e = this.carousel) === null || e === void 0 ? void 0 : e.prevPage) === null && t && t.index === ((i = this.getSlide()) === null || i === void 0 ? void 0 : i.index); | |
} | |
showLoading(t) { | |
; | |
let e = t.el; | |
e && (y(e, 'is-loading'), this.emit('loading', t), t.spinnerEl || setTimeout(() => { | |
if (!this.isClosing() && !t.spinnerEl && t.state === Z.Loading) { | |
let i = S(ze); | |
y(i, 'fancybox-spinner'); | |
; | |
e.prepend(i); | |
this.animate(i, 'f-fadeIn'); | |
} | |
}, 250)); | |
} | |
hideLoading(t) { | |
let e = t.el; | |
if (!e) { | |
return; | |
} | |
let i = t.spinnerEl; | |
this.isClosing() ? i?.remove() : (x(e, 'is-loading'), i && this.animate(i, 'f-fadeOut', () => { | |
i.remove(); | |
}), t.state === Z.Loading && (this.emit('loaded', t), t.state = Z.Ready)); | |
} | |
setError(t, e) { | |
if (this.isClosing()) { | |
return; | |
} | |
let i = new Event('error', { | |
bubbles: true, | |
cancelable: true | |
}); | |
if (this.emit('error', i, t), i.defaultPrevented) { | |
return; | |
} | |
; | |
this.hideLoading(t); | |
this.clearContent(t); | |
let n = document.createElement('div'); | |
n.classList.add('fancybox-error'); | |
n.innerHTML = this.localize(e || '<p>{{ERROR}}</p>'); | |
this.setContent(t, n); | |
} | |
clearContent(t) { | |
if (t.state === void 0) { | |
return; | |
} | |
this.emit('clearContent', t); | |
t.contentEl && (t.contentEl.remove(), t.contentEl = void 0); | |
let e = t.el; | |
e && (x(e, 'has-error'), x(e, 'has-unknown'), x(e, `has-${ t.type || 'unknown' }`)); | |
t.closeBtnEl && t.closeBtnEl.remove(); | |
; | |
t.captionEl && t.captionEl.remove(); | |
; | |
t.spinnerEl && t.spinnerEl.remove(); | |
; | |
} | |
getSlide() { | |
var t; | |
let e = this.carousel; | |
return ((t = e?.pages[e?.page]) === null || t === void 0 ? void 0 : t.slides[0]) || void 0; | |
} | |
close(t, e) { | |
if (this.isClosing()) { | |
return; | |
} | |
let i = new Event('shouldClose', { | |
bubbles: true, | |
cancelable: true | |
}); | |
if (this.emit('shouldClose', i, t), i.defaultPrevented) { | |
return; | |
} | |
t && t.cancelable && (t.preventDefault(), t.stopPropagation()); | |
let n = () => { | |
this.proceedClose(t, e); | |
}; | |
this.startedFs && N && N.isFullscreen() ? Promise.resolve(N.exit()).then(() => n()) : n(); | |
} | |
clearIdle() { | |
this.idleTimer && clearTimeout(this.idleTimer); | |
this.idleTimer = null; | |
} | |
setIdle(t = false) { | |
let e = () => { | |
this.clearIdle(); | |
this.idle = true; | |
y(this.container, 'is-idle'); | |
this.emit('setIdle'); | |
}; | |
if (this.clearIdle(), !this.isClosing()) { | |
if (t) { | |
e(); | |
} else { | |
let i = this.option('idle'); | |
i && (this.idleTimer = setTimeout(e, i)); | |
} | |
} | |
} | |
endIdle() { | |
this.clearIdle(); | |
this.idle && !this.isClosing() && (this.idle = false, x(this.container, 'is-idle'), this.emit('endIdle')); | |
} | |
resetIdle() { | |
this.endIdle(); | |
this.setIdle(); | |
} | |
toggleIdle() { | |
this.idle ? this.endIdle() : this.setIdle(true); | |
} | |
toggleFullscreen() { | |
N && (N.isFullscreen() ? N.exit() : N.request().then(() => { | |
this.startedFs = true; | |
})); | |
} | |
isClosing() { | |
return [ | |
A.Closing, | |
A.CustomClosing, | |
A.Destroy | |
].includes(this.state); | |
} | |
proceedClose(t, e) { | |
var i, n; | |
this.state = A.Closing; | |
this.clearIdle(); | |
this.detachEvents(); | |
let s = this.container, a = this.carousel, r = this.getSlide(), l = r && this.option('placeFocusBack') ? r.triggerEl || this.option('triggerEl') : null; | |
if (l && (Gi(l) ? Fi(l) : l.focus()), s && (x(s, 'is-opening'), y(s, 'is-closing'), s.setAttribute('aria-hidden', 'true'), this.option('animated') && y(s, 'is-animated'), s.style.pointerEvents = 'none'), a) { | |
a.clearTransitions(); | |
(i = a.panzoom) === null || i === void 0 || i.destroy(); | |
(n = a.plugins.Navigation) === null || n === void 0 || n.detach(); | |
for (let c of a.slides) { | |
c.state = Z.Closing; | |
this.hideLoading(c); | |
let d = c.contentEl; | |
d && this.stop(d); | |
let u = c?.panzoom; | |
u && (u.stop(), u.detachEvents(), u.detachObserver()); | |
this.isCurrentSlide(c) || a.emit('removeSlide', c); | |
} | |
} | |
Ri = window.scrollX; | |
ki = window.scrollY; | |
window.addEventListener('scroll', this.onScroll); | |
this.emit('close', t); | |
this.state !== A.CustomClosing ? (e === void 0 && r && (e = this.optionFor(r, 'hideClass')), e && r ? (this.animate(r.contentEl, e, () => { | |
a && a.emit('removeSlide', r); | |
}), setTimeout(() => { | |
this.destroy(); | |
}, 500)) : this.destroy()) : setTimeout(() => { | |
this.destroy(); | |
}, 500); | |
} | |
destroy() { | |
var t; | |
if (this.state === A.Destroy) { | |
return; | |
} | |
window.removeEventListener('scroll', this.onScroll); | |
this.state = A.Destroy; | |
(t = this.carousel) === null || t === void 0 || t.destroy(); | |
let e = this.container; | |
e && e.remove(); | |
lt.delete(this.id); | |
let i = o.getInstance(); | |
i ? i.focus() : (R && (R.remove(), R = null), tt && (tt.remove(), tt = null), x(document.documentElement, 'with-fancybox'), (() => { | |
if (!gt) { | |
return; | |
} | |
let n = document, s = n.body; | |
s.classList.remove('hide-scrollbar'); | |
s.style.setProperty('--fancybox-body-margin', ''); | |
n.documentElement.style.setProperty('--fancybox-scrollbar-compensate', ''); | |
})(), this.emit('destroy')); | |
} | |
static bind(t, e, i) { | |
if (!gt) { | |
return; | |
} | |
let n, s = '', a = { | |
Carousel: a.Carousel || {}, | |
innerHTML: await n.text() | |
}; | |
if (t === void 0 ? n = document.body : _(t) ? (n = document.body, s = t, typeof e == 'object' && (a = e || {})) : (n = t, _(e) && (s = e), typeof i == 'object' && (a = i || {})), !n || !C(n)) { | |
return; | |
} | |
s = s || '[data-fancybox]'; | |
let r = o.openers.get(n) || new Map(); | |
r.set(s, a); | |
o.openers.set(n, r); | |
r.size === 1 && n.addEventListener('click', o.fromEvent); | |
} | |
static unbind(t, e) { | |
let i, n = ''; | |
if (_(t) ? (i = document.body, n = t) : (i = t, _(e) && (n = e)), !i) { | |
return; | |
} | |
let s = o.openers.get(i); | |
s && n && s.delete(n); | |
n && s || (o.openers.delete(i), i.removeEventListener('click', o.fromEvent)); | |
} | |
static destroy() { | |
let t; | |
for (; t = o.getInstance();) { | |
t.destroy(); | |
} | |
for (let e of o.openers.keys()) | |
e.removeEventListener('click', o.fromEvent); | |
o.openers = new Map(); | |
} | |
static fromEvent(t) { | |
if (t.defaultPrevented || t.button && t.button !== 0 || t.ctrlKey || t.metaKey || t.shiftKey) { | |
return; | |
} | |
let e = t.composedPath()[0], i = e.closest('[data-fancybox-trigger]'); | |
if (i) { | |
let b = i.dataset.fancyboxTrigger || '', p = document.querySelectorAll(`[data-fancybox="${ b }"]`), f = parseInt(i.dataset.fancyboxIndex || '', 10) || 0; | |
e = p[f] || e; | |
} | |
if (!(e && e instanceof Element)) { | |
return; | |
} | |
let n, s, a, r; | |
if ([...o.openers].reverse().find(([b, p]) => !(!b.contains(e) || ![...p].reverse().find(([f, g]) => { | |
let F = e.closest(f); | |
return !!F && (n = b, s = f, a = F, r = g, true); | |
}))), !n || !s || !a) { | |
return; | |
} | |
r = r || {}; | |
t.preventDefault(); | |
e = a; | |
let l = [], c = E({}, Ie, r); | |
c.event = t; | |
c.triggerEl = e; | |
c.delegate = i; | |
let d = c.groupAll, u = c.groupAttr, m = u && e ? e.getAttribute(`${ u }`) : ''; | |
if ((!e || m || d) && (l = [].slice.call(n.querySelectorAll(s))), e && !d && (l = m ? l.filter(b => b.getAttribute(`${ u }`) === m) : [e]), !l.length) { | |
return; | |
} | |
let h = o.getInstance(); | |
return h && h.options.triggerEl && l.indexOf(h.options.triggerEl) > -1 ? void 0 : (e && (c.startIndex = l.indexOf(e)), o.fromNodes(l, c)); | |
} | |
static fromSelector(t, e, i) { | |
let n = null, s = '', a = {}; | |
if (_(t) ? (n = document.body, s = t, typeof e == 'object' && (a = e || {})) : t instanceof HTMLElement && _(e) && (n = t, s = e, typeof i == 'object' && (a = i || {})), !n || !s) { | |
return false; | |
} | |
let r = o.openers.get(n); | |
return !!r && (a = E({}, r.get(s) || {}, a), !!a && o.fromNodes(Array.from(n.querySelectorAll(s)), a)); | |
} | |
static fromNodes(t, e) { | |
e = E({}, Ie, e || {}); | |
let i = []; | |
for (let n of t) { | |
let s = n.dataset || {}, a = s.src || n.getAttribute('href') || n.getAttribute('currentSrc') || n.getAttribute('src') || void 0, r, l = e.delegate, c; | |
l && i.length === e.startIndex && (r = l instanceof HTMLImageElement ? l : l.querySelector('img:not([aria-hidden])')); | |
r || (r = n instanceof HTMLImageElement ? n : n.querySelector('img:not([aria-hidden])')); | |
r && (c = r.currentSrc || r.src || void 0, !c && r.dataset && (c = r.dataset.lazySrc || r.dataset.src || void 0)); | |
let d = { | |
src: a, | |
triggerEl: n, | |
thumbEl: r, | |
thumbElSrc: c, | |
thumbSrc: c | |
}; | |
for (let u in s) { | |
let m = s[u] + ''; | |
m = m !== 'false' && (m === 'true' || m); | |
d[u] = m; | |
} | |
i.push(d); | |
} | |
return new o(i, e); | |
} | |
static getInstance(t) { | |
return t ? lt.get(t) : Array.from(lt.values()).reverse().find(e => !e.isClosing() && e) || null; | |
} | |
static getSlide() { | |
var t; | |
return ((t = o.getInstance()) === null || t === void 0 ? void 0 : t.getSlide()) || null; | |
} | |
static show(t = [], e = {}) { | |
return new o(t, e); | |
} | |
static next() { | |
let t = o.getInstance(); | |
t && t.next(); | |
} | |
static prev() { | |
let t = o.getInstance(); | |
t && t.prev(); | |
} | |
static close(t = true, ...e) { | |
if (t) { | |
for (let i of lt.values()) | |
i.close(...e); | |
} else { | |
let i = o.getInstance(); | |
i && i.close(...e); | |
} | |
} | |
}; | |
Object.defineProperty(M, 'version', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: '5.0.36' | |
}); | |
Object.defineProperty(M, 'defaults', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: Ie | |
}); | |
Object.defineProperty(M, 'Plugins', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: ns | |
}); | |
Object.defineProperty(M, 'openers', { | |
enumerable: true, | |
configurable: true, | |
writable: true, | |
value: new Map() | |
}); | |
var Kt = class extends V { | |
submit(o) { | |
o.preventDefault(); | |
this.fieldTarget.classList.remove('animate-error'); | |
let t = o.target.code.value; | |
if (t = t.toLowerCase(), t = t.replace(/[^a-z0-9?]/gi, ''), document.getElementById(t)) { | |
this.fancyContent(t); | |
} else { | |
if (t.length < 2) { | |
this.flashError(); | |
} else { | |
this.fieldTarget.setAttribute('readonly', true); | |
this.buttonTarget.setAttribute('disabled', true); | |
window.hasOwnProperty('plausible') && window.plausible('Submit', { props: { code: t } }); | |
let i = new FormData(); | |
i.append('code', t); | |
fetch('https://mystery.thisisnotawebsitedotcom.com/', { | |
method: 'POST', | |
body: i | |
}).then(async n => { | |
if (!n.ok) { | |
this.flashError(); | |
} else { | |
let s = n.headers.get('content-type'), a = document.createElement('div'); | |
a.setAttribute('id', t); | |
a.classList.add('hidden', 'html'); | |
; | |
document.body.appendChild(a); | |
this.fancyContent(t); | |
} | |
this.fieldTarget.removeAttribute('readonly'); | |
this.buttonTarget.removeAttribute('disabled'); | |
}); | |
} | |
} | |
} | |
flashError() { | |
this.fieldTarget.offsetHeight; | |
this.fieldTarget.classList.add('animate-error'); | |
} | |
fancyContent(o) { | |
new M([{ | |
src: `#${ o }`, | |
type: 'inline' | |
}], { | |
backdropClick: false, | |
Toolbar: { | |
display: { | |
left: [], | |
middle: [], | |
right: ['close'] | |
} | |
} | |
}); | |
} | |
expandImage(o) { | |
new M([{ src: o.target.src }], { | |
backdropClick: 'toggleZoom', | |
Toolbar: { | |
display: { | |
left: [], | |
middle: [], | |
right: ['close'] | |
} | |
} | |
}); | |
} | |
randomizeError() { | |
if (this.hasBubbleTarget) { | |
let o = [ | |
'Oops, the Mystery Shack is currently experiencing some delays dude! Please bare with us as we figure out which wire goes where!', | |
'Lets see... the blue wire is connected to the....hip bone....', | |
'So what I wanna know is, why are cryptic riddles always written down on tattered yellowed parchment. Get some normal paper dude!', | |
'Still comin, dudes! In the meantime, please <a href=\'https://files.thisisnotawebsitedotcom.com/is-it-time-yet/the-great-gatsby.pdf\' target=\'_blank\'>enjoy this fine literature</a> while you wait. People are saying its the book of the summer!', | |
'In the meantime, experience some <a href=\'https://www.youtube.com/watch?v=qQJorCFgEHg\' target=\'_blank\'>soothing tunes</a> while you wait. They drown out the rage, dude!', | |
'I tried to explain to Mr Pines how to open a PDF one time. He got so angry and confused that he punched through my Funko shelf! Many brave Funkos were lost that day...', | |
'My favorite Otter Pop is Sir Isaac Lime. But Louie Bloo is pretty cool too. Which is your favorite Otter Pop? Sound off in chat!', | |
'If the ICEE bear was real, I wonder if he would be my friend...', | |
'Hopefully nobody was expecting anything too crazy , heh heh!', | |
'Hey dude, did you know that computers are filled with ghouls? That\u2019s a fact.', | |
'I\u2019M gonna watch YOU. You\u2019re the website now, dude!', | |
'To quote a great man, \u201Ceverythings gonna be alright...rockabye\u201D', | |
'I wonder if its possible to taste your own tongue. Im gonna get to the bottom of this,dude!', | |
'Boy that counter is MESSED UP. I guess we\u2019ll be ready when it finally reaches the bottom of....math?', | |
'Man, I tried to look at that Bill Book and it was just a bunch of static and the words \u201CHE\u2019S UNCORRUPTABLE.\u201D Whats that mean? Beats me, dawg!', | |
'Are you Blanchin? Girl we blanchin! I live up in a- dang, still in my head!', | |
'If I can\u2019t get this fixed, this WILL be the Final Countdown, dudes!', | |
'Ugh man did you see the new <u>Swordbirth: Rise of the Swordians: Age of Swords</u> DLC just got delayed AGAIN? Don\u2019t they understand, as a consumer, my time is valuable!?<br/>...<br/>I wonder if I could make a hat small enough to fit on a bird.', | |
'<img src=\'data:image/png;base64,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\' style=\'width: 100%\' />' | |
], t = Math.floor(Math.random() * o.length); | |
o[t].includes('data:image') && (t = Math.floor(Math.random() * o.length)); | |
this.bubbleTarget.innerHTML = o[t]; | |
o[t].includes('data:image') && this.hasLayerTarget ? this.layerTarget.classList.remove('hidden') : this.layerTarget.classList.add('hidden'); | |
} | |
} | |
}; | |
Ft(Kt, 'targets', [ | |
'button', | |
'field', | |
'bubble', | |
'layer' | |
]); | |
var os = { | |
'./controllers/countdown_controller.js': Be, | |
'./controllers/secrets_controller.js': Te | |
}, Hi = os; | |
window.Stimulus = Lt.start(); | |
Object.entries(Hi).forEach(([o, t]) => { | |
if (o.includes('_controller.') || o.includes('-controller.')) { | |
let e = o.replace('./controllers/', '').replace(/[_-]controller\..*$/, '').replace(/_/g, '-').replace(/\//g, '--'); | |
Stimulus.register(e, t.default); | |
} | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment