@behold/widget 0.5.56 → 0.5.57
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/ElasticCarousel-WWMTzi-V.js +1032 -0
- package/dist/ErrorMessage-tHLrPf_h.js +110 -0
- package/dist/GalleryWall-Jlau7S7U.js +354 -0
- package/dist/Grid-2Aag90e0.js +338 -0
- package/dist/PopoverGallery-pssVDO_O.js +1905 -0
- package/dist/Widget.d.ts.map +1 -1
- package/dist/base-GZO73SkY.js +1220 -0
- package/dist/caret-right-S2XSTDFy.js +5 -0
- package/dist/index-R4lEDZFo.js +985 -0
- package/dist/index.js +1 -1
- package/dist/resizeObserver-OlrW1x9X.js +454 -0
- package/package.json +1 -1
- package/dist/ElasticCarousel-s2sX3nIq.js +0 -1
- package/dist/ErrorMessage-3rbOheq9.js +0 -1
- package/dist/GalleryWall-mEjc2b_H.js +0 -1
- package/dist/Grid-x7FHVqft.js +0 -1
- package/dist/PopoverGallery-tM2duxr5.js +0 -1
- package/dist/base-DWXYuUGq.js +0 -1
- package/dist/caret-right-xsqAZl9R.js +0 -1
- package/dist/index-Gpp9x18n.js +0 -1
- package/dist/resizeObserver--rsjm-GV.js +0 -1
@@ -0,0 +1,1905 @@
|
|
1
|
+
import { t as throttle, e as getClosestShadowRootOrDocument, c as createElement, a as setClasses, f as forceLayout, p as pushWithLimit, j as getMostVisible, B as BaseElement, k as announceToScreenReader, l as getTruncatedText, h as hasChanges } from './index-R4lEDZFo.js';
|
2
|
+
import { a as Video, c as Image, R as RGBStringToHSLArray } from './base-GZO73SkY.js';
|
3
|
+
import { c as caretLeftIcon, a as caretRightIcon } from './caret-right-S2XSTDFy.js';
|
4
|
+
|
5
|
+
let root = document;
|
6
|
+
let containerEl = null;
|
7
|
+
let tabbableEls = new Set();
|
8
|
+
let excludedEls = new Set();
|
9
|
+
let mutationObserver = new MutationObserver(handleMutation);
|
10
|
+
let trapped = false;
|
11
|
+
function getTabbableEls(container) {
|
12
|
+
const treeWalker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
|
13
|
+
acceptNode: function (node) {
|
14
|
+
return node.tabIndex >= 0
|
15
|
+
? NodeFilter.FILTER_ACCEPT
|
16
|
+
: NodeFilter.FILTER_SKIP;
|
17
|
+
},
|
18
|
+
});
|
19
|
+
const tabbable = [];
|
20
|
+
let currNode = null;
|
21
|
+
while ((currNode = treeWalker.nextNode())) {
|
22
|
+
{
|
23
|
+
tabbable.push(currNode);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
return tabbable;
|
27
|
+
}
|
28
|
+
function isVisible(el) {
|
29
|
+
return new Promise((resolve) => {
|
30
|
+
const ob = new IntersectionObserver((entries) => {
|
31
|
+
resolve(entries[0].isIntersecting);
|
32
|
+
ob.disconnect();
|
33
|
+
});
|
34
|
+
ob.observe(el);
|
35
|
+
});
|
36
|
+
}
|
37
|
+
function isTabbable(el) {
|
38
|
+
return new Promise(async (resolve) => {
|
39
|
+
if (el.disabled) {
|
40
|
+
resolve(false);
|
41
|
+
return;
|
42
|
+
}
|
43
|
+
const visible = await isVisible(el);
|
44
|
+
if (!visible) {
|
45
|
+
resolve(false);
|
46
|
+
return;
|
47
|
+
}
|
48
|
+
resolve([...excludedEls].every((excludedEl) => !excludedEl.contains(el)));
|
49
|
+
});
|
50
|
+
}
|
51
|
+
async function getCurrentTabbable() {
|
52
|
+
const promiseArray = await Promise.all([...tabbableEls].map(async (el) => {
|
53
|
+
const isTababble = await isTabbable(el);
|
54
|
+
return isTababble ? el : false;
|
55
|
+
}));
|
56
|
+
return promiseArray.filter((item) => !!item);
|
57
|
+
}
|
58
|
+
async function advance() {
|
59
|
+
const currentTabbable = await getCurrentTabbable();
|
60
|
+
let next = currentTabbable.indexOf(root.activeElement) + 1;
|
61
|
+
if (next > currentTabbable.length - 1 || next < 0) {
|
62
|
+
next = 0;
|
63
|
+
}
|
64
|
+
currentTabbable[next]?.focus();
|
65
|
+
}
|
66
|
+
async function retreat() {
|
67
|
+
const currentTabbable = await getCurrentTabbable();
|
68
|
+
let next = currentTabbable.indexOf(root.activeElement) - 1;
|
69
|
+
if (next < 0) {
|
70
|
+
next = currentTabbable.length - 1;
|
71
|
+
}
|
72
|
+
currentTabbable[next]?.focus();
|
73
|
+
}
|
74
|
+
function handleMutation(records) {
|
75
|
+
const shouldUpdate = records.some((record) => {
|
76
|
+
if (record.type === 'attributes')
|
77
|
+
return true;
|
78
|
+
if ([...record.addedNodes, ...record.removedNodes].some((node) => getTabbableEls(node).length > 0)) {
|
79
|
+
return true;
|
80
|
+
}
|
81
|
+
return false;
|
82
|
+
});
|
83
|
+
if (shouldUpdate) {
|
84
|
+
updateTabbableEls({ include: [containerEl], merge: true });
|
85
|
+
}
|
86
|
+
}
|
87
|
+
function handleKeydown(evt) {
|
88
|
+
const keyList = ['Tab'];
|
89
|
+
if (keyList.includes(evt.code) &&
|
90
|
+
!evt.ctrlKey &&
|
91
|
+
!evt.altKey &&
|
92
|
+
!evt.metaKey) {
|
93
|
+
evt.preventDefault();
|
94
|
+
if (evt.code === 'Tab' && evt.shiftKey) {
|
95
|
+
retreat();
|
96
|
+
}
|
97
|
+
else {
|
98
|
+
advance();
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
function updateTabbableEls({ include = [], exclude = [], merge = false, }) {
|
103
|
+
if (merge) {
|
104
|
+
include.forEach((el) => {
|
105
|
+
excludedEls.delete(el);
|
106
|
+
getTabbableEls(el).forEach((el) => {
|
107
|
+
if (!tabbableEls.has(el)) {
|
108
|
+
tabbableEls.add(el);
|
109
|
+
}
|
110
|
+
});
|
111
|
+
});
|
112
|
+
exclude.forEach((el) => excludedEls.add(el));
|
113
|
+
}
|
114
|
+
else {
|
115
|
+
tabbableEls = new Set(include.flatMap((el) => getTabbableEls(el)));
|
116
|
+
excludedEls = new Set(exclude);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
async function trapFocus(el, exclude = [], initialFocusIndex = 0) {
|
120
|
+
containerEl = el;
|
121
|
+
if (isShadowRoot(el)) {
|
122
|
+
root = el;
|
123
|
+
}
|
124
|
+
else {
|
125
|
+
root = document;
|
126
|
+
}
|
127
|
+
trapped = true;
|
128
|
+
updateTabbableEls({ include: [el], exclude });
|
129
|
+
document.addEventListener('keydown', handleKeydown);
|
130
|
+
mutationObserver.observe(el, {
|
131
|
+
subtree: true,
|
132
|
+
attributes: true,
|
133
|
+
attributeFilter: ['disabled'],
|
134
|
+
childList: true,
|
135
|
+
});
|
136
|
+
const currentTabbable = await getCurrentTabbable();
|
137
|
+
currentTabbable[initialFocusIndex]?.focus();
|
138
|
+
}
|
139
|
+
function releaseFocus(newFocusEl) {
|
140
|
+
if (!trapped)
|
141
|
+
return;
|
142
|
+
trapped = false;
|
143
|
+
newFocusEl = newFocusEl ?? document.body;
|
144
|
+
document.removeEventListener('keydown', handleKeydown);
|
145
|
+
mutationObserver.disconnect();
|
146
|
+
tabbableEls.clear();
|
147
|
+
excludedEls.clear();
|
148
|
+
containerEl = null;
|
149
|
+
if (newFocusEl)
|
150
|
+
newFocusEl.focus();
|
151
|
+
}
|
152
|
+
const isShadowRoot = (el) => el instanceof ShadowRoot;
|
153
|
+
|
154
|
+
class HurdyGurdy {
|
155
|
+
containerEl;
|
156
|
+
slides;
|
157
|
+
breadcrumbsContainerEl;
|
158
|
+
previousEl;
|
159
|
+
nextEl;
|
160
|
+
keyboardNav;
|
161
|
+
breadcrumbDiameter;
|
162
|
+
onSlideChange;
|
163
|
+
virtualize;
|
164
|
+
proximalSlidesToRender;
|
165
|
+
dynamicBreadCrumbsCutoff;
|
166
|
+
dragLimit;
|
167
|
+
transitionSpeed;
|
168
|
+
baseTransition;
|
169
|
+
momentumToTransition;
|
170
|
+
index;
|
171
|
+
_initialized;
|
172
|
+
_rootEl = document;
|
173
|
+
_innerEl;
|
174
|
+
_slideEls;
|
175
|
+
_breadcrumbsInnerEl;
|
176
|
+
_breadcrumbsCurrent;
|
177
|
+
_breadcrumbs;
|
178
|
+
_raf;
|
179
|
+
_focusRaf;
|
180
|
+
_st;
|
181
|
+
_transitionSt;
|
182
|
+
_isDragging;
|
183
|
+
_draggingDirection;
|
184
|
+
_dragStartPoint;
|
185
|
+
_prevDragPoint;
|
186
|
+
_positions;
|
187
|
+
_dragStartTranslation;
|
188
|
+
_currentPercentTranslation;
|
189
|
+
_progressToNextSlide;
|
190
|
+
_currentDeltaX;
|
191
|
+
_recentDeltas;
|
192
|
+
_resizeObserver;
|
193
|
+
_throttledDrag;
|
194
|
+
_throttledResize;
|
195
|
+
constructor({ slides, containerEl, breadcrumbsContainerEl, previousEl, nextEl, onSlideChange, breadcrumbDiameter = 7, dynamicBreadCrumbsCutoff = 10, keyboardNav = true, dragLimit = 0.5, virtualize = false, proximalSlidesToRender = 1, momentumToTransition = 5, transitionSpeed = 300, baseTransition = '', }) {
|
196
|
+
let ResizeObserver = window.ResizeObserver;
|
197
|
+
if ('ResizeObserver' in window === false) {
|
198
|
+
// @ts-ignore
|
199
|
+
ResizeObserver = window.BeholdResizeObserver;
|
200
|
+
}
|
201
|
+
this.slides = slides;
|
202
|
+
this.containerEl = containerEl;
|
203
|
+
this.breadcrumbsContainerEl = breadcrumbsContainerEl;
|
204
|
+
this.previousEl = previousEl;
|
205
|
+
this.nextEl = nextEl;
|
206
|
+
this.onSlideChange = onSlideChange;
|
207
|
+
this.breadcrumbDiameter = breadcrumbDiameter;
|
208
|
+
this.dynamicBreadCrumbsCutoff = dynamicBreadCrumbsCutoff;
|
209
|
+
this.keyboardNav = keyboardNav;
|
210
|
+
this.dragLimit = dragLimit;
|
211
|
+
this.virtualize = virtualize;
|
212
|
+
this.proximalSlidesToRender = proximalSlidesToRender;
|
213
|
+
this.transitionSpeed = transitionSpeed;
|
214
|
+
this.baseTransition = baseTransition;
|
215
|
+
this.momentumToTransition = momentumToTransition;
|
216
|
+
this.index = 0;
|
217
|
+
this._initialized = false;
|
218
|
+
this._innerEl = null;
|
219
|
+
this._slideEls = null;
|
220
|
+
this._breadcrumbs = null;
|
221
|
+
this._raf = null;
|
222
|
+
this._st = null;
|
223
|
+
this._transitionSt = null;
|
224
|
+
this._isDragging = false;
|
225
|
+
this._draggingDirection = null;
|
226
|
+
this._dragStartPoint = { x: 0, y: 0 };
|
227
|
+
this._prevDragPoint = { x: 0, y: 0 };
|
228
|
+
this._dragStartTranslation = 0;
|
229
|
+
this._currentPercentTranslation = 0;
|
230
|
+
this._progressToNextSlide = 0;
|
231
|
+
this._currentDeltaX = 0;
|
232
|
+
this._recentDeltas = [];
|
233
|
+
this._resizeObserver = new ResizeObserver((entries) => this._throttledResize(entries));
|
234
|
+
this.init = this.init.bind(this);
|
235
|
+
this.destroy = this.destroy.bind(this);
|
236
|
+
this._goTo = this._goTo.bind(this);
|
237
|
+
this._retreat = this._retreat.bind(this);
|
238
|
+
this._advance = this._advance.bind(this);
|
239
|
+
this._handlePrevClick = this._handlePrevClick.bind(this);
|
240
|
+
this._handleNextClick = this._handleNextClick.bind(this);
|
241
|
+
this._handleKeyDown = this._handleKeyDown.bind(this);
|
242
|
+
this._mouseDrag = this._mouseDrag.bind(this);
|
243
|
+
this._touchDrag = this._touchDrag.bind(this);
|
244
|
+
this._throttledDrag = throttle(this._drag, 10, this);
|
245
|
+
this._throttledResize = throttle(this._handleResize, 100, this);
|
246
|
+
this._startMouseDrag = this._startMouseDrag.bind(this);
|
247
|
+
this._startTouchDrag = this._startTouchDrag.bind(this);
|
248
|
+
this._startDrag = this._startDrag.bind(this);
|
249
|
+
this._endDrag = this._endDrag.bind(this);
|
250
|
+
this._updateBreadcrumbs = this._updateBreadcrumbs.bind(this);
|
251
|
+
this._updateBreadcrumbClasses = this._updateBreadcrumbClasses.bind(this);
|
252
|
+
this._addEventListeners = this._addEventListeners.bind(this);
|
253
|
+
this._removeEventListeners = this._removeEventListeners.bind(this);
|
254
|
+
}
|
255
|
+
_addEventListeners() {
|
256
|
+
this._innerEl.addEventListener('mousedown', this._startMouseDrag, {
|
257
|
+
passive: true,
|
258
|
+
});
|
259
|
+
this._innerEl.addEventListener('touchstart', this._startTouchDrag, {
|
260
|
+
passive: true,
|
261
|
+
});
|
262
|
+
document.body.addEventListener('mousemove', this._mouseDrag, {
|
263
|
+
passive: true,
|
264
|
+
});
|
265
|
+
document.body.addEventListener('mouseup', this._endDrag, { passive: true });
|
266
|
+
document.body.addEventListener('mouseleave', this._endDrag, {
|
267
|
+
passive: true,
|
268
|
+
});
|
269
|
+
document.body.addEventListener('touchmove', this._touchDrag, {
|
270
|
+
passive: true,
|
271
|
+
});
|
272
|
+
document.body.addEventListener('touchend', this._endDrag, { passive: true });
|
273
|
+
if (this.previousEl) {
|
274
|
+
this.previousEl.addEventListener('click', this._handlePrevClick, {
|
275
|
+
passive: true,
|
276
|
+
});
|
277
|
+
}
|
278
|
+
if (this.nextEl) {
|
279
|
+
this.nextEl.addEventListener('click', this._handleNextClick, {
|
280
|
+
passive: true,
|
281
|
+
});
|
282
|
+
}
|
283
|
+
if (this.keyboardNav) {
|
284
|
+
document.addEventListener('keydown', this._handleKeyDown);
|
285
|
+
}
|
286
|
+
}
|
287
|
+
_removeEventListeners() {
|
288
|
+
document.body.removeEventListener('mousemove', this._mouseDrag);
|
289
|
+
document.body.removeEventListener('mouseup', this._endDrag);
|
290
|
+
document.body.removeEventListener('mouseleave', this._endDrag);
|
291
|
+
document.body.removeEventListener('touchmove', this._touchDrag);
|
292
|
+
document.body.removeEventListener('touchend', this._endDrag);
|
293
|
+
if (this._innerEl) {
|
294
|
+
this._innerEl.removeEventListener('mousedown', this._startMouseDrag);
|
295
|
+
this._innerEl.removeEventListener('touchstart', this._startTouchDrag);
|
296
|
+
}
|
297
|
+
if (this.previousEl) {
|
298
|
+
this.previousEl.removeEventListener('click', this._handlePrevClick);
|
299
|
+
}
|
300
|
+
if (this.nextEl) {
|
301
|
+
this.nextEl.removeEventListener('click', this._handleNextClick);
|
302
|
+
}
|
303
|
+
if (this.keyboardNav) {
|
304
|
+
document.removeEventListener('keydown', this._handleKeyDown);
|
305
|
+
}
|
306
|
+
}
|
307
|
+
init(index = 0) {
|
308
|
+
if (this._initialized)
|
309
|
+
return;
|
310
|
+
this._initialized = true;
|
311
|
+
this._rootEl = getClosestShadowRootOrDocument(this.containerEl);
|
312
|
+
this._slideEls = this.slides.map((slide) => {
|
313
|
+
return createElement({
|
314
|
+
classes: 'hg-slide',
|
315
|
+
contents: slide,
|
316
|
+
});
|
317
|
+
});
|
318
|
+
this._breadcrumbs = this.slides.map((slide, i) => createElement({
|
319
|
+
classes: 'hg-breadcrumb',
|
320
|
+
listeners: { click: () => this._goTo({ index: i }) },
|
321
|
+
}));
|
322
|
+
this._breadcrumbsCurrent = createElement({
|
323
|
+
classes: 'hg-breadcrumbs-current',
|
324
|
+
});
|
325
|
+
this._breadcrumbsInnerEl = createElement({
|
326
|
+
classes: 'hg-breadcrumbs',
|
327
|
+
contents: [...this._breadcrumbs, this._breadcrumbsCurrent],
|
328
|
+
});
|
329
|
+
this._innerEl = createElement({
|
330
|
+
classes: 'hg-container',
|
331
|
+
contents: this._slideEls,
|
332
|
+
style: {
|
333
|
+
'touch-action': 'pan-y',
|
334
|
+
},
|
335
|
+
});
|
336
|
+
this.containerEl.appendChild(this._innerEl);
|
337
|
+
if (this.breadcrumbsContainerEl) {
|
338
|
+
this.breadcrumbsContainerEl.style.setProperty('--breadCrumbDiameter', this.breadcrumbDiameter + 'px');
|
339
|
+
this.breadcrumbsContainerEl.appendChild(this._breadcrumbsInnerEl);
|
340
|
+
}
|
341
|
+
this._addEventListeners();
|
342
|
+
// Only one slide? Don't actually make a slideshow
|
343
|
+
if (this.slides.length < 2) {
|
344
|
+
this._breadcrumbsInnerEl.style.display = 'none';
|
345
|
+
this.previousEl.style.display = 'none';
|
346
|
+
this.nextEl.style.display = 'none';
|
347
|
+
}
|
348
|
+
this._resizeObserver?.observe(this.containerEl);
|
349
|
+
this._updateBreadcrumbs(this.index, this.index, false);
|
350
|
+
this._goTo({ index, animate: false, forceUpdate: true, isInitial: true });
|
351
|
+
}
|
352
|
+
destroy() {
|
353
|
+
if (!this._initialized)
|
354
|
+
return;
|
355
|
+
clearTimeout(this._st);
|
356
|
+
clearTimeout(this._transitionSt);
|
357
|
+
cancelAnimationFrame(this._raf);
|
358
|
+
cancelAnimationFrame(this._focusRaf);
|
359
|
+
this._resizeObserver.disconnect();
|
360
|
+
this._removeEventListeners();
|
361
|
+
this._breadcrumbs = null;
|
362
|
+
this._breadcrumbsCurrent = null;
|
363
|
+
this._breadcrumbsInnerEl.remove();
|
364
|
+
this._breadcrumbsInnerEl = null;
|
365
|
+
this._innerEl.remove();
|
366
|
+
this._innerEl = null;
|
367
|
+
this._rootEl = null;
|
368
|
+
this._slideEls = null;
|
369
|
+
this._initialized = false;
|
370
|
+
}
|
371
|
+
_handleResize(entries) {
|
372
|
+
if (!entries?.[0])
|
373
|
+
return;
|
374
|
+
this._positions = getElementPositions(this.containerEl, this._slideEls);
|
375
|
+
}
|
376
|
+
_updateBreadcrumbClasses(newIndex, animate = true) {
|
377
|
+
if (this._breadcrumbs.length >= this.dynamicBreadCrumbsCutoff &&
|
378
|
+
this.breadcrumbsContainerEl) {
|
379
|
+
setClasses(this._breadcrumbsInnerEl, {
|
380
|
+
'no-transition': !animate,
|
381
|
+
});
|
382
|
+
requestAnimationFrame(() => {
|
383
|
+
this._breadcrumbsInnerEl.classList.remove('no-transition');
|
384
|
+
});
|
385
|
+
const translate = this._breadcrumbsInnerEl.offsetWidth / 2 -
|
386
|
+
this.breadcrumbDiameter / 2 -
|
387
|
+
this._breadcrumbs[newIndex].offsetLeft;
|
388
|
+
this._breadcrumbsInnerEl.style.transform = `translateX(${translate}px)`;
|
389
|
+
this._breadcrumbs.forEach((crumb, i) => {
|
390
|
+
setClasses(crumb, {
|
391
|
+
'hg-breadcrumb--hidden': i <= newIndex - 5 || i >= newIndex + 5,
|
392
|
+
'hg-breadcrumb--4': i === newIndex - 4 || i === newIndex + 4,
|
393
|
+
'hg-breadcrumb--3': i === newIndex - 3 || i === newIndex + 3,
|
394
|
+
'hg-breadcrumb--2': i === newIndex - 2 || i === newIndex + 2,
|
395
|
+
'hg-breadcrumb--1': i === newIndex - 1 || i === newIndex + 1,
|
396
|
+
});
|
397
|
+
});
|
398
|
+
}
|
399
|
+
}
|
400
|
+
_updateBreadcrumbs(newIndex, oldIndex, animate) {
|
401
|
+
if (!this._breadcrumbs?.length)
|
402
|
+
return;
|
403
|
+
this._updateBreadcrumbClasses(newIndex, animate);
|
404
|
+
if (!this.breadcrumbsContainerEl)
|
405
|
+
return;
|
406
|
+
if (!animate ||
|
407
|
+
(this._breadcrumbs.length >= 10 && Math.abs(newIndex - oldIndex) > 1)) {
|
408
|
+
if (newIndex > oldIndex) {
|
409
|
+
this._breadcrumbsCurrent.style.left = '';
|
410
|
+
this._breadcrumbsCurrent.style.right = `${this._breadcrumbsInnerEl.offsetWidth -
|
411
|
+
(this._breadcrumbs[newIndex].offsetLeft + this.breadcrumbDiameter)}px`;
|
412
|
+
}
|
413
|
+
else {
|
414
|
+
this._breadcrumbsCurrent.style.right = '';
|
415
|
+
this._breadcrumbsCurrent.style.left =
|
416
|
+
this._breadcrumbs[newIndex].offsetLeft + 'px';
|
417
|
+
}
|
418
|
+
}
|
419
|
+
else {
|
420
|
+
if (newIndex < oldIndex) {
|
421
|
+
this._breadcrumbsCurrent.style.left = '';
|
422
|
+
this._breadcrumbsCurrent.style.right = `${this._breadcrumbsInnerEl.offsetWidth -
|
423
|
+
this._breadcrumbs[oldIndex]?.offsetLeft -
|
424
|
+
this.breadcrumbDiameter}px`;
|
425
|
+
}
|
426
|
+
else {
|
427
|
+
this._breadcrumbsCurrent.style.right = '';
|
428
|
+
this._breadcrumbsCurrent.style.left =
|
429
|
+
this._breadcrumbs[oldIndex]?.offsetLeft + 'px';
|
430
|
+
}
|
431
|
+
forceLayout();
|
432
|
+
this._raf = requestAnimationFrame(() => {
|
433
|
+
if (newIndex > oldIndex) {
|
434
|
+
this._breadcrumbsCurrent.style.width = `${this._breadcrumbs[newIndex]?.offsetLeft -
|
435
|
+
this._breadcrumbsCurrent.offsetLeft +
|
436
|
+
this.breadcrumbDiameter}px`;
|
437
|
+
}
|
438
|
+
else {
|
439
|
+
this._breadcrumbsCurrent.style.width = `${this._breadcrumbsCurrent.offsetLeft +
|
440
|
+
this._breadcrumbsCurrent.offsetWidth -
|
441
|
+
this._breadcrumbs[newIndex]?.offsetLeft}px`;
|
442
|
+
}
|
443
|
+
});
|
444
|
+
this._st = setTimeout(() => {
|
445
|
+
if (newIndex > oldIndex) {
|
446
|
+
this._breadcrumbsCurrent.style.left = '';
|
447
|
+
this._breadcrumbsCurrent.style.right = `${this._breadcrumbsInnerEl.offsetWidth -
|
448
|
+
(this._breadcrumbs[newIndex].offsetLeft + this.breadcrumbDiameter)}px`;
|
449
|
+
}
|
450
|
+
else {
|
451
|
+
this._breadcrumbsCurrent.style.right = '';
|
452
|
+
this._breadcrumbsCurrent.style.left =
|
453
|
+
this._breadcrumbs[newIndex].offsetLeft + 'px';
|
454
|
+
}
|
455
|
+
forceLayout();
|
456
|
+
this._raf = requestAnimationFrame(() => {
|
457
|
+
this._breadcrumbsCurrent.style.width = '';
|
458
|
+
});
|
459
|
+
}, 200);
|
460
|
+
}
|
461
|
+
}
|
462
|
+
_goTo({ index, animate = true, forceUpdate = false, easing = 'ease', isInitial = false, }) {
|
463
|
+
if (!this._slideEls?.[index])
|
464
|
+
return;
|
465
|
+
if (!this._initialized)
|
466
|
+
return;
|
467
|
+
cancelAnimationFrame(this._focusRaf);
|
468
|
+
const newIndex = index;
|
469
|
+
const oldIndex = this.index;
|
470
|
+
this.index = newIndex;
|
471
|
+
clearTimeout(this._transitionSt);
|
472
|
+
if (this.virtualize) {
|
473
|
+
this._slideEls.forEach((el, i) => {
|
474
|
+
const distance = Math.abs(this.index - i);
|
475
|
+
if (distance > this.proximalSlidesToRender && i !== oldIndex) {
|
476
|
+
if (el.hasChildNodes()) {
|
477
|
+
el.beholdReplaceChildren();
|
478
|
+
}
|
479
|
+
}
|
480
|
+
else if (!el.hasChildNodes()) {
|
481
|
+
el.beholdReplaceChildren(this.slides[i]);
|
482
|
+
}
|
483
|
+
});
|
484
|
+
}
|
485
|
+
if (window.matchMedia(`(prefers-reduced-motion)`).matches) {
|
486
|
+
animate = false;
|
487
|
+
}
|
488
|
+
this._isDragging = false;
|
489
|
+
this._progressToNextSlide = 0;
|
490
|
+
if (newIndex === oldIndex && !forceUpdate) {
|
491
|
+
this._breadcrumbsCurrent.style.width = '';
|
492
|
+
}
|
493
|
+
else {
|
494
|
+
cancelAnimationFrame(this._raf);
|
495
|
+
clearTimeout(this._st);
|
496
|
+
this._updateBreadcrumbs(newIndex, oldIndex, animate);
|
497
|
+
if (this.onSlideChange)
|
498
|
+
this.onSlideChange(newIndex, isInitial);
|
499
|
+
}
|
500
|
+
if (animate) {
|
501
|
+
this._innerEl.style.transition = `transform ${this.transitionSpeed}ms ${easing}`;
|
502
|
+
}
|
503
|
+
else {
|
504
|
+
this._innerEl.style.transition = this.baseTransition;
|
505
|
+
}
|
506
|
+
this._innerEl.style.transform = `translateX(${newIndex * -100}%)`;
|
507
|
+
this._currentPercentTranslation = newIndex * -100;
|
508
|
+
if (this.previousEl) {
|
509
|
+
if (newIndex < 1) {
|
510
|
+
if (this._rootEl.activeElement === this.previousEl) {
|
511
|
+
this._focusRaf = requestAnimationFrame(() => {
|
512
|
+
this.nextEl.focus();
|
513
|
+
});
|
514
|
+
}
|
515
|
+
this.previousEl.setAttribute('disabled', 'true');
|
516
|
+
}
|
517
|
+
else {
|
518
|
+
this.previousEl.removeAttribute('disabled');
|
519
|
+
}
|
520
|
+
}
|
521
|
+
if (this.nextEl) {
|
522
|
+
if (newIndex >= this._slideEls.length - 1) {
|
523
|
+
if (this._rootEl.activeElement === this.nextEl) {
|
524
|
+
this._focusRaf = requestAnimationFrame(() => {
|
525
|
+
this.previousEl.focus();
|
526
|
+
});
|
527
|
+
}
|
528
|
+
this.nextEl.setAttribute('disabled', 'true');
|
529
|
+
}
|
530
|
+
else {
|
531
|
+
this.nextEl.removeAttribute('disabled');
|
532
|
+
}
|
533
|
+
}
|
534
|
+
this._transitionSt = setTimeout(() => {
|
535
|
+
this._innerEl.style.transition = this.baseTransition;
|
536
|
+
}, this.transitionSpeed);
|
537
|
+
}
|
538
|
+
_handlePrevClick() {
|
539
|
+
this._retreat();
|
540
|
+
}
|
541
|
+
_handleNextClick() {
|
542
|
+
this._advance();
|
543
|
+
}
|
544
|
+
_retreat(easing = 'ease') {
|
545
|
+
if (typeof easing !== 'string')
|
546
|
+
easing = 'ease';
|
547
|
+
if (this.index < 1) {
|
548
|
+
this._goTo({ index: this.index });
|
549
|
+
}
|
550
|
+
else {
|
551
|
+
this._goTo({ index: this.index - 1, easing });
|
552
|
+
}
|
553
|
+
}
|
554
|
+
_advance(easing = 'ease') {
|
555
|
+
if (typeof easing !== 'string')
|
556
|
+
easing = 'ease';
|
557
|
+
if (this.index >= this._slideEls.length - 1) {
|
558
|
+
this._goTo({ index: this.index });
|
559
|
+
}
|
560
|
+
else {
|
561
|
+
this._goTo({ index: this.index + 1, easing });
|
562
|
+
}
|
563
|
+
}
|
564
|
+
_handleKeyDown(evt) {
|
565
|
+
if (evt.code === 'ArrowRight') {
|
566
|
+
evt.preventDefault();
|
567
|
+
this._advance();
|
568
|
+
}
|
569
|
+
if (evt.code === 'ArrowLeft') {
|
570
|
+
evt.preventDefault();
|
571
|
+
this._retreat();
|
572
|
+
}
|
573
|
+
}
|
574
|
+
_startMouseDrag(evt) {
|
575
|
+
evt.stopPropagation();
|
576
|
+
if (evt.button > 0)
|
577
|
+
return;
|
578
|
+
this._startDrag({ x: evt.clientX, y: evt.clientY });
|
579
|
+
}
|
580
|
+
_startTouchDrag(evt) {
|
581
|
+
evt.stopPropagation();
|
582
|
+
this._startDrag({
|
583
|
+
x: evt.touches.item(0).clientX,
|
584
|
+
y: evt.touches.item(0).clientY,
|
585
|
+
});
|
586
|
+
}
|
587
|
+
_startDrag(startPoint) {
|
588
|
+
if (this.slides.length < 2 || !this._initialized)
|
589
|
+
return;
|
590
|
+
this._isDragging = true;
|
591
|
+
clearTimeout(this._transitionSt);
|
592
|
+
cancelAnimationFrame(this._raf);
|
593
|
+
this._positions = getElementPositions(this.containerEl, this._slideEls);
|
594
|
+
this._dragStartTranslation = this._positions.leftDelta;
|
595
|
+
this._currentPercentTranslation =
|
596
|
+
(this._dragStartTranslation / this._positions.parent.width) * 100;
|
597
|
+
this._innerEl.style.transform = `translateX(${this._currentPercentTranslation}%)`;
|
598
|
+
this._innerEl.style.transition = this.baseTransition;
|
599
|
+
this._progressToNextSlide = 0;
|
600
|
+
this._breadcrumbsCurrent.style.transition = 'none';
|
601
|
+
this._dragStartPoint = startPoint;
|
602
|
+
this._prevDragPoint = startPoint;
|
603
|
+
this._currentDeltaX = 0;
|
604
|
+
this._recentDeltas = [];
|
605
|
+
}
|
606
|
+
_drag(currentPosition, isTouch = false) {
|
607
|
+
if (this.slides.length < 2 || !this._isDragging || !this._initialized) {
|
608
|
+
return;
|
609
|
+
}
|
610
|
+
const movementX = currentPosition.x - this._prevDragPoint.x;
|
611
|
+
this._positions = {
|
612
|
+
...this._positions,
|
613
|
+
leftDelta: this._positions.leftDelta + movementX,
|
614
|
+
rightDelta: this._positions.rightDelta + movementX,
|
615
|
+
};
|
616
|
+
const dragLimitInPixels = this._positions.parent.width * this.dragLimit;
|
617
|
+
pushWithLimit(this._recentDeltas, movementX, 5);
|
618
|
+
this._prevDragPoint = currentPosition;
|
619
|
+
// Dragging past beginning or end
|
620
|
+
const isPastEdge = this._positions.leftDelta > 0 || this._positions.rightDelta < 0;
|
621
|
+
if (isPastEdge) {
|
622
|
+
const movementXWithResistance = applyResistance(movementX, this._currentDeltaX, this._positions.parent.width);
|
623
|
+
this._currentDeltaX = this._currentDeltaX + movementXWithResistance;
|
624
|
+
}
|
625
|
+
else {
|
626
|
+
this._currentDeltaX = this._currentDeltaX + movementX;
|
627
|
+
}
|
628
|
+
let deltaX = currentPosition.x - this._dragStartPoint.x;
|
629
|
+
let deltaY = currentPosition.y - this._dragStartPoint.y;
|
630
|
+
let slope = Math.abs(deltaY) / Math.abs(deltaX);
|
631
|
+
if (isTouch && slope > 0.85) {
|
632
|
+
this._endDrag();
|
633
|
+
return;
|
634
|
+
}
|
635
|
+
this._progressToNextSlide = Math.abs(deltaX / dragLimitInPixels);
|
636
|
+
if (movementX < 0) {
|
637
|
+
this._draggingDirection = 'left';
|
638
|
+
}
|
639
|
+
if (movementX > 0) {
|
640
|
+
this._draggingDirection = 'right';
|
641
|
+
}
|
642
|
+
const pixeltranslation = this._dragStartTranslation + this._currentDeltaX;
|
643
|
+
this._currentPercentTranslation =
|
644
|
+
(pixeltranslation / this._positions.parent.width) * 100;
|
645
|
+
if (this._currentDeltaX < 0) {
|
646
|
+
this._breadcrumbsCurrent.style.right = '';
|
647
|
+
this._breadcrumbsCurrent.style.left = `${this._breadcrumbs[this.index].offsetLeft}px`;
|
648
|
+
}
|
649
|
+
if (this._currentDeltaX > 0) {
|
650
|
+
this._breadcrumbsCurrent.style.left = '';
|
651
|
+
this._breadcrumbsCurrent.style.right = `${this._breadcrumbsInnerEl.offsetWidth -
|
652
|
+
(this._breadcrumbs[this.index].offsetLeft + this.breadcrumbDiameter)}px`;
|
653
|
+
}
|
654
|
+
if (isPastEdge) {
|
655
|
+
this._breadcrumbsCurrent.style.width = `${this.breadcrumbDiameter +
|
656
|
+
Math.abs((this.breadcrumbDiameter *
|
657
|
+
4 *
|
658
|
+
(this._currentPercentTranslation + 100 * this.index)) /
|
659
|
+
100)}px`;
|
660
|
+
}
|
661
|
+
else {
|
662
|
+
this._breadcrumbsCurrent.style.width = `${Math.min(this.breadcrumbDiameter * 2.75, this.breadcrumbDiameter +
|
663
|
+
Math.abs((this.breadcrumbDiameter *
|
664
|
+
4 *
|
665
|
+
(this._currentPercentTranslation + 100 * this.index)) /
|
666
|
+
100))}px`;
|
667
|
+
}
|
668
|
+
this._innerEl.style.transform = `translateX(${this._currentPercentTranslation}%)`;
|
669
|
+
this._innerEl.style.transition = this.baseTransition;
|
670
|
+
}
|
671
|
+
_mouseDrag(evt) {
|
672
|
+
this._throttledDrag({ x: evt.clientX, y: evt.clientY }, false);
|
673
|
+
}
|
674
|
+
_touchDrag(evt) {
|
675
|
+
this._throttledDrag({ x: evt.touches.item(0).clientX, y: evt.touches.item(0).clientY }, true);
|
676
|
+
}
|
677
|
+
_endDrag() {
|
678
|
+
this._isDragging = false;
|
679
|
+
this._breadcrumbsCurrent.style.transition = '';
|
680
|
+
this._innerEl.style.transition = this.baseTransition;
|
681
|
+
this._dragStartPoint = { x: 0, y: 0 };
|
682
|
+
this._prevDragPoint = { x: 0, y: 0 };
|
683
|
+
this._currentDeltaX = 0;
|
684
|
+
const momentum = getAbsArrayAverage(this._recentDeltas);
|
685
|
+
let action = null;
|
686
|
+
if (momentum > this.momentumToTransition ||
|
687
|
+
this._progressToNextSlide >= 1) {
|
688
|
+
if (this._currentPercentTranslation + 100 * this.index < 0 &&
|
689
|
+
this._draggingDirection === 'left') {
|
690
|
+
action = 'advance';
|
691
|
+
}
|
692
|
+
if (this._currentPercentTranslation + 100 * this.index > 0 &&
|
693
|
+
this._draggingDirection === 'right') {
|
694
|
+
action = 'retreat';
|
695
|
+
}
|
696
|
+
}
|
697
|
+
switch (action) {
|
698
|
+
case 'advance':
|
699
|
+
this._raf = requestAnimationFrame(() => this._advance('cubic-bezier(0.25, .25, 0.5, 1)'));
|
700
|
+
break;
|
701
|
+
case 'retreat':
|
702
|
+
this._raf = requestAnimationFrame(() => this._retreat('cubic-bezier(0.25, .25, 0.5, 1)'));
|
703
|
+
break;
|
704
|
+
default:
|
705
|
+
this._raf = requestAnimationFrame(() => this._goTo({ index: this.index }));
|
706
|
+
}
|
707
|
+
this._draggingDirection = null;
|
708
|
+
this._recentDeltas = [];
|
709
|
+
}
|
710
|
+
}
|
711
|
+
function getElementPositions(containerEl, slideEls) {
|
712
|
+
if (!containerEl || !slideEls?.length)
|
713
|
+
return;
|
714
|
+
const parentBox = containerEl.getBoundingClientRect();
|
715
|
+
const firstSlideBox = slideEls[0].getBoundingClientRect();
|
716
|
+
const lastSlideBox = slideEls[slideEls.length - 1].getBoundingClientRect();
|
717
|
+
return {
|
718
|
+
parent: parentBox,
|
719
|
+
firstSlide: firstSlideBox,
|
720
|
+
lastSlide: lastSlideBox,
|
721
|
+
leftDelta: firstSlideBox.left - parentBox.left,
|
722
|
+
rightDelta: lastSlideBox.right - parentBox.right,
|
723
|
+
};
|
724
|
+
}
|
725
|
+
function applyResistance(delta, total, limit, slope = 0.125) {
|
726
|
+
const resistance = 1 - (Math.abs(total) / Math.abs(limit)) ** slope;
|
727
|
+
return delta * resistance;
|
728
|
+
}
|
729
|
+
function getAbsArrayAverage(arr) {
|
730
|
+
return Math.abs(arr.reduce((acc, curr) => acc + curr, 0) / arr.length);
|
731
|
+
}
|
732
|
+
|
733
|
+
class PopoverScroller {
|
734
|
+
slides;
|
735
|
+
containerEl;
|
736
|
+
onSlideChange;
|
737
|
+
onRequestClose;
|
738
|
+
_initialized;
|
739
|
+
_currentSlide;
|
740
|
+
_scrollContainerEl;
|
741
|
+
_innerEl;
|
742
|
+
_throttledScroll;
|
743
|
+
_goToRaf;
|
744
|
+
constructor({ slides, containerEl, onSlideChange, onRequestClose = null }) {
|
745
|
+
this.slides = slides;
|
746
|
+
this.containerEl = containerEl;
|
747
|
+
this.onSlideChange = onSlideChange;
|
748
|
+
this.onRequestClose = onRequestClose;
|
749
|
+
this.init = this.init.bind(this);
|
750
|
+
this.destroy = this.destroy.bind(this);
|
751
|
+
this._initialized = false;
|
752
|
+
this._currentSlide = null;
|
753
|
+
this._scrollContainerEl = null;
|
754
|
+
this._innerEl = null;
|
755
|
+
this._onBackGroundClick = this._onBackGroundClick.bind(this);
|
756
|
+
this._throttledScroll = throttle(this._handleScroll, 200, this);
|
757
|
+
}
|
758
|
+
init(index = 0) {
|
759
|
+
if (this._initialized)
|
760
|
+
return;
|
761
|
+
this._initialized = true;
|
762
|
+
this._innerEl = createElement({
|
763
|
+
classes: prefixedClass('inner'),
|
764
|
+
contents: this.slides,
|
765
|
+
});
|
766
|
+
this._scrollContainerEl = createElement({
|
767
|
+
classes: prefixedClass('container'),
|
768
|
+
contents: this._innerEl,
|
769
|
+
});
|
770
|
+
this.containerEl.appendChild(this._scrollContainerEl);
|
771
|
+
this._scrollContainerEl.addEventListener('click', this._onBackGroundClick);
|
772
|
+
this._scrollContainerEl.addEventListener('scroll', this._throttledScroll, {
|
773
|
+
passive: true,
|
774
|
+
});
|
775
|
+
this._goTo({ index, animate: false });
|
776
|
+
}
|
777
|
+
destroy() {
|
778
|
+
if (!this._initialized)
|
779
|
+
return;
|
780
|
+
cancelAnimationFrame(this._goToRaf);
|
781
|
+
this._initialized = false;
|
782
|
+
this._scrollContainerEl.removeEventListener('click', this._onBackGroundClick);
|
783
|
+
this._scrollContainerEl.removeEventListener('scroll', this._throttledScroll);
|
784
|
+
this._scrollContainerEl.remove();
|
785
|
+
this._scrollContainerEl = null;
|
786
|
+
this._innerEl = null;
|
787
|
+
}
|
788
|
+
_handleScroll() {
|
789
|
+
getMostVisible(this.slides).then((mostVisible) => {
|
790
|
+
if (this._currentSlide !== mostVisible) {
|
791
|
+
this._currentSlide = mostVisible;
|
792
|
+
if (this.onSlideChange)
|
793
|
+
this.onSlideChange(this._currentSlide);
|
794
|
+
}
|
795
|
+
});
|
796
|
+
}
|
797
|
+
_onBackGroundClick(evt) {
|
798
|
+
if (evt.target === this._scrollContainerEl && this.onRequestClose) {
|
799
|
+
this.onRequestClose();
|
800
|
+
}
|
801
|
+
}
|
802
|
+
_goTo({ index, animate = true }) {
|
803
|
+
cancelAnimationFrame(this._goToRaf);
|
804
|
+
if (!this.slides?.[index])
|
805
|
+
return;
|
806
|
+
this._currentSlide = index;
|
807
|
+
if (this.onSlideChange)
|
808
|
+
this.onSlideChange(this._currentSlide);
|
809
|
+
this._goToRaf = requestAnimationFrame(() => {
|
810
|
+
const slideTop = this.slides[index].offsetTop;
|
811
|
+
this._scrollContainerEl?.scrollTo({
|
812
|
+
top: slideTop - 10,
|
813
|
+
behavior: animate ? 'smooth' : 'instant',
|
814
|
+
});
|
815
|
+
});
|
816
|
+
}
|
817
|
+
}
|
818
|
+
function prefixedClass(className) {
|
819
|
+
return 'behold-ps-' + className;
|
820
|
+
}
|
821
|
+
|
822
|
+
var mutedIcon = "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 20 20\" enable-background=\"new 0 0 20 20\" xml:space=\"preserve\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#FFFFFF\" d=\"M4.4,7.3C4.2,7.3,4,7.5,4,7.7v4.6c0,0.2,0.2,0.4,0.4,0.4h2.2\n\tl3.2,3.2c0.2,0.2,0.6,0.1,0.6-0.2v-2.4c0-0.1-0.1-0.2-0.1-0.3L4.8,7.4C4.7,7.4,4.6,7.3,4.5,7.3C4.5,7.3,4.4,7.3,4.4,7.3z M16.1,15.2\n\tl-1.4-1.4c0.5-0.7,1.3-1.9,1.3-3.8c0-2.8-1.8-4.3-1.8-4.3c-0.1-0.2-0.4-0.2-0.6,0L13.3,6c-0.1,0.2-0.1,0.4,0,0.6\n\tc0,0,1.4,1.2,1.4,3.4c0,1.4-0.5,2.3-0.9,2.9L12.9,12c0.3-0.4,0.6-1.1,0.6-2c0-1.7-1-2.6-1-2.6c-0.1-0.2-0.4-0.2-0.6,0l-0.4,0.3\n\tc-0.1,0.2-0.1,0.4,0,0.6c0,0,0.7,0.5,0.7,1.7c0,0.4-0.1,0.8-0.2,1.1l-1.6-1.6V4.3c0-0.3-0.4-0.5-0.6-0.2L7.4,6.5L4.8,3.9\n\tc-0.1-0.1-0.4-0.1-0.5,0L4,4.3C3.8,4.4,3.8,4.7,4,4.8l1,1.1l6.7,6.7l3.5,3.5c0.1,0.1,0.4,0.1,0.5,0l0.4-0.4\n\tC16.2,15.6,16.2,15.3,16.1,15.2z\"/>\n</svg>";
|
823
|
+
|
824
|
+
var unmutedIcon = "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 20 20\" enable-background=\"new 0 0 20 20\" xml:space=\"preserve\">\n<path fill=\"#FFFFFF\" d=\"M12.5,7.3c-0.3-0.4-0.8-0.4-1.1-0.2C11,7.4,11,7.9,11.2,8.3l0,0c0.4,0.5,0.6,1.1,0.6,1.7\n\tc0,0.6-0.2,1.2-0.6,1.7c-0.3,0.4-0.2,0.9,0.1,1.1c0.4,0.3,0.9,0.2,1.1-0.1c0,0,0,0,0,0c0.6-0.8,0.9-1.7,0.9-2.7\n\tC13.4,9,13.1,8.1,12.5,7.3z M14.6,6c-0.3-0.4-0.8-0.4-1.1-0.1C13.1,6.2,13,6.7,13.3,7c0,0,0,0,0,0c0.7,0.8,1.1,1.9,1.1,3\n\tc0,1.1-0.4,2.1-1.1,3c-0.3,0.4-0.2,0.9,0.1,1.1c0.3,0.3,0.8,0.2,1.1-0.1c0.9-1.1,1.4-2.5,1.4-4C16,8.5,15.5,7.1,14.6,6z M9.7,4\n\tC9.5,4,9.2,4,9.1,4.1L6.3,6.7H4.5C4.2,6.7,4,7,4,7.3v5.5c0,0.3,0.2,0.5,0.5,0.5h1.8l2.7,2.6l0,0c0.2,0.2,0.6,0.2,0.8,0\n\tc0.1-0.1,0.2-0.3,0.2-0.4l0-10.8C10,4.3,9.9,4.1,9.7,4z\"/>\n</svg>";
|
825
|
+
|
826
|
+
/**
|
827
|
+
* @description
|
828
|
+
* Required props: post
|
829
|
+
*/
|
830
|
+
class PopoverSlideVideo extends BaseElement {
|
831
|
+
label = 'PopoverSlideVideo';
|
832
|
+
// Internal
|
833
|
+
_videoEl;
|
834
|
+
_imageEl;
|
835
|
+
_soundControlEl;
|
836
|
+
// Provided
|
837
|
+
post;
|
838
|
+
constructor() {
|
839
|
+
super();
|
840
|
+
// Register child components
|
841
|
+
Video.register();
|
842
|
+
Image.register();
|
843
|
+
this._onLoad = this._onLoad.bind(this);
|
844
|
+
this._onPlay = this._onPlay.bind(this);
|
845
|
+
this._onPause = this._onPause.bind(this);
|
846
|
+
this._togglePlayback = this._togglePlayback.bind(this);
|
847
|
+
this._toggleSound = this._toggleSound.bind(this);
|
848
|
+
this.play = this.play.bind(this);
|
849
|
+
this.pause = this.pause.bind(this);
|
850
|
+
this.showSoundControl = this.showSoundControl.bind(this);
|
851
|
+
this.hideSoundControl = this.hideSoundControl.bind(this);
|
852
|
+
this.preload = this.preload.bind(this);
|
853
|
+
this.onLocalStateChange(this._handleLocalStateChange, { isPlaying: false });
|
854
|
+
this.onGlobalStateChange(this._handleGlobalStateChange);
|
855
|
+
// Connect
|
856
|
+
this.onConnect(() => {
|
857
|
+
if (this.post.mediaUrl) {
|
858
|
+
this._videoEl = createElement({
|
859
|
+
type: 'behold-video',
|
860
|
+
classes: 'video',
|
861
|
+
props: {
|
862
|
+
mediaUrl: this.post.mediaUrl,
|
863
|
+
sizes: this.post.sizes,
|
864
|
+
renderPlaceholder: true,
|
865
|
+
},
|
866
|
+
listeners: {
|
867
|
+
click: this._togglePlayback,
|
868
|
+
load: this._onLoad,
|
869
|
+
play: this._onPlay,
|
870
|
+
pause: this._onPause,
|
871
|
+
},
|
872
|
+
});
|
873
|
+
this._soundControlEl = createElement({
|
874
|
+
type: 'button',
|
875
|
+
classes: 'video-mute',
|
876
|
+
contents: this.globalState.isMuted ? mutedIcon : unmutedIcon,
|
877
|
+
listeners: {
|
878
|
+
click: this._toggleSound,
|
879
|
+
},
|
880
|
+
attributes: {
|
881
|
+
'aria-label': this.globalState.isMuted ? 'unmute' : 'mute',
|
882
|
+
},
|
883
|
+
});
|
884
|
+
if (this.globalState.isMuted) {
|
885
|
+
this._videoEl.mute();
|
886
|
+
}
|
887
|
+
else {
|
888
|
+
this._videoEl.unmute();
|
889
|
+
}
|
890
|
+
this.classList.add('video-container', 'video-container--paused');
|
891
|
+
this.beholdReplaceChildren(this._videoEl, this._soundControlEl);
|
892
|
+
}
|
893
|
+
else {
|
894
|
+
this._imageEl = createElement({
|
895
|
+
type: 'behold-image',
|
896
|
+
props: {
|
897
|
+
sizes: this.post.sizes,
|
898
|
+
mediaUrl: this.post.thumbnailUrl,
|
899
|
+
aspectRatio: this.post.sizes.full.width / this.post.sizes.full.height,
|
900
|
+
},
|
901
|
+
listeners: {
|
902
|
+
load: this._onLoad,
|
903
|
+
},
|
904
|
+
});
|
905
|
+
this.beholdReplaceChildren(this._imageEl);
|
906
|
+
}
|
907
|
+
});
|
908
|
+
}
|
909
|
+
_handleLocalStateChange({ changedProps, newState }) {
|
910
|
+
if (changedProps.includes('isPlaying')) {
|
911
|
+
if (newState.isPlaying && !this._videoEl.isPlaying) {
|
912
|
+
this._videoEl.play();
|
913
|
+
}
|
914
|
+
if (!newState.isPlaying && this._videoEl.isPlaying) {
|
915
|
+
this._videoEl.pause();
|
916
|
+
}
|
917
|
+
}
|
918
|
+
}
|
919
|
+
_handleGlobalStateChange({ changedProps, newState }) {
|
920
|
+
if (changedProps.includes('isMuted')) {
|
921
|
+
if (this._videoEl && this._soundControlEl) {
|
922
|
+
if (newState.isMuted) {
|
923
|
+
this._videoEl.mute();
|
924
|
+
this._soundControlEl.innerHTML = mutedIcon;
|
925
|
+
}
|
926
|
+
else {
|
927
|
+
this._videoEl.unmute();
|
928
|
+
this._soundControlEl.innerHTML = unmutedIcon;
|
929
|
+
}
|
930
|
+
}
|
931
|
+
}
|
932
|
+
}
|
933
|
+
_onLoad() {
|
934
|
+
this.dispatchEvent(new Event('load'));
|
935
|
+
this.classList.add('is-loaded');
|
936
|
+
}
|
937
|
+
_onPlay() {
|
938
|
+
this.classList.remove('video-container--paused');
|
939
|
+
}
|
940
|
+
_onPause() {
|
941
|
+
this.classList.add('video-container--paused');
|
942
|
+
}
|
943
|
+
_togglePlayback() {
|
944
|
+
if (!this._videoEl)
|
945
|
+
return;
|
946
|
+
if (this._videoEl.isPlaying) {
|
947
|
+
this.pause();
|
948
|
+
}
|
949
|
+
else {
|
950
|
+
this.play();
|
951
|
+
}
|
952
|
+
}
|
953
|
+
_toggleSound() {
|
954
|
+
if (!this._videoEl)
|
955
|
+
return;
|
956
|
+
if (this._videoEl.muted) {
|
957
|
+
this.updateGlobalState({ isMuted: false });
|
958
|
+
}
|
959
|
+
else {
|
960
|
+
this.updateGlobalState({ isMuted: true });
|
961
|
+
}
|
962
|
+
}
|
963
|
+
play() {
|
964
|
+
this.updateLocalState({ isPlaying: true });
|
965
|
+
this.showSoundControl();
|
966
|
+
}
|
967
|
+
pause() {
|
968
|
+
this.updateLocalState({ isPlaying: false });
|
969
|
+
}
|
970
|
+
showSoundControl() {
|
971
|
+
if (!this.isConnected || !this._soundControlEl)
|
972
|
+
return;
|
973
|
+
this._soundControlEl.classList.add('video-mute--visible');
|
974
|
+
}
|
975
|
+
hideSoundControl() {
|
976
|
+
if (!this.isConnected || !this._soundControlEl)
|
977
|
+
return;
|
978
|
+
this._soundControlEl.classList.remove('video-mute--visible');
|
979
|
+
}
|
980
|
+
/**
|
981
|
+
* Preload
|
982
|
+
*/
|
983
|
+
preload() {
|
984
|
+
this._videoEl?.preload();
|
985
|
+
}
|
986
|
+
/*
|
987
|
+
* Register
|
988
|
+
*/
|
989
|
+
static register(name = 'behold-popover-slide-video') {
|
990
|
+
if (!customElements.get(name)) {
|
991
|
+
customElements.define(name, PopoverSlideVideo);
|
992
|
+
}
|
993
|
+
return name;
|
994
|
+
}
|
995
|
+
}
|
996
|
+
|
997
|
+
/**
|
998
|
+
* @description
|
999
|
+
* Required props: 'post'
|
1000
|
+
*/
|
1001
|
+
class PopoverSlideAlbum extends BaseElement {
|
1002
|
+
label = 'PopoverSlideAlbum';
|
1003
|
+
// Internal
|
1004
|
+
_containerEl;
|
1005
|
+
_spaceholderEl;
|
1006
|
+
_childEls;
|
1007
|
+
_previousEl;
|
1008
|
+
_nextEl;
|
1009
|
+
_breadcrumbsEl;
|
1010
|
+
_childCarousel;
|
1011
|
+
currentSlideIndex = 0;
|
1012
|
+
// Provided
|
1013
|
+
post;
|
1014
|
+
constructor() {
|
1015
|
+
super();
|
1016
|
+
// Listen to Prop changes
|
1017
|
+
this.onPropChange(() => { }, ['post']);
|
1018
|
+
// Register child components
|
1019
|
+
Image.register();
|
1020
|
+
PopoverSlideVideo.register();
|
1021
|
+
// Bind event handlers
|
1022
|
+
this._handleSlideChange = this._handleSlideChange.bind(this);
|
1023
|
+
this._handleIntersection = this._handleIntersection.bind(this);
|
1024
|
+
this.preload = this.preload.bind(this);
|
1025
|
+
// Connect
|
1026
|
+
this.onConnect(() => {
|
1027
|
+
this._childEls = this._buildSlideEls();
|
1028
|
+
const spaceholderSource = this.post.sizes?.full?.height
|
1029
|
+
? `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' width='${this.post.sizes?.full?.width}' height='${this.post.sizes?.full?.height}'%3E%3C/svg%3E%0A`
|
1030
|
+
: this.post.children?.[0]?.sizes?.full.mediaUrl ||
|
1031
|
+
this.post.children?.[0]?.thumbnailUrl ||
|
1032
|
+
null;
|
1033
|
+
if (this.post.mediaUrlIsVideo && !spaceholderSource) {
|
1034
|
+
this._spaceholderEl = createElement({
|
1035
|
+
type: 'video',
|
1036
|
+
classes: 'slide__carousel-spaceholder',
|
1037
|
+
attributes: {
|
1038
|
+
src: this.post.mediaUrl,
|
1039
|
+
height: this.post.sizes?.full?.height,
|
1040
|
+
width: this.post.sizes?.full?.width,
|
1041
|
+
},
|
1042
|
+
props: {
|
1043
|
+
muted: true,
|
1044
|
+
},
|
1045
|
+
});
|
1046
|
+
}
|
1047
|
+
else {
|
1048
|
+
this._spaceholderEl = createElement({
|
1049
|
+
type: 'img',
|
1050
|
+
classes: 'slide__carousel-spaceholder',
|
1051
|
+
attributes: {
|
1052
|
+
src: spaceholderSource,
|
1053
|
+
height: this.post.sizes?.full?.height,
|
1054
|
+
width: this.post.sizes?.full?.width,
|
1055
|
+
},
|
1056
|
+
});
|
1057
|
+
}
|
1058
|
+
this._previousEl = createElement({
|
1059
|
+
type: 'button',
|
1060
|
+
classes: 'slide__carousel-previous',
|
1061
|
+
attributes: { 'aria-label': 'Previous album slide' },
|
1062
|
+
contents: caretLeftIcon,
|
1063
|
+
});
|
1064
|
+
this._nextEl = createElement({
|
1065
|
+
type: 'button',
|
1066
|
+
classes: 'slide__carousel-next',
|
1067
|
+
attributes: { 'aria-label': 'Next album slide' },
|
1068
|
+
contents: caretRightIcon,
|
1069
|
+
});
|
1070
|
+
this._breadcrumbsEl = createElement({
|
1071
|
+
classes: 'slide__carousel-breadcrumbs',
|
1072
|
+
});
|
1073
|
+
this._containerEl = createElement({
|
1074
|
+
classes: 'slide__carousel',
|
1075
|
+
contents: [
|
1076
|
+
...this._childEls,
|
1077
|
+
this._previousEl,
|
1078
|
+
this._nextEl,
|
1079
|
+
this._breadcrumbsEl,
|
1080
|
+
],
|
1081
|
+
});
|
1082
|
+
this.replaceChildren(this._spaceholderEl, this._containerEl);
|
1083
|
+
this._childCarousel = new HurdyGurdy({
|
1084
|
+
slides: this._childEls,
|
1085
|
+
containerEl: this._containerEl,
|
1086
|
+
keyboardNav: false,
|
1087
|
+
breadcrumbsContainerEl: this._breadcrumbsEl,
|
1088
|
+
dynamicBreadCrumbsCutoff: 7,
|
1089
|
+
previousEl: this._previousEl,
|
1090
|
+
nextEl: this._nextEl,
|
1091
|
+
onSlideChange: this._handleSlideChange,
|
1092
|
+
virtualize: true,
|
1093
|
+
proximalSlidesToRender: 2,
|
1094
|
+
dragLimit: 0.6,
|
1095
|
+
});
|
1096
|
+
this.onIntersection(this, this._handleIntersection);
|
1097
|
+
});
|
1098
|
+
this.onDisconnect(() => {
|
1099
|
+
this._childCarousel.destroy();
|
1100
|
+
this._childCarousel = null;
|
1101
|
+
});
|
1102
|
+
}
|
1103
|
+
/**
|
1104
|
+
* Update tabbable els
|
1105
|
+
*/
|
1106
|
+
_updateTabbable() {
|
1107
|
+
updateTabbableEls({
|
1108
|
+
include: [this._childEls[this.currentSlideIndex]],
|
1109
|
+
exclude: this._childEls.filter((c, i) => i !== this.currentSlideIndex),
|
1110
|
+
merge: true,
|
1111
|
+
});
|
1112
|
+
}
|
1113
|
+
/**
|
1114
|
+
* On intersection
|
1115
|
+
*/
|
1116
|
+
_handleIntersection(entry) {
|
1117
|
+
if (entry.isIntersecting) {
|
1118
|
+
this._childCarousel.init(0);
|
1119
|
+
}
|
1120
|
+
}
|
1121
|
+
/**
|
1122
|
+
* On slide change
|
1123
|
+
*/
|
1124
|
+
_handleSlideChange(newIndex, isInitial = false) {
|
1125
|
+
if (newIndex !== this.currentSlideIndex &&
|
1126
|
+
this.globalState.keyboardNavEnabled) {
|
1127
|
+
announceToScreenReader(`Slide ${newIndex + 1} of ${this._childEls.length} in Album`);
|
1128
|
+
}
|
1129
|
+
this.currentSlideIndex = newIndex;
|
1130
|
+
this._childEls.forEach((child, i) => {
|
1131
|
+
if (isVideoSlide(child)) {
|
1132
|
+
if (i === newIndex) {
|
1133
|
+
child.play();
|
1134
|
+
}
|
1135
|
+
else {
|
1136
|
+
child.hideSoundControl();
|
1137
|
+
child.pause();
|
1138
|
+
}
|
1139
|
+
}
|
1140
|
+
});
|
1141
|
+
const prev = this._childEls[newIndex - 1];
|
1142
|
+
const next = this._childEls[newIndex + 1];
|
1143
|
+
if (prev)
|
1144
|
+
prev.preload();
|
1145
|
+
if (next)
|
1146
|
+
next.preload();
|
1147
|
+
this._updateTabbable();
|
1148
|
+
if (!isInitial) {
|
1149
|
+
this._setBackgroundColor(newIndex);
|
1150
|
+
}
|
1151
|
+
}
|
1152
|
+
/**
|
1153
|
+
* Set background color
|
1154
|
+
*/
|
1155
|
+
_setBackgroundColor(index) {
|
1156
|
+
const hslArray = RGBStringToHSLArray(this.post.children[index].colorPalette?.dominant || '100,100,100').map((val) => Math.round(val));
|
1157
|
+
this.style.backgroundColor = `hsl(${hslArray[0]} ${Math.min(hslArray[1], 35)}% ${Math.min(hslArray[2], 13)}%)`;
|
1158
|
+
const ldrColorHSLArray = RGBStringToHSLArray(this.post.children[index].colorPalette?.dominant || '255,255,255').map((val) => Math.round(val));
|
1159
|
+
const ldrColorString = `hsl(${ldrColorHSLArray[0]} ${ldrColorHSLArray[1]}% ${Math.max(ldrColorHSLArray[2], 50)}%)`;
|
1160
|
+
this.style.setProperty('--uib-color', ldrColorString);
|
1161
|
+
this.updateGlobalState({
|
1162
|
+
popoverOverlayHslArray: hslArray,
|
1163
|
+
});
|
1164
|
+
}
|
1165
|
+
/**
|
1166
|
+
* Build slide els
|
1167
|
+
*/
|
1168
|
+
_buildSlideEls() {
|
1169
|
+
return this.post.children.map((child) => {
|
1170
|
+
let mediaEl = null;
|
1171
|
+
switch (child.mediaType) {
|
1172
|
+
case 'IMAGE':
|
1173
|
+
mediaEl = createElement({
|
1174
|
+
type: 'behold-image',
|
1175
|
+
classes: 'slide__carousel-slide',
|
1176
|
+
props: {
|
1177
|
+
sizes: child.sizes,
|
1178
|
+
mediaUrl: child.mediaUrl,
|
1179
|
+
showLoader: true,
|
1180
|
+
aspectRatio: child.sizes.full.width / child.sizes.full.height,
|
1181
|
+
},
|
1182
|
+
});
|
1183
|
+
break;
|
1184
|
+
case 'VIDEO':
|
1185
|
+
mediaEl = createElement({
|
1186
|
+
type: 'behold-popover-slide-video',
|
1187
|
+
classes: 'slide__carousel-slide',
|
1188
|
+
props: {
|
1189
|
+
post: child,
|
1190
|
+
},
|
1191
|
+
});
|
1192
|
+
break;
|
1193
|
+
}
|
1194
|
+
return mediaEl;
|
1195
|
+
});
|
1196
|
+
}
|
1197
|
+
/**
|
1198
|
+
* Play
|
1199
|
+
*/
|
1200
|
+
play() {
|
1201
|
+
const currentChild = this._childEls[this.currentSlideIndex];
|
1202
|
+
if (isVideoSlide(currentChild)) {
|
1203
|
+
currentChild.play();
|
1204
|
+
}
|
1205
|
+
}
|
1206
|
+
/**
|
1207
|
+
* Pause
|
1208
|
+
*/
|
1209
|
+
pause() {
|
1210
|
+
this._childEls.filter(isVideoSlide).forEach((child) => {
|
1211
|
+
child.hideSoundControl();
|
1212
|
+
child.pause();
|
1213
|
+
});
|
1214
|
+
}
|
1215
|
+
/**
|
1216
|
+
* Preload media
|
1217
|
+
*/
|
1218
|
+
preload() {
|
1219
|
+
this._childEls?.[0]?.preload();
|
1220
|
+
}
|
1221
|
+
/*
|
1222
|
+
* Register
|
1223
|
+
*/
|
1224
|
+
static register(name = 'behold-popover-slide-album') {
|
1225
|
+
if (!customElements.get(name)) {
|
1226
|
+
customElements.define(name, PopoverSlideAlbum);
|
1227
|
+
}
|
1228
|
+
return name;
|
1229
|
+
}
|
1230
|
+
}
|
1231
|
+
const isVideoSlide = (slide) => slide.tagName === 'BEHOLD-POPOVER-SLIDE-VIDEO';
|
1232
|
+
|
1233
|
+
var hashIcon = "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 16 16\" enable-background=\"new 0 0 16 16\" xml:space=\"preserve\">\n<g>\n\t<path fill=\"#262626\" d=\"M13.8,5.9H3.2c-0.4,0-0.7-0.3-0.7-0.7s0.3-0.7,0.7-0.7h10.6c0.4,0,0.7,0.3,0.7,0.7S14.1,5.9,13.8,5.9z\"/>\n</g>\n<g>\n\t<path fill=\"#262626\" d=\"M12.8,10.8H2.2c-0.4,0-0.7-0.3-0.7-0.7s0.3-0.7,0.7-0.7h10.6c0.4,0,0.7,0.3,0.7,0.7S13.2,10.8,12.8,10.8z\"\n\t\t/>\n</g>\n<g>\n\t<path fill=\"#262626\" d=\"M8.9,15.3c0,0-0.1,0-0.1,0c-0.4-0.1-0.6-0.4-0.5-0.8l2.4-13.3c0.1-0.4,0.4-0.6,0.8-0.5\n\t\tc0.4,0.1,0.6,0.4,0.5,0.8L9.6,14.8C9.5,15.1,9.2,15.3,8.9,15.3z\"/>\n</g>\n<g>\n\t<path fill=\"#262626\" d=\"M4.7,15.3c0,0-0.1,0-0.1,0c-0.4-0.1-0.6-0.4-0.5-0.8L6.4,1.2c0.1-0.4,0.4-0.6,0.8-0.5\n\t\tc0.4,0.1,0.6,0.4,0.5,0.8L5.3,14.8C5.3,15.1,5,15.3,4.7,15.3z\"/>\n</g>\n</svg>";
|
1234
|
+
|
1235
|
+
var externalLinkIcon = "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 20 20\" enable-background=\"new 0 0 20 20\" xml:space=\"preserve\">\n<g>\n\t<path d=\"M16,19.8H4c-2.1,0-3.8-1.7-3.8-3.8V4c0-2.1,1.7-3.8,3.8-3.8h12c2.1,0,3.8,1.7,3.8,3.8v12C19.8,18.1,18.1,19.8,16,19.8z\n\t\t M4,1.8c-1.2,0-2.2,1-2.2,2.2v12c0,1.2,1,2.2,2.2,2.2h12c1.2,0,2.2-1,2.2-2.2V4c0-1.2-1-2.2-2.2-2.2H4z\"/>\n</g>\n<path d=\"M14.4,5.6v7.5h-1.5V8.2l-6,6l-1.1-1.1l6-6H6.9V5.6H14.4z\"/>\n</svg>";
|
1236
|
+
|
1237
|
+
/**
|
1238
|
+
* @description
|
1239
|
+
* Required props: 'post', 'feedMetadata'
|
1240
|
+
*/
|
1241
|
+
class PopoverGallerySlide extends BaseElement {
|
1242
|
+
label = 'PopoverGallerySlide';
|
1243
|
+
// Internal
|
1244
|
+
_innerEl;
|
1245
|
+
_avatarImageEl;
|
1246
|
+
_headerText;
|
1247
|
+
_avatarEl;
|
1248
|
+
_headerEl;
|
1249
|
+
_captionEl;
|
1250
|
+
_footerLinkEl;
|
1251
|
+
_footerEl;
|
1252
|
+
_textEl;
|
1253
|
+
_mediaEl;
|
1254
|
+
_moreEl;
|
1255
|
+
// Provided
|
1256
|
+
post;
|
1257
|
+
feedMetadata;
|
1258
|
+
constructor() {
|
1259
|
+
super();
|
1260
|
+
// Define which props will trigger _handlePropChange
|
1261
|
+
this.onPropChange(this._handlePropChange, ['post', 'feedMetadata']);
|
1262
|
+
// Register child components
|
1263
|
+
Image.register();
|
1264
|
+
PopoverSlideVideo.register();
|
1265
|
+
PopoverSlideAlbum.register();
|
1266
|
+
// Bind event listeners
|
1267
|
+
this.expandCaption = this.expandCaption.bind(this);
|
1268
|
+
this.preload = this.preload.bind(this);
|
1269
|
+
// Connect
|
1270
|
+
this.onConnect(() => {
|
1271
|
+
this.render();
|
1272
|
+
});
|
1273
|
+
}
|
1274
|
+
/**
|
1275
|
+
* Render contents
|
1276
|
+
*/
|
1277
|
+
render() {
|
1278
|
+
this.classList.remove('is-loaded');
|
1279
|
+
if (!this.post)
|
1280
|
+
return;
|
1281
|
+
const hslArray = RGBStringToHSLArray(this.post.colorPalette?.dominant || '100,100,100').map((val) => Math.round(val));
|
1282
|
+
const bgColorString = `hsl(${hslArray[0]} ${Math.min(hslArray[1], 35)}% ${Math.min(hslArray[2], 13)}%)`;
|
1283
|
+
const ldrColorHSLArray = RGBStringToHSLArray(this.post.colorPalette?.dominant || '255,255,255').map((val) => Math.round(val));
|
1284
|
+
const ldrColorString = `hsl(${ldrColorHSLArray[0]} ${ldrColorHSLArray[1]}% ${Math.max(ldrColorHSLArray[2], 50)}%)`;
|
1285
|
+
this.style.setProperty('--uib-color', ldrColorString);
|
1286
|
+
switch (this.post?.mediaType) {
|
1287
|
+
case 'VIDEO':
|
1288
|
+
this._mediaEl = createElement({
|
1289
|
+
type: 'behold-popover-slide-video',
|
1290
|
+
classes: 'slide__media',
|
1291
|
+
style: {
|
1292
|
+
backgroundColor: bgColorString,
|
1293
|
+
},
|
1294
|
+
props: {
|
1295
|
+
post: this.post,
|
1296
|
+
},
|
1297
|
+
});
|
1298
|
+
break;
|
1299
|
+
case 'CAROUSEL_ALBUM':
|
1300
|
+
this._mediaEl = createElement({
|
1301
|
+
type: 'behold-popover-slide-album',
|
1302
|
+
classes: 'slide__media',
|
1303
|
+
style: {
|
1304
|
+
backgroundColor: bgColorString,
|
1305
|
+
},
|
1306
|
+
props: {
|
1307
|
+
post: this.post,
|
1308
|
+
aspectRatio: this.post.sizes.full.width / this.post.sizes.full.height,
|
1309
|
+
},
|
1310
|
+
});
|
1311
|
+
break;
|
1312
|
+
case 'IMAGE':
|
1313
|
+
default:
|
1314
|
+
this._mediaEl = createElement({
|
1315
|
+
type: 'behold-image',
|
1316
|
+
classes: 'slide__media',
|
1317
|
+
style: {
|
1318
|
+
backgroundColor: bgColorString,
|
1319
|
+
},
|
1320
|
+
props: {
|
1321
|
+
sizes: this.post.sizes,
|
1322
|
+
mediaUrl: this.post.mediaUrl,
|
1323
|
+
showLoader: true,
|
1324
|
+
aspectRatio: this.post.sizes.full.width / this.post.sizes.full.height,
|
1325
|
+
},
|
1326
|
+
});
|
1327
|
+
}
|
1328
|
+
this._avatarImageEl = !this.feedMetadata?.profilePictureUrl
|
1329
|
+
? null
|
1330
|
+
: createElement({
|
1331
|
+
type: 'img',
|
1332
|
+
attributes: { src: this.feedMetadata.profilePictureUrl },
|
1333
|
+
});
|
1334
|
+
this._headerText = '@' + this.feedMetadata.username;
|
1335
|
+
if (this.feedMetadata.hashtags) {
|
1336
|
+
this._avatarImageEl = hashIcon;
|
1337
|
+
this._headerText = this.feedMetadata.hashtags.join(', ');
|
1338
|
+
}
|
1339
|
+
this._avatarEl = this._avatarImageEl
|
1340
|
+
? createElement({
|
1341
|
+
classes: 'slide__avatar',
|
1342
|
+
contents: this._avatarImageEl,
|
1343
|
+
attributes: {
|
1344
|
+
'aria-label': this.feedMetadata.hashtags ? 'hashtags' : 'username',
|
1345
|
+
},
|
1346
|
+
})
|
1347
|
+
: null;
|
1348
|
+
this._headerEl = createElement({
|
1349
|
+
classes: 'slide__header',
|
1350
|
+
contents: [this._avatarEl, this._headerText],
|
1351
|
+
});
|
1352
|
+
this._captionEl = this.post?.caption?.trim()?.length
|
1353
|
+
? createElement({
|
1354
|
+
classes: 'slide__caption',
|
1355
|
+
contents: this.post.caption,
|
1356
|
+
})
|
1357
|
+
: null;
|
1358
|
+
this._footerLinkEl = this.post.permalink
|
1359
|
+
? createElement({
|
1360
|
+
type: 'a',
|
1361
|
+
attributes: {
|
1362
|
+
href: this.post.permalink,
|
1363
|
+
target: '_blank',
|
1364
|
+
},
|
1365
|
+
classes: 'slide__footer-link',
|
1366
|
+
contents: ['Go to post', externalLinkIcon],
|
1367
|
+
})
|
1368
|
+
: '';
|
1369
|
+
this._footerEl = createElement({
|
1370
|
+
classes: 'slide__footer',
|
1371
|
+
contents: [this._footerLinkEl],
|
1372
|
+
});
|
1373
|
+
this._textEl = createElement({
|
1374
|
+
classes: 'slide__text',
|
1375
|
+
contents: [this._headerEl, this._captionEl, this._footerEl],
|
1376
|
+
});
|
1377
|
+
this._innerEl = createElement({
|
1378
|
+
classes: 'slide__inner',
|
1379
|
+
contents: [this._mediaEl, this._textEl],
|
1380
|
+
});
|
1381
|
+
this._moreEl = createElement({
|
1382
|
+
type: 'button',
|
1383
|
+
classes: 'slide__more',
|
1384
|
+
contents: '… more',
|
1385
|
+
listeners: { click: this.expandCaption },
|
1386
|
+
});
|
1387
|
+
this.beholdReplaceChildren(this._innerEl);
|
1388
|
+
forceLayout();
|
1389
|
+
this.to(() => {
|
1390
|
+
this.classList.add('is-loaded');
|
1391
|
+
}, 10, 'onConnect');
|
1392
|
+
}
|
1393
|
+
/*
|
1394
|
+
* Handle prop change
|
1395
|
+
*/
|
1396
|
+
_handlePropChange({ changedProp, newValue }) {
|
1397
|
+
switch (changedProp) {
|
1398
|
+
case 'feedMetadata':
|
1399
|
+
if (!this.isConnected)
|
1400
|
+
return;
|
1401
|
+
this._headerText = '@' + newValue.username;
|
1402
|
+
if (newValue.hashtags?.length) {
|
1403
|
+
this._avatarImageEl = hashIcon;
|
1404
|
+
this._headerText = newValue.hashtags.join(', ');
|
1405
|
+
}
|
1406
|
+
else {
|
1407
|
+
this._avatarImageEl = !newValue?.profilePictureUrl
|
1408
|
+
? null
|
1409
|
+
: createElement({
|
1410
|
+
type: 'img',
|
1411
|
+
attributes: { src: newValue.profilePictureUrl },
|
1412
|
+
});
|
1413
|
+
}
|
1414
|
+
this._avatarEl = this._avatarImageEl
|
1415
|
+
? createElement({
|
1416
|
+
classes: 'slide__avatar',
|
1417
|
+
contents: this._avatarImageEl,
|
1418
|
+
attributes: {
|
1419
|
+
'aria-label': this.feedMetadata.hashtags
|
1420
|
+
? 'hashtags'
|
1421
|
+
: 'username',
|
1422
|
+
},
|
1423
|
+
})
|
1424
|
+
: null;
|
1425
|
+
this._headerEl = createElement({
|
1426
|
+
classes: 'slide__header',
|
1427
|
+
contents: [this._avatarEl, this._headerText],
|
1428
|
+
});
|
1429
|
+
break;
|
1430
|
+
case 'post':
|
1431
|
+
if (!this._mediaEl) {
|
1432
|
+
this.render();
|
1433
|
+
}
|
1434
|
+
if (newValue?.mediaType === 'IMAGE') {
|
1435
|
+
Object.assign(this._mediaEl, {
|
1436
|
+
sizes: this.post.sizes,
|
1437
|
+
mediaUrl: this.post.mediaUrl,
|
1438
|
+
showLoader: true,
|
1439
|
+
});
|
1440
|
+
}
|
1441
|
+
else {
|
1442
|
+
if (!isImage(this._mediaEl)) {
|
1443
|
+
this._mediaEl.post = newValue;
|
1444
|
+
}
|
1445
|
+
}
|
1446
|
+
break;
|
1447
|
+
}
|
1448
|
+
}
|
1449
|
+
/**
|
1450
|
+
* Activate
|
1451
|
+
*/
|
1452
|
+
activate() {
|
1453
|
+
if ('VIDEO,CAROUSEL_ALBUM'.includes(this.post.mediaType) && this._mediaEl) {
|
1454
|
+
const videoEl = this._mediaEl;
|
1455
|
+
videoEl.play();
|
1456
|
+
}
|
1457
|
+
}
|
1458
|
+
/**
|
1459
|
+
* Deactivate
|
1460
|
+
*/
|
1461
|
+
deactivate() {
|
1462
|
+
if (this.post.mediaType === 'VIDEO' && this._mediaEl) {
|
1463
|
+
const el = this._mediaEl;
|
1464
|
+
el.pause();
|
1465
|
+
}
|
1466
|
+
if (this.post.mediaType === 'CAROUSEL_ALBUM' && this._mediaEl) {
|
1467
|
+
const el = this._mediaEl;
|
1468
|
+
el.pause();
|
1469
|
+
}
|
1470
|
+
}
|
1471
|
+
/**
|
1472
|
+
* Preload media
|
1473
|
+
*/
|
1474
|
+
preload() {
|
1475
|
+
this._mediaEl?.preload();
|
1476
|
+
}
|
1477
|
+
/**
|
1478
|
+
* Get background color
|
1479
|
+
*/
|
1480
|
+
getBackgroundColor() {
|
1481
|
+
let colorSource = this.post;
|
1482
|
+
if (this.post?.mediaType === 'CAROUSEL_ALBUM') {
|
1483
|
+
const albumEl = this._mediaEl;
|
1484
|
+
colorSource = this.post?.children?.[albumEl?.currentSlideIndex ?? 0];
|
1485
|
+
}
|
1486
|
+
const hslArray = RGBStringToHSLArray(colorSource?.colorPalette?.dominant || '100,100,100').map((val) => Math.round(val));
|
1487
|
+
return hslArray;
|
1488
|
+
}
|
1489
|
+
/**
|
1490
|
+
* Expand post caption
|
1491
|
+
*/
|
1492
|
+
expandCaption() {
|
1493
|
+
if (!this._captionEl)
|
1494
|
+
return;
|
1495
|
+
this._captionEl.style.transition = '';
|
1496
|
+
this._captionEl.style.height = this._captionEl.offsetHeight + 'px';
|
1497
|
+
this._captionEl.innerHTML = this.post?.caption || '';
|
1498
|
+
forceLayout();
|
1499
|
+
this.raf(() => {
|
1500
|
+
this._captionEl.style.transition = 'height .3s ease';
|
1501
|
+
this._captionEl.style.height = this._captionEl.scrollHeight + 'px';
|
1502
|
+
this.to(() => {
|
1503
|
+
this._captionEl.style.transition = '';
|
1504
|
+
this._captionEl.style.height = '';
|
1505
|
+
}, 300, 'expandCaption');
|
1506
|
+
}, 'expandCaption');
|
1507
|
+
}
|
1508
|
+
/**
|
1509
|
+
* Collapse post caption
|
1510
|
+
*/
|
1511
|
+
collapseCaption() {
|
1512
|
+
if (!this._captionEl)
|
1513
|
+
return;
|
1514
|
+
const truncatedCaption = getTruncatedText({
|
1515
|
+
text: this.post.caption,
|
1516
|
+
maxChars: 120,
|
1517
|
+
maxLines: 4,
|
1518
|
+
});
|
1519
|
+
this._captionEl.innerHTML = truncatedCaption;
|
1520
|
+
if (truncatedCaption?.length < this.post?.caption?.length) {
|
1521
|
+
this._captionEl.appendChild(this._moreEl);
|
1522
|
+
}
|
1523
|
+
}
|
1524
|
+
/*
|
1525
|
+
* Register
|
1526
|
+
*/
|
1527
|
+
static register(name = 'behold-popover-gallery-slide') {
|
1528
|
+
if (!customElements.get(name)) {
|
1529
|
+
customElements.define(name, PopoverGallerySlide);
|
1530
|
+
}
|
1531
|
+
return name;
|
1532
|
+
}
|
1533
|
+
}
|
1534
|
+
/*
|
1535
|
+
* Types
|
1536
|
+
*/
|
1537
|
+
const isImage = (el) => el.tagName === 'BEHOLD-IMAGE';
|
1538
|
+
|
1539
|
+
var xIcon = "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 20 20\" enable-background=\"new 0 0 20 20\" xml:space=\"preserve\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#081B10\" d=\"M11.6,10.1l5.5-5.7c0.5-0.5,0.5-1.1,0-1.6c-0.5-0.5-1.1-0.5-1.6,0\n\tl-5.5,5.6L4.4,2.8C4,2.4,3.3,2.4,2.8,2.8S2.4,4,2.8,4.4L8.4,10l-5.5,5.6c-0.5,0.5-0.5,1.1,0,1.6c0.5,0.5,1.1,0.5,1.6,0l5.5-5.6\n\tl5.5,5.6c0.5,0.5,1.1,0.5,1.6,0c0.5-0.5,0.5-1.1,0-1.6C17,15.6,11.6,10.1,11.6,10.1z\"/>\n</svg>";
|
1540
|
+
|
1541
|
+
var css_248z$2 = ":host{--icon-play:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 35 35' xml:space='preserve'%3E%3Cpath fill='%23FFF' d='M28.4 14.9 9.5 4.2C7.5 3.1 5 4.6 5 6.8v21.3c0 2.3 2.5 3.7 4.5 2.6l19-10.7c2-1 2-4-.1-5.1z'/%3E%3C/svg%3E\");--icon-gallery:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 35 35' xml:space='preserve'%3E%3Cpath fill='%23FFF' d='M27.3 22.7v-17c0-2.6-2.1-4.7-4.7-4.7H5.7C3.1 1 1 3.1 1 5.7v17c0 2.6 2.1 4.7 4.7 4.7h17c2.5-.1 4.6-2.2 4.6-4.7zm4-13.4v14.6c0 4.1-3.4 7.4-7.4 7.4H9.2c-.5 0-.8.6-.5 1 .9 1 2.2 1.6 3.7 1.6h12.1c5.2 0 9.3-4.2 9.3-9.3V12.5c0-1.5-.6-2.8-1.6-3.7-.3-.4-.9 0-.9.5z'/%3E%3C/svg%3E\");--bottomPadding:60px;--height:min(calc(100vh - 120px - var(--bottomPadding)),1400px);--width:calc(100vw - 120px);--text-width:400px;--text-color:#262626;--text-background:#fff;--text-size:15px;--border-color:#ededed;--ease-out-back:cubic-bezier(0.085,1.735,0.285,0.995);align-items:center;box-sizing:border-box;height:100vh;justify-content:flex-start;left:0;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:99999}:host *{box-sizing:border-box}@media (max-width:1200px){:host{--text-width:300px;--text-size:13px}}:host(.is-scroller){--text-width:100%;--height:auto;--width:calc(100vw - 40px)}@media (prefers-color-scheme:dark){:host(.theme--auto){--text-color:#f2f2f2;--text-background:#1a1a1a;--border-color:#292929}}:host(.theme--dark){--text-color:#f2f2f2;--text-background:#1a1a1a;--border-color:#292929}:host(.is-visible){pointer-events:all}.overlay{background-color:rgba(0,0,0,.6);display:block;height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transition:all .3s ease;width:100%;will-change:opacity,background-color}@media (min-width:901px){.overlay{-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}}:host(.is-visible) .overlay{opacity:1;pointer-events:all}.inner{display:flex;height:calc(100% - var(--bottomPadding));justify-content:center;pointer-events:none;position:relative;width:100%;z-index:1}:host(.is-scroller) .inner{height:100%}behold-popover-gallery-slide{align-items:center;display:flex;flex-grow:0;flex-shrink:0;height:calc(100% - var(--bottomPadding));justify-content:center;margin:0;opacity:0;padding:0;pointer-events:none;transform:scale(.99);transition:transform .2s ease-out,opacity .2s ease-out;width:100%}@media (min-width:901px){behold-popover-gallery-slide:active{cursor:grabbing}}@media (prefers-reduced-motion){behold-popover-gallery-slide{transform:none;transition:none}}:host(.is-visible) behold-popover-gallery-slide.is-loaded{opacity:1;transform:none}:host(.is-scroller) behold-popover-gallery-slide{height:auto;margin-top:10px}.slide__inner{align-items:center;background-color:var(--text-background);display:flex;justify-content:center;max-height:var(--height);max-width:var(--width);overflow:hidden;pointer-events:all;position:relative}:host(.is-scroller) .slide__inner{border-radius:4px;flex-direction:column}.slide__media{align-items:center;display:flex;flex-shrink:1;height:var(--height);justify-content:center;max-height:var(--height);overflow:hidden;position:relative;transition:background-color .3s ease;z-index:1}behold-image img,behold-image video,behold-video img,behold-video video{height:auto;max-height:100%;-o-object-fit:contain;object-fit:contain;-o-object-position:center center;object-position:center center;opacity:0;position:relative;width:auto;z-index:1}.behold-ps-container behold-image img,.behold-ps-container behold-image video,.behold-ps-container behold-video img,.behold-ps-container behold-video video{max-width:100%}behold-image{min-height:10px;min-width:10px;pointer-events:none;position:relative}@supports (aspect-ratio:1/1){behold-image img{min-height:100%;min-width:100%}}behold-image.is-loaded img{opacity:1;transition:opacity .4s ease}.slide__carousel{height:100%;left:0;position:absolute;top:0;width:100%}.slide__carousel:before{background:linear-gradient(0deg,rgba(0,0,0,.4),transparent);bottom:0;height:60px;left:0;width:100%;z-index:1}.slide__carousel:after,.slide__carousel:before{content:\"\";pointer-events:none;position:absolute;transform:translateZ(0)}.slide__carousel:after{background:var(--icon-gallery);height:20px;left:20px;opacity:.75;top:20px;width:20px;z-index:2}:host(.is-scroller) .slide__carousel:after{left:auto;right:15px;top:15px}img.slide__carousel-spaceholder,video.slide__carousel-spaceholder{height:auto;max-height:100%;opacity:0;pointer-events:none;visibility:hidden;width:auto}.behold-ps-container img.slide__carousel-spaceholder,.behold-ps-container video.slide__carousel-spaceholder{max-width:100%}.slide__carousel-breadcrumbs{bottom:30px;height:10px;left:50%;position:absolute;transform:translateX(-50%);z-index:2}:host(.is-scroller) .slide__carousel-breadcrumbs{bottom:10px}.slide__carousel-next,.slide__carousel-previous{align-items:center;background-color:hsla(0,0%,100%,.95);border:none;border-radius:50%;box-shadow:0 0 10px rgba(0,0,0,.2);display:flex;height:30px;justify-content:center;opacity:.75;outline:none;position:absolute;top:50%;touch-action:manipulation;transform:translateY(-50%) translateZ(0);transition:opacity .3s ease;width:30px;z-index:2}:host(.keyboard-nav) .slide__carousel-next:focus,:host(.keyboard-nav) .slide__carousel-previous:focus{background-color:#000;box-shadow:0 0 10px rgba(0,0,0,.2),0 0 0 2px #4169e1,0 0 0 3px #fff;opacity:1}:host(.keyboard-nav) .slide__carousel-next:focus svg path,:host(.keyboard-nav) .slide__carousel-previous:focus svg path{fill:#fff}.slide__carousel-next:not(:disabled),.slide__carousel-previous:not(:disabled){cursor:pointer}.slide__carousel-next:not(:disabled):hover,.slide__carousel-previous:not(:disabled):hover{opacity:1}.slide__carousel-next:disabled,.slide__carousel-previous:disabled{opacity:.25}.slide__carousel-next:before,.slide__carousel-previous:before{content:\"\";height:60px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:60px}.slide__carousel-next svg,.slide__carousel-previous svg{height:12px;position:absolute;width:12px}.slide__carousel-next svg path,.slide__carousel-previous svg path{fill:#000}:host(.is-scroller) .slide__carousel-next,:host(.is-scroller) .slide__carousel-previous{background-color:transparent;box-shadow:none;height:20px;width:20px}:host(.is-scroller) .slide__carousel-next svg path,:host(.is-scroller) .slide__carousel-previous svg path{fill:#fff}.slide__carousel-previous{left:20px}.slide__carousel-previous svg{transform:translateX(-1px)}:host(.is-scroller) .slide__carousel-previous{left:10px}.slide__carousel-next{right:20px}.slide__carousel-next svg{transform:translateX(1px)}:host(.is-scroller) .slide__carousel-next{right:10px}.slide__carousel-slide{cursor:grab;display:flex;height:var(--height);overflow:hidden;width:auto}.slide__carousel-slide:active{cursor:grabbing}.slide__carousel-slide-media{height:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;pointer-events:none;width:auto}.video-container{align-items:center;cursor:pointer;display:flex;height:var(--height);justify-content:center;overflow:hidden;position:relative;width:100%}.video-container:after{background:var(--icon-play);content:\"\";filter:drop-shadow(1px 1px 1px rgba(0,0,0,.1));height:80px;left:calc(50% - 40px);opacity:0;pointer-events:none;position:absolute;top:calc(50% - 40px);transform:scale(.5);transition:all .15s ease;width:80px;z-index:2}.video-container.video-container--paused:after{opacity:.8;transform:none;transition:opacity .2s ease,transform .3s var(--ease-out-back)}.video-container:active{cursor:grabbing}behold-video{align-items:center;display:flex;height:100%;width:100%}behold-video.is-loaded video{opacity:1;transition:opacity .4s ease}.video-mute{align-items:center;background:transparent;border:none;bottom:0;cursor:pointer;display:flex;height:60px;justify-content:center;margin:0;opacity:0;outline:none;padding:0;position:absolute;right:0;transform:translateZ(0);transition:opacity .1s ease;width:60px;z-index:2}.video-mute.video-mute--visible{opacity:1;transition:opacity .2s ease .2s}.video-mute:before{background-color:rgba(0,0,0,.5);border-radius:50%;content:\"\";height:28px;left:calc(50% - 14px);position:absolute;top:calc(50% - 14px);width:28px}:host(.keyboard-nav) .video-mute:focus:before{background-color:#000;box-shadow:0 0 10px rgba(0,0,0,.2),0 0 0 2px #4169e1,0 0 0 4px #fff}.video-mute svg{height:20px;left:calc(50% - 10px);position:absolute;top:calc(50% - 10px);width:20px}.slide__text{align-items:stretch;box-shadow:-1px 0 0 var(--border-color);color:var(--text-color);display:flex;flex-direction:column;flex-shrink:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:var(--text-size);height:var(--height);justify-content:flex-start;pointer-events:none;position:relative;transform:translateZ(0);width:var(--text-width);z-index:1}.slide__header{align-items:center;border-bottom:1px solid var(--border-color);display:flex;font-weight:600;line-height:1.25;padding:30px}@media (prefers-color-scheme:dark){.theme--auto .slide__header{border-color:#292929}}.slide__header.theme--dark{border-color:#292929}@media (max-width:1200px){.slide__header{padding:20px}}.slide__avatar{align-items:center;border-radius:50%;display:flex;flex-shrink:0;height:42px;justify-content:center;margin-right:10px;overflow:hidden;position:relative;width:42px}.slide__avatar:before{background:radial-gradient(circle farthest-corner at 32% 106%,#ffe17d 0,#ffcd69 10%,#fa9137 28%,#eb4141 42%,transparent 82%),linear-gradient(135deg,#c33cbe 12%,#c33cbe 58%);height:100%;left:0;top:0;width:100%}.slide__avatar:after,.slide__avatar:before{border-radius:50%;content:\"\";position:absolute}.slide__avatar:after{background-color:var(--text-background);height:calc(100% - 4px);left:2px;top:2px;width:calc(100% - 4px)}@media (prefers-color-scheme:dark){.theme--auto .slide__avatar{background-color:#333}}.slide__avatar.theme--dark{background-color:#333}.slide__avatar img{border-radius:50%;height:calc(100% - 8px);position:relative;width:calc(100% - 8px);z-index:1}.slide__avatar svg{height:15px;position:relative;width:15px;z-index:1}.slide__avatar svg path{fill:var(--text-color)}:host(.is-scroller) .slide__avatar{height:32px;width:32px}:host(.is-scroller) .slide__avatar svg{height:12px;width:12px}.slide__caption{line-height:1.5;overflow:auto;padding:30px;scrollbar-width:none;white-space:pre-wrap;word-break:break-word}:host(.is-visible) .slide__caption{pointer-events:all}.slide__caption::-webkit-scrollbar{width:0!important}:host(.is-scroller) .slide__caption{overflow:hidden}.slide__more{background:transparent;border:none;color:var(--text-color);cursor:pointer;margin:0;opacity:.75;padding:0}.slide__more:hover{opacity:1;text-decoration:underline}.slide__footer{border-top:1px solid var(--border-color);margin-top:auto}:host(.is-visible) .slide__footer{pointer-events:all}.slide__footer-link{align-items:center;color:var(--text-color);cursor:pointer;display:flex;font-size:.9333em;font-weight:600;padding:30px;text-decoration:none;transition:background .3s ease}:host(.keyboard-nav) .slide__footer-link:focus{background-color:var(--border-color);border:none;box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #4169e1;outline:none;transition:background .1s ease}.slide__footer-link:hover{background-color:var(--border-color)}.slide__footer-link svg{height:17px;margin-left:auto;width:17px}.slide__footer-link svg path{fill:var(--text-color)}@media (max-width:1200px){.slide__footer-link{padding:20px}}.breadcrumbs{align-items:center;bottom:calc(var(--bottomPadding)/2 + 30px - (var(--breadCrumbDiameter) + 10px)/2);display:flex;gap:calc(var(--breadCrumbDiameter)*.75);height:calc(var(--breadCrumbDiameter) + 10px);justify-content:center;left:50%;opacity:0;position:absolute;transform:translateX(-50%);width:auto;z-index:2}:host(.is-visible) .breadcrumbs{opacity:1}.breadcrumbs-current,.breadcrumbs-current:empty{background-color:#fff;border-radius:calc(var(--breadCrumbDiameter)/2);display:block;height:var(--breadCrumbDiameter);position:absolute;top:5px;transition:width .3s ease;width:var(--breadCrumbDiameter);will-change:left,right,width}.breadcrumb,.breadcrumb:empty{background-color:hsla(0,0%,100%,.4);border-radius:50%;cursor:pointer;display:block;height:7px;transition:all .3s ease;width:7px}.breadcrumb:empty:hover,.breadcrumb:hover{background-color:#fff}.close{align-items:center;background:none;border:none;cursor:pointer;display:flex;height:30px;justify-content:center;margin:0;opacity:0;padding:0;position:absolute;right:15px;top:15px;width:30px;z-index:2}:host(.is-visible) .close{opacity:.75;transition:opacity .3s ease}:host(.is-visible) .close:hover{opacity:1}:host(.keyboard-nav) .close:focus{box-shadow:0 0 0 2px #4169e1,0 0 0 3px #fff;opacity:1}.close:focus{border:none;outline:none}.close:before{content:\"\";height:60px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:60px}.close svg{height:20px;width:20px}.close svg path{fill:#fff}:host(.is-scroller) .close{background-color:hsla(0,0%,97%,.85);border-radius:50%;opacity:1;right:5px;top:5px}:host(.is-scroller) .close svg{height:14px;width:14px}:host(.is-scroller) .close svg path{fill:#000}.next,.previous{align-items:center;background:none;border:none;cursor:pointer;display:flex;height:60px;justify-content:center;margin:0;opacity:0;padding:0;position:absolute;top:calc(50% - var(--bottomPadding)/2);touch-action:manipulation;transform:translateY(-50%);width:60px;z-index:2}:host(.is-visible) .next,:host(.is-visible) .previous{opacity:.75;transition:opacity .3s ease}:host(.is-visible) .next:focus,:host(.is-visible) .previous:focus{border:none;outline:none}:host(.is-visible) .next:hover,:host(.is-visible) .previous:hover{opacity:1}:host(.is-visible) .next:disabled,:host(.is-visible) .previous:disabled{cursor:default;opacity:.15}:host(.is-visible) .next:disabled:hover,:host(.is-visible) .previous:disabled:hover{opacity:.15}:host(.keyboard-nav) .next:focus,:host(.keyboard-nav) .previous:focus{box-shadow:0 0 0 2px #4169e1,0 0 0 3px #fff;opacity:1}.next svg,.previous svg{height:16px;width:16px}.next svg path,.previous svg path{fill:#fff}.previous{left:0}.next{right:0}.ldr{--uib-size:50px;--uib-speed:1s;--uib-stroke:2px;--uib-bg-opacity:0.1;align-items:center;border-radius:calc(var(--uib-stroke)/2);contain:strict;display:none;height:var(--uib-stroke);justify-content:center;left:calc(50% - var(--uib-size)/2);overflow:hidden;position:absolute;top:calc(50% - var(--uib-stroke)/2);transform:translateZ(0);width:var(--uib-size)}.ldr.ldr--visible{display:flex}behold-image.is-loaded .ldr{display:none}.ldr:before{left:0;opacity:var(--uib-bg-opacity);position:absolute;top:0}.ldr:after,.ldr:before{background-color:var(--uib-color);content:\"\";height:100%;transition:background-color .3s ease;width:100%}.ldr:after{animation:wobble var(--uib-speed) ease-in-out infinite;border-radius:calc(var(--uib-stroke)/2);transform:translateX(-95%)}@keyframes wobble{0%,to{transform:translateX(-95%)}50%{transform:translateX(95%)}}";
|
1542
|
+
var styles = css_248z$2;
|
1543
|
+
|
1544
|
+
var css_248z$1 = ".hg-container{align-items:flex-start;backface-visibility:hidden;contain:layout style;justify-content:flex-start;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform}.hg-container,.hg-slide{display:flex;height:100%;width:100%}.hg-slide{contain:strict;flex-grow:0;flex-shrink:0}.hg-breadcrumbs,.hg-slide{align-items:center;justify-content:center}.hg-breadcrumbs{--ease:cubic-bezier(0.215,0.61,0.355,1);display:flex;gap:calc(var(--breadCrumbDiameter)*.75);height:calc(var(--breadCrumbDiameter) + 10px);pointer-events:all;position:relative;transition:transform .4s var(--ease);width:auto;will-change:transform}.hg-breadcrumbs.no-transition{transition:none}@media (prefers-reduced-motion){.hg-breadcrumbs{transition:none}}.hg-breadcrumbs-current,.hg-breadcrumbs-current:empty{background-color:#fff;border-radius:calc(var(--breadCrumbDiameter)/2);display:block;height:var(--breadCrumbDiameter);position:absolute;top:5px;transition:width .3s var(--ease);width:var(--breadCrumbDiameter);will-change:left,right,width}.hg-breadcrumb,.hg-breadcrumb:empty{cursor:pointer;display:block;flex-shrink:0;height:var(--breadCrumbDiameter);position:relative;width:var(--breadCrumbDiameter)}.hg-breadcrumb:before,.hg-breadcrumb:empty:before{content:\"\";height:60px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:calc(var(--breadCrumbDiameter)*1.75)}.hg-breadcrumb:after,.hg-breadcrumb:empty:after{background-color:hsla(0,0%,100%,.4);border-radius:50%;content:\"\";height:100%;left:0;position:absolute;top:0;transition:all .3s var(--ease);width:100%}.no-transition .hg-breadcrumb:after,.no-transition .hg-breadcrumb:empty:after{transition:none}@media (prefers-reduced-motion){.hg-breadcrumb:after,.hg-breadcrumb:empty:after{transition:none}}.hg-breadcrumb.hg-breadcrumb--1:after,.hg-breadcrumb:empty.hg-breadcrumb--1:after{transform:scale(.85)}.hg-breadcrumb.hg-breadcrumb--2:after,.hg-breadcrumb:empty.hg-breadcrumb--2:after{opacity:.75;transform:scale(.7)}.hg-breadcrumb.hg-breadcrumb--3:after,.hg-breadcrumb:empty.hg-breadcrumb--3:after{opacity:.5;transform:scale(.55)}.hg-breadcrumb.hg-breadcrumb--4:after,.hg-breadcrumb:empty.hg-breadcrumb--4:after{opacity:.25;transform:scale(.4)}.hg-breadcrumb.hg-breadcrumb--hidden,.hg-breadcrumb:empty.hg-breadcrumb--hidden{pointer-events:none}.hg-breadcrumb.hg-breadcrumb--hidden:after,.hg-breadcrumb:empty.hg-breadcrumb--hidden:after{opacity:0;transform:scale(0)}.hg-breadcrumb:empty:hover:after,.hg-breadcrumb:hover:after{background-color:#fff;opacity:1;transform:none}";
|
1545
|
+
var hgStyles = css_248z$1;
|
1546
|
+
|
1547
|
+
var css_248z = ".behold-ps-container{display:flex;height:100vh;justify-content:center;overflow:auto;pointer-events:all;scrollbar-width:none;width:100%}.behold-ps-container::-webkit-scrollbar{width:0!important}.behold-ps-inner{max-width:400px}.behold-ps-inner:before{height:10px}.behold-ps-inner:after,.behold-ps-inner:before{content:\"\";display:block;pointer-events:none;width:100%}.behold-ps-inner:after{height:90px}";
|
1548
|
+
var psStyles = css_248z;
|
1549
|
+
|
1550
|
+
/**
|
1551
|
+
* @description
|
1552
|
+
* Required props: 'posts', 'widgetSettings', 'feedMetadata'
|
1553
|
+
*/
|
1554
|
+
class PopoverGallery extends BaseElement {
|
1555
|
+
label = 'PopoverGallery';
|
1556
|
+
// Provided
|
1557
|
+
posts;
|
1558
|
+
widgetSettings;
|
1559
|
+
feedMetadata;
|
1560
|
+
closeFocusEl = document.body;
|
1561
|
+
onSlideChange;
|
1562
|
+
// Internal
|
1563
|
+
_isOpen;
|
1564
|
+
_verticalScrollBreakpoint = 900;
|
1565
|
+
_shadow;
|
1566
|
+
_fragment;
|
1567
|
+
_styleEl;
|
1568
|
+
_overlayEl;
|
1569
|
+
_previousEl;
|
1570
|
+
_nextEl;
|
1571
|
+
_closeEl;
|
1572
|
+
_breadcrumbContainer;
|
1573
|
+
_innerEl;
|
1574
|
+
_postEls;
|
1575
|
+
_hurdyGurdy;
|
1576
|
+
_popoverScroller;
|
1577
|
+
_currentPostIndex = 0;
|
1578
|
+
_startingDocumentOverflow = '';
|
1579
|
+
_startingDocumentRightPadding = '';
|
1580
|
+
constructor() {
|
1581
|
+
super();
|
1582
|
+
this._shadow = this.attachShadow({ mode: 'open' });
|
1583
|
+
this._isOpen = false;
|
1584
|
+
// Listen to prop changes
|
1585
|
+
this.onPropChange(this._handlePropChange, [
|
1586
|
+
'posts',
|
1587
|
+
'widgetSettings',
|
1588
|
+
'feedMetadata',
|
1589
|
+
]);
|
1590
|
+
// Register child components
|
1591
|
+
PopoverGallerySlide.register();
|
1592
|
+
// Bind handlers
|
1593
|
+
this._handleSlideChange = this._handleSlideChange.bind(this);
|
1594
|
+
this._close = this._close.bind(this);
|
1595
|
+
this._handleKeydown = this._handleKeydown.bind(this);
|
1596
|
+
// On global state change
|
1597
|
+
this.onGlobalStateChange(this._handleGlobalStateChange);
|
1598
|
+
// connected
|
1599
|
+
this.onConnect(() => {
|
1600
|
+
setClasses(this, {
|
1601
|
+
'theme--light': this.widgetSettings.popupColorTheme === 'light',
|
1602
|
+
'theme--dark': this.widgetSettings.popupColorTheme === 'dark',
|
1603
|
+
'theme--auto': this.widgetSettings.popupColorTheme === 'auto',
|
1604
|
+
});
|
1605
|
+
setClasses(this, {
|
1606
|
+
'keyboard-nav': this.globalState.keyboardNavEnabled,
|
1607
|
+
});
|
1608
|
+
this._overlayEl = createElement({
|
1609
|
+
classes: 'overlay',
|
1610
|
+
listeners: { click: this._close },
|
1611
|
+
});
|
1612
|
+
this._previousEl = createElement({
|
1613
|
+
type: 'button',
|
1614
|
+
classes: 'previous',
|
1615
|
+
attributes: { 'aria-label': 'Previous post' },
|
1616
|
+
contents: caretLeftIcon,
|
1617
|
+
});
|
1618
|
+
this._nextEl = createElement({
|
1619
|
+
type: 'button',
|
1620
|
+
classes: 'next',
|
1621
|
+
attributes: { 'aria-label': 'Next post' },
|
1622
|
+
contents: caretRightIcon,
|
1623
|
+
});
|
1624
|
+
this._closeEl = createElement({
|
1625
|
+
type: 'button',
|
1626
|
+
classes: 'close',
|
1627
|
+
contents: xIcon,
|
1628
|
+
attributes: { 'aria-label': 'Close' },
|
1629
|
+
listeners: {
|
1630
|
+
click: (evt) => {
|
1631
|
+
evt.preventDefault();
|
1632
|
+
this._close();
|
1633
|
+
},
|
1634
|
+
},
|
1635
|
+
});
|
1636
|
+
this._breadcrumbContainer = createElement({
|
1637
|
+
classes: 'breadcrumbs',
|
1638
|
+
});
|
1639
|
+
this._postEls = this.posts.map((post) => {
|
1640
|
+
const el = document.createElement('behold-popover-gallery-slide');
|
1641
|
+
el.post = post;
|
1642
|
+
el.feedMetadata = this.feedMetadata;
|
1643
|
+
return el;
|
1644
|
+
});
|
1645
|
+
this._innerEl = createElement({
|
1646
|
+
classes: 'inner',
|
1647
|
+
contents: this._postEls,
|
1648
|
+
});
|
1649
|
+
this._fragment = document.createDocumentFragment();
|
1650
|
+
this._fragment.beholdReplaceChildren(this._overlayEl, this._innerEl, this._breadcrumbContainer, this._previousEl, this._nextEl, this._closeEl);
|
1651
|
+
this._styleEl = createElement({
|
1652
|
+
type: 'style',
|
1653
|
+
contents: [styles.toString(), hgStyles.toString(), psStyles.toString()],
|
1654
|
+
});
|
1655
|
+
this._hurdyGurdy = new HurdyGurdy({
|
1656
|
+
slides: this._postEls,
|
1657
|
+
containerEl: this._innerEl,
|
1658
|
+
breadcrumbsContainerEl: this._breadcrumbContainer,
|
1659
|
+
previousEl: this._previousEl,
|
1660
|
+
nextEl: this._nextEl,
|
1661
|
+
onSlideChange: this._handleSlideChange,
|
1662
|
+
breadcrumbDiameter: this._postEls.length > 9 ? 9 : 8,
|
1663
|
+
virtualize: true,
|
1664
|
+
dragLimit: 0.4,
|
1665
|
+
});
|
1666
|
+
this._popoverScroller = new PopoverScroller({
|
1667
|
+
slides: this._postEls,
|
1668
|
+
containerEl: this._innerEl,
|
1669
|
+
onSlideChange: this._handleSlideChange,
|
1670
|
+
onRequestClose: () => {
|
1671
|
+
this._close();
|
1672
|
+
},
|
1673
|
+
});
|
1674
|
+
this.onResize(this, this, this._handleResize);
|
1675
|
+
});
|
1676
|
+
this.onDisconnect(() => {
|
1677
|
+
document.removeEventListener('keydown', this._handleKeydown);
|
1678
|
+
releaseFocus(this.closeFocusEl);
|
1679
|
+
this._hurdyGurdy.destroy();
|
1680
|
+
this._popoverScroller.destroy();
|
1681
|
+
this._hurdyGurdy = null;
|
1682
|
+
this._popoverScroller = null;
|
1683
|
+
document.body.style.overflow = this._startingDocumentOverflow;
|
1684
|
+
document.documentElement.style.paddingRight =
|
1685
|
+
this._startingDocumentRightPadding;
|
1686
|
+
});
|
1687
|
+
}
|
1688
|
+
/**
|
1689
|
+
* Handle prop change
|
1690
|
+
*/
|
1691
|
+
_handlePropChange({ changedProp, oldValue, newValue }) {
|
1692
|
+
switch (changedProp) {
|
1693
|
+
case 'posts':
|
1694
|
+
if (newValue && this._innerEl) {
|
1695
|
+
this.cancelRaf('updatePosts');
|
1696
|
+
this._postEls = newValue.map((post) => {
|
1697
|
+
const el = document.createElement('behold-popover-gallery-slide');
|
1698
|
+
el.post = post;
|
1699
|
+
el.feedMetadata = this.feedMetadata;
|
1700
|
+
return el;
|
1701
|
+
});
|
1702
|
+
this._innerEl.beholdReplaceChildren(...this._postEls);
|
1703
|
+
this._currentPostIndex = Math.min(this._currentPostIndex, this._postEls.length - 1);
|
1704
|
+
if (this._isOpen) {
|
1705
|
+
this._render();
|
1706
|
+
forceLayout();
|
1707
|
+
this.raf(() => {
|
1708
|
+
this._checkSize(this.offsetWidth);
|
1709
|
+
}, 'updatePosts');
|
1710
|
+
}
|
1711
|
+
}
|
1712
|
+
case 'widgetSettings':
|
1713
|
+
if (hasChanges(oldValue, newValue, 'popupColorTheme')) {
|
1714
|
+
setClasses(this, {
|
1715
|
+
'theme--light': this.widgetSettings.popupColorTheme === 'light',
|
1716
|
+
'theme--dark': this.widgetSettings.popupColorTheme === 'dark',
|
1717
|
+
'theme--auto': this.widgetSettings.popupColorTheme === 'auto',
|
1718
|
+
});
|
1719
|
+
}
|
1720
|
+
break;
|
1721
|
+
case 'feedMetadata':
|
1722
|
+
if (this._postEls) {
|
1723
|
+
this._postEls.map((el) => {
|
1724
|
+
el.feedMetadata = newValue;
|
1725
|
+
});
|
1726
|
+
}
|
1727
|
+
break;
|
1728
|
+
}
|
1729
|
+
}
|
1730
|
+
/**
|
1731
|
+
* Handle state change
|
1732
|
+
*/
|
1733
|
+
_handleGlobalStateChange({ changedProps, newState }) {
|
1734
|
+
if (changedProps.includes('keyboardNavEnabled')) {
|
1735
|
+
setClasses(this, {
|
1736
|
+
'keyboard-nav': this.globalState.keyboardNavEnabled,
|
1737
|
+
});
|
1738
|
+
}
|
1739
|
+
if (changedProps.includes('popoverOverlayHslArray') ||
|
1740
|
+
changedProps.includes('popoverOverlayOpacity')) {
|
1741
|
+
const hslArray = newState.popoverOverlayHslArray;
|
1742
|
+
const opacity = newState.popoverOverlayOpacity;
|
1743
|
+
this.raf(() => {
|
1744
|
+
this._overlayEl.style.backgroundColor = `hsl(${hslArray[0]} ${Math.min(hslArray[1], 50)}% ${Math.min(hslArray[2], 15)}% / ${opacity})`;
|
1745
|
+
}, 'overlayColor');
|
1746
|
+
}
|
1747
|
+
}
|
1748
|
+
/**
|
1749
|
+
* Handle keydown
|
1750
|
+
*/
|
1751
|
+
_handleKeydown(evt) {
|
1752
|
+
if (evt.code === 'Escape') {
|
1753
|
+
evt.preventDefault();
|
1754
|
+
this._close();
|
1755
|
+
}
|
1756
|
+
}
|
1757
|
+
/**
|
1758
|
+
* Open
|
1759
|
+
*/
|
1760
|
+
open(index, closeFocusEl) {
|
1761
|
+
if (this._isOpen)
|
1762
|
+
return;
|
1763
|
+
this._isOpen = true;
|
1764
|
+
this._currentPostIndex = index;
|
1765
|
+
this.cancelRaf('open');
|
1766
|
+
this.closeFocusEl = closeFocusEl;
|
1767
|
+
this._startingDocumentOverflow = document.body.style.overflow;
|
1768
|
+
const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
|
1769
|
+
this._startingDocumentRightPadding =
|
1770
|
+
document.documentElement.style.paddingRight;
|
1771
|
+
const computedRightPadding = parseInt(getComputedStyle(document.documentElement).paddingRight.replace('px', ''));
|
1772
|
+
document.documentElement.style.paddingRight = `${computedRightPadding + scrollbarWidth}px`;
|
1773
|
+
this.style.paddingRight = `${scrollbarWidth}px`;
|
1774
|
+
document.body.style.overflow = 'hidden';
|
1775
|
+
this._render();
|
1776
|
+
forceLayout();
|
1777
|
+
this.raf(() => {
|
1778
|
+
this.classList.add('is-visible');
|
1779
|
+
trapFocus(this._shadow, this._postEls?.filter((el, i) => i !== index), 1);
|
1780
|
+
this._checkSize(this.offsetWidth);
|
1781
|
+
document.addEventListener('keydown', this._handleKeydown);
|
1782
|
+
}, 'open');
|
1783
|
+
}
|
1784
|
+
/**
|
1785
|
+
* Close
|
1786
|
+
*/
|
1787
|
+
_close() {
|
1788
|
+
if (!this._isOpen)
|
1789
|
+
return;
|
1790
|
+
this._isOpen = false;
|
1791
|
+
this.cancelTo('close');
|
1792
|
+
this.classList.remove('is-visible');
|
1793
|
+
this.to(this.remove.bind(this), 300, 'close');
|
1794
|
+
releaseFocus(this.closeFocusEl);
|
1795
|
+
document.removeEventListener('keydown', this._handleKeydown);
|
1796
|
+
document.body.style.overflow = this._startingDocumentOverflow;
|
1797
|
+
document.documentElement.style.paddingRight =
|
1798
|
+
this._startingDocumentRightPadding;
|
1799
|
+
this.style.paddingRight = '';
|
1800
|
+
}
|
1801
|
+
/**
|
1802
|
+
* Handle slide change
|
1803
|
+
*/
|
1804
|
+
_handleSlideChange(newIndex) {
|
1805
|
+
this._currentPostIndex = newIndex;
|
1806
|
+
let mediaType = 'image';
|
1807
|
+
switch (this.posts[newIndex]?.mediaType) {
|
1808
|
+
case 'VIDEO':
|
1809
|
+
mediaType = this.posts[newIndex].isReel ? 'reel' : 'video';
|
1810
|
+
break;
|
1811
|
+
case 'CAROUSEL_ALBUM':
|
1812
|
+
mediaType = 'album';
|
1813
|
+
break;
|
1814
|
+
case 'IMAGE':
|
1815
|
+
default:
|
1816
|
+
mediaType = 'image';
|
1817
|
+
}
|
1818
|
+
if (this.globalState.keyboardNavEnabled) {
|
1819
|
+
announceToScreenReader(`${mediaType}, post ${newIndex + 1} of ${this._postEls.length} in gallery`);
|
1820
|
+
}
|
1821
|
+
updateTabbableEls({
|
1822
|
+
include: [this._shadow],
|
1823
|
+
exclude: this._postEls.filter((el, i) => i !== newIndex),
|
1824
|
+
merge: false,
|
1825
|
+
});
|
1826
|
+
if (this.onSlideChange) {
|
1827
|
+
this.onSlideChange(newIndex);
|
1828
|
+
}
|
1829
|
+
this._postEls.forEach((slide, i) => {
|
1830
|
+
if (i === newIndex) {
|
1831
|
+
slide.activate();
|
1832
|
+
}
|
1833
|
+
else {
|
1834
|
+
slide.deactivate();
|
1835
|
+
}
|
1836
|
+
});
|
1837
|
+
const prevPostEl = this._postEls[newIndex - 1] ?? null;
|
1838
|
+
const nextPostEl = this._postEls[newIndex + 1] ?? null;
|
1839
|
+
if (prevPostEl) {
|
1840
|
+
this.raf(() => prevPostEl.preload(), 'preloadPrev');
|
1841
|
+
}
|
1842
|
+
if (nextPostEl) {
|
1843
|
+
this.raf(() => nextPostEl.preload(), 'preloadNext');
|
1844
|
+
}
|
1845
|
+
const hslArray = this._postEls?.[newIndex]
|
1846
|
+
? this._postEls[newIndex].getBackgroundColor()
|
1847
|
+
: null;
|
1848
|
+
if (hslArray) {
|
1849
|
+
this.updateGlobalState({
|
1850
|
+
popoverOverlayHslArray: hslArray,
|
1851
|
+
});
|
1852
|
+
}
|
1853
|
+
}
|
1854
|
+
/**
|
1855
|
+
* Check size and update as needed
|
1856
|
+
*/
|
1857
|
+
_checkSize(containerWidth) {
|
1858
|
+
if (containerWidth > this._verticalScrollBreakpoint) {
|
1859
|
+
this.classList.remove('is-scroller');
|
1860
|
+
this._previousEl.style.display = '';
|
1861
|
+
this._nextEl.style.display = '';
|
1862
|
+
this._popoverScroller.destroy();
|
1863
|
+
this._hurdyGurdy.init(this._currentPostIndex);
|
1864
|
+
this._postEls.forEach((slide) => slide.expandCaption());
|
1865
|
+
this.updateGlobalState({
|
1866
|
+
popoverOverlayOpacity: 0.85,
|
1867
|
+
});
|
1868
|
+
}
|
1869
|
+
else {
|
1870
|
+
this.classList.add('is-scroller');
|
1871
|
+
this._hurdyGurdy.destroy();
|
1872
|
+
this._popoverScroller.init(this._currentPostIndex);
|
1873
|
+
this._postEls.forEach((slide) => slide.collapseCaption());
|
1874
|
+
this._previousEl.disabled = false;
|
1875
|
+
this._previousEl.style.display = 'none';
|
1876
|
+
this._nextEl.disabled = false;
|
1877
|
+
this._nextEl.style.display = 'none';
|
1878
|
+
this.updateGlobalState({
|
1879
|
+
popoverOverlayOpacity: 0.9,
|
1880
|
+
});
|
1881
|
+
}
|
1882
|
+
}
|
1883
|
+
_handleResize(entry) {
|
1884
|
+
const containerWidth = entry?.borderBoxSize?.[0]?.inlineSize || entry?.contentRect?.width || 0;
|
1885
|
+
this._checkSize(containerWidth);
|
1886
|
+
}
|
1887
|
+
/*
|
1888
|
+
* Render
|
1889
|
+
*/
|
1890
|
+
_render() {
|
1891
|
+
document.body.append(this);
|
1892
|
+
this._shadow.beholdReplaceChildren(this._fragment, this._styleEl);
|
1893
|
+
}
|
1894
|
+
/*
|
1895
|
+
* Register
|
1896
|
+
*/
|
1897
|
+
static register(name = 'behold-popover-gallery') {
|
1898
|
+
if (!customElements.get(name)) {
|
1899
|
+
customElements.define(name, PopoverGallery);
|
1900
|
+
}
|
1901
|
+
return name;
|
1902
|
+
}
|
1903
|
+
}
|
1904
|
+
|
1905
|
+
export { PopoverGallery as default };
|