PageSourceSearch

https://www.caulfieldgrammarians.com.au/wp-content/plugins/elementor-pro/assets/js/frontend.js?ver=3.6.2

js caulfieldgrammarians.com.au collected 2026-10-03 00:45:30 UTC 44,828 bytes, 1,455 lines download raw bytes

1/*! elementor-pro - v3.6.2 - 14-02-2022 */
2(self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["frontend"],{
3
vendor: 674 bytes, lines 4-29
4/***/ "../node_modules/@babel/runtime/helpers/defineProperty.js":
5/*!****************************************************************!*\
6  !*** ../node_modules/@babel/runtime/helpers/defineProperty.js ***!
7  \****************************************************************/
8/***/ ((module) => {
9
10function _defineProperty(obj, key, value) {
11  if (key in obj) {
12    Object.defineProperty(obj, key, {
13      value: value,
14      enumerable: true,
15      configurable: true,
16      writable: true
17    });
18  } else {
19    obj[key] = value;
20  }
21
22  return obj;
23}
24
25module.exports = _defineProperty;
26module.exports.default = module.exports, module.exports.__esModule = true;
27
28/***/ }),
29
vendor: 560 bytes, lines 30-46
30/***/ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js":
31/*!***********************************************************************!*\
32  !*** ../node_modules/@babel/runtime/helpers/interopRequireDefault.js ***!
33  \***********************************************************************/
34/***/ ((module) => {
35
36function _interopRequireDefault(obj) {
37  return obj && obj.__esModule ? obj : {
38    "default": obj
39  };
40}
41
42module.exports = _interopRequireDefault;
43module.exports.default = module.exports, module.exports.__esModule = true;
44
45/***/ }),
46
47/***/ "../assets/dev/js/frontend/frontend.js":
48/*!*********************************************!*\
49  !*** ../assets/dev/js/frontend/frontend.js ***!
50  \*********************************************/
51/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
52
53"use strict";
54
55
56var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
57
58__webpack_require__(/*! ../public-path */ "../assets/dev/js/public-path.js");
59
60var _frontend = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/motion-fx/assets/js/frontend/frontend */ "../modules/motion-fx/assets/js/frontend/frontend.js"));
61
62var _frontend2 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/sticky/assets/js/frontend/frontend */ "../modules/sticky/assets/js/frontend/frontend.js"));
63
64var _frontend3 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/code-highlight/assets/js/frontend/frontend */ "../modules/code-highlight/assets/js/frontend/frontend.js"));
65
66var _frontend4 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/video-playlist/assets/js/frontend/frontend */ "../modules/video-playlist/assets/js/frontend/frontend.js"));
67
68var _frontend5 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/payments/assets/js/frontend/frontend */ "../modules/payments/assets/js/frontend/frontend.js"));
69
70var _frontend6 = _interopRequireDefault(__webpack_require__(/*! ../../../../modules/progress-tracker/assets/js/frontend/frontend */ "../modules/progress-tracker/assets/js/frontend/frontend.js"));
71
72class ElementorProFrontend extends elementorModules.ViewModule {
73  onInit() {
74    super.onInit();
75    this.config = ElementorProFrontendConfig;
76    this.modules = {};
77  }
78
79  bindEvents() {
80    jQuery(window).on('elementor/frontend/init', this.onElementorFrontendInit.bind(this));
81  }
82
83  initModules() {
84    // Handlers that should be available by default for sections usage.
85    let handlers = {
86      motionFX: _frontend.default,
87      sticky: _frontend2.default,
88      codeHighlight: _frontend3.default,
89      videoPlaylist: _frontend4.default,
90      payments: _frontend5.default,
91      progressTracker: _frontend6.default
92    }; // Keep this line before applying filter on the handlers.
93
94    elementorProFrontend.trigger('elementor-pro/modules/init:before');
95    handlers = elementorFrontend.hooks.applyFilters('elementor-pro/frontend/handlers', handlers);
96    jQuery.each(handlers, (moduleName, ModuleClass) => {
97      this.modules[moduleName] = new ModuleClass();
98    }); // TODO: BC Since 2.9.0
99
100    this.modules.linkActions = {
101      addAction: (...args) => {
102        elementorFrontend.utils.urlActions.addAction(...args);
103      }
104    };
105  }
106
107  onElementorFrontendInit() {
108    this.initModules();
109  }
110
111}
112
113window.elementorProFrontend = new ElementorProFrontend();
114
115/***/ }),
116
117/***/ "../assets/dev/js/public-path.js":
118/*!***************************************!*\
119  !*** ../assets/dev/js/public-path.js ***!
120  \***************************************/
121/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
122
123"use strict";
124
125
126/* eslint-disable camelcase */
127__webpack_require__.p = ElementorProFrontendConfig.urls.assets + 'js/';
128
129/***/ }),
130
131/***/ "../modules/code-highlight/assets/js/frontend/frontend.js":
132/*!****************************************************************!*\
133  !*** ../modules/code-highlight/assets/js/frontend/frontend.js ***!
134  \****************************************************************/
135/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
136
137"use strict";
138
139
140Object.defineProperty(exports, "__esModule", ({
141  value: true
142}));
143exports.default = void 0;
144
145class _default extends elementorModules.Module {
146  constructor() {
147    super();
148    elementorFrontend.elementsHandler.attachHandler('code-highlight', () => __webpack_require__.e(/*! import() | code-highlight */ "code-highlight").then(__webpack_require__.bind(__webpack_require__, /*! ./handler */ "../modules/code-highlight/assets/js/frontend/handler.js")));
149  }
150
151}
152
153exports.default = _default;
154
155/***/ }),
156
157/***/ "../modules/motion-fx/assets/js/frontend/frontend.js":
158/*!***********************************************************!*\
159  !*** ../modules/motion-fx/assets/js/frontend/frontend.js ***!
160  \***********************************************************/
161/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
162
163"use strict";
164
165
166var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
167
168Object.defineProperty(exports, "__esModule", ({
169  value: true
170}));
171exports.default = void 0;
172
173var _handler = _interopRequireDefault(__webpack_require__(/*! ./handler */ "../modules/motion-fx/assets/js/frontend/handler.js"));
174
175class _default extends elementorModules.Module {
176  constructor() {
177    super();
178    elementorFrontend.elementsHandler.attachHandler('global', _handler.default, null);
179  }
180
181}
182
183exports.default = _default;
184
185/***/ }),
186
187/***/ "../modules/motion-fx/assets/js/frontend/handler.js":
188/*!**********************************************************!*\
189  !*** ../modules/motion-fx/assets/js/frontend/handler.js ***!
190  \**********************************************************/
191/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
192
193"use strict";
194
195
196var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
197
198Object.defineProperty(exports, "__esModule", ({
199  value: true
200}));
201exports.default = void 0;
202
203var _motionFx = _interopRequireDefault(__webpack_require__(/*! ./motion-fx/motion-fx */ "../modules/motion-fx/assets/js/frontend/motion-fx/motion-fx.js"));
204
205class _default extends elementorModules.frontend.handlers.Base {
206  __construct(...args) {
207    super.__construct(...args);
208
209    this.toggle = elementorFrontend.debounce(this.toggle, 200);
210  }
211
212  getDefaultSettings() {
213    return {
214      selectors: {
215        container: '.elementor-widget-container'
216      }
217    };
218  }
219
220  getDefaultElements() {
221    const selectors = this.getSettings('selectors');
222    return {
223      $container: this.$element.find(selectors.container)
224    };
225  }
226
227  bindEvents() {
228    elementorFrontend.elements.$window.on('resize', this.toggle);
229  }
230
231  unbindEvents() {
232    elementorFrontend.elements.$window.off('resize', this.toggle);
233  }
234
235  addCSSTransformEvents() {
236    // Remove CSS transition variable that assigned from scroll.js in order to allow the transition of the CSS-Transform.
237    const motionFxScrolling = this.getElementSettings('motion_fx_motion_fx_scrolling');
238
239    if (motionFxScrolling && !this.isTransitionEventAdded) {
240      this.isTransitionEventAdded = true;
241      this.elements.$container.on('mouseenter', () => {
242        this.elements.$container.css('--e-transform-transition-duration', '');
243      });
244    }
245  }
246
247  initEffects() {
248    this.effects = {
249      translateY: {
250        interaction: 'scroll',
251        actions: ['translateY']
252      },
253      translateX: {
254        interaction: 'scroll',
255        actions: ['translateX']
256      },
257      rotateZ: {
258        interaction: 'scroll',
259        actions: ['rotateZ']
260      },
261      scale: {
262        interaction: 'scroll',
263        actions: ['scale']
264      },
265      opacity: {
266        interaction: 'scroll',
267        actions: ['opacity']
268      },
269      blur: {
270        interaction: 'scroll',
271        actions: ['blur']
272      },
273      mouseTrack: {
274        interaction: 'mouseMove',
275        actions: ['translateXY']
276      },
277      tilt: {
278        interaction: 'mouseMove',
279        actions: ['tilt']
280      }
281    };
282  }
283
284  prepareOptions(name) {
285    const elementSettings = this.getElementSettings(),
286          type = 'motion_fx' === name ? 'element' : 'background',
287          interactions = {};
288    jQuery.each(elementSettings, (key, value) => {
289      const keyRegex = new RegExp('^' + name + '_(.+?)_effect'),
290            keyMatches = key.match(keyRegex);
291
292      if (!keyMatches || !value) {
293        return;
294      }
295
296      const options = {},
297            effectName = keyMatches[1];
298      jQuery.each(elementSettings, (subKey, subValue) => {
299        const subKeyRegex = new RegExp(name + '_' + effectName + '_(.+)'),
300              subKeyMatches = subKey.match(subKeyRegex);
301
302        if (!subKeyMatches) {
303          return;
304        }
305
306        const subFieldName = subKeyMatches[1];
307
308        if ('effect' === subFieldName) {
309          return;
310        }
311
312        if ('object' === typeof subValue) {
313          subValue = Object.keys(subValue.sizes).length ? subValue.sizes : subValue.size;
314        }
315
316        options[subKeyMatches[1]] = subValue;
317      });
318      const effect = this.effects[effectName],
319            interactionName = effect.interaction;
320
321      if (!interactions[interactionName]) {
322        interactions[interactionName] = {};
323      }
324
325      effect.actions.forEach(action => interactions[interactionName][action] = options);
326    });
327    let $element = this.$element,
328        $dimensionsElement;
329    const elementType = this.getElementType();
330
331    if ('element' === type && !['section', 'container'].includes(elementType)) {
332      $dimensionsElement = $element;
333      let childElementSelector;
334
335      if ('column' === elementType) {
336        childElementSelector = elementorFrontend.config.legacyMode.elementWrappers ? '.elementor-column-wrap' : '.elementor-widget-wrap';
337      } else {
338        childElementSelector = '.elementor-widget-container';
339      }
340
341      $element = $element.find('> ' + childElementSelector);
342    }
343
344    const options = {
345      type,
346      interactions,
347      elementSettings,
348      $element,
349      $dimensionsElement,
350      refreshDimensions: this.isEdit,
351      range: elementSettings[name + '_range'],
352      classes: {
353        element: 'elementor-motion-effects-element',
354        parent: 'elementor-motion-effects-parent',
355        backgroundType: 'elementor-motion-effects-element-type-background',
356        container: 'elementor-motion-effects-container',
357        layer: 'elementor-motion-effects-layer',
358        perspective: 'elementor-motion-effects-perspective'
359      }
360    };
361
362    if (!options.range && 'fixed' === this.getCurrentDeviceSetting('_position')) {
363      options.range = 'page';
364    }
365
366    if ('fixed' === this.getCurrentDeviceSetting('_position')) {
367      options.isFixedPosition = true;
368    }
369
370    if ('background' === type && 'column' === this.getElementType()) {
371      options.addBackgroundLayerTo = ' > .elementor-element-populated';
372    }
373
374    return options;
375  }
376
377  activate(name) {
378    const options = this.prepareOptions(name);
379
380    if (jQuery.isEmptyObject(options.interactions)) {
381      return;
382    }
383
384    this[name] = new _motionFx.default(options);
385  }
386
387  deactivate(name) {
388    if (this[name]) {
389      this[name].destroy();
390      delete this[name];
391    }
392  }
393
394  toggle() {
395    const currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
396          elementSettings = this.getElementSettings();
397    ['motion_fx', 'background_motion_fx'].forEach(name => {
398      const devices = elementSettings[name + '_devices'],
399            isCurrentModeActive = !devices || -1 !== devices.indexOf(currentDeviceMode);
400
401      if (isCurrentModeActive && (elementSettings[name + '_motion_fx_scrolling'] || elementSettings[name + '_motion_fx_mouse'])) {
402        if (this[name]) {
403          this.refreshInstance(name);
404        } else {
405          this.activate(name);
406        }
407      } else {
408        this.deactivate(name);
409      }
410    });
411  }
412
413  refreshInstance(instanceName) {
414    const instance = this[instanceName];
415
416    if (!instance) {
417      return;
418    }
419
420    const preparedOptions = this.prepareOptions(instanceName);
421    instance.setSettings(preparedOptions);
422    instance.refresh();
423  }
424
425  onInit() {
426    super.onInit();
427    this.initEffects();
428    this.addCSSTransformEvents();
429    this.toggle();
430  }
431
432  onElementChange(propertyName) {
433    if (/motion_fx_((scrolling)|(mouse)|(devices))$/.test(propertyName)) {
434      if ('motion_fx_motion_fx_scrolling' === propertyName) {
435        this.addCSSTransformEvents();
436      }
437
438      this.toggle();
439      return;
440    }
441
442    const propertyMatches = propertyName.match('.*?(motion_fx|_transform)');
443
444    if (propertyMatches) {
445      const instanceName = propertyMatches[0].match('(_transform)') ? 'motion_fx' : propertyMatches[0];
446      this.refreshInstance(instanceName);
447
448      if (!this[instanceName]) {
449        this.activate(instanceName);
450      }
451    }
452
453    if (/^_position/.test(propertyName)) {
454      ['motion_fx', 'background_motion_fx'].forEach(instanceName => {
455        this.refreshInstance(instanceName);
456      });
457    }
458  }
459
460  onDestroy() {
461    super.onDestroy();
462    ['motion_fx', 'background_motion_fx'].forEach(name => {
463      this.deactivate(name);
464    });
465  }
466
467}
468
469exports.default = _default;
470
471/***/ }),
472
473/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/actions.js":
474/*!********************************************************************!*\
475  !*** ../modules/motion-fx/assets/js/frontend/motion-fx/actions.js ***!
476  \********************************************************************/
477/***/ ((__unused_webpack_module, exports) => {
478
479"use strict";
480
481
482Object.defineProperty(exports, "__esModule", ({
483  value: true
484}));
485exports.default = void 0;
486
487class _default extends elementorModules.Module {
488  getMovePointFromPassedPercents(movableRange, passedPercents) {
489    const movePoint = passedPercents / movableRange * 100;
490    return +movePoint.toFixed(2);
491  }
492
493  getEffectValueFromMovePoint(range, movePoint) {
494    return range * movePoint / 100;
495  }
496
497  getStep(passedPercents, options) {
498    if ('element' === this.getSettings('type')) {
499      return this.getElementStep(passedPercents, options);
500    }
501
502    return this.getBackgroundStep(passedPercents, options);
503  }
504
505  getElementStep(passedPercents, options) {
506    return -(passedPercents - 50) * options.speed;
507  }
508
509  getBackgroundStep(passedPercents, options) {
510    const movableRange = this.getSettings('dimensions.movable' + options.axis.toUpperCase());
511    return -this.getEffectValueFromMovePoint(movableRange, passedPercents);
512  }
513
514  getDirectionMovePoint(passedPercents, direction, range) {
515    let movePoint;
516
517    if (passedPercents < range.start) {
518      if ('out-in' === direction) {
519        movePoint = 0;
520      } else if ('in-out' === direction) {
521        movePoint = 100;
522      } else {
523        movePoint = this.getMovePointFromPassedPercents(range.start, passedPercents);
524
525        if ('in-out-in' === direction) {
526          movePoint = 100 - movePoint;
527        }
528      }
529    } else if (passedPercents < range.end) {
530      if ('in-out-in' === direction) {
531        movePoint = 0;
532      } else if ('out-in-out' === direction) {
533        movePoint = 100;
534      } else {
535        movePoint = this.getMovePointFromPassedPercents(range.end - range.start, passedPercents - range.start);
536
537        if ('in-out' === direction) {
538          movePoint = 100 - movePoint;
539        }
540      }
541    } else if ('in-out' === direction) {
542      movePoint = 0;
543    } else if ('out-in' === direction) {
544      movePoint = 100;
545    } else {
546      movePoint = this.getMovePointFromPassedPercents(100 - range.end, 100 - passedPercents);
547
548      if ('in-out-in' === direction) {
549        movePoint = 100 - movePoint;
550      }
551    }
552
553    return movePoint;
554  }
555
556  translateX(actionData, passedPercents) {
557    actionData.axis = 'x';
558    actionData.unit = 'px';
559    this.transform('translateX', passedPercents, actionData);
560  }
561
562  translateY(actionData, passedPercents) {
563    actionData.axis = 'y';
564    actionData.unit = 'px';
565    this.transform('translateY', passedPercents, actionData);
566  }
567
568  translateXY(actionData, passedPercentsX, passedPercentsY) {
569    this.translateX(actionData, passedPercentsX);
570    this.translateY(actionData, passedPercentsY);
571  }
572
573  tilt(actionData, passedPercentsX, passedPercentsY) {
574    const options = {
575      speed: actionData.speed / 10,
576      direction: actionData.direction
577    };
578    this.rotateX(options, passedPercentsY);
579    this.rotateY(options, 100 - passedPercentsX);
580  }
581
582  rotateX(actionData, passedPercents) {
583    actionData.axis = 'x';
584    actionData.unit = 'deg';
585    this.transform('rotateX', passedPercents, actionData);
586  }
587
588  rotateY(actionData, passedPercents) {
589    actionData.axis = 'y';
590    actionData.unit = 'deg';
591    this.transform('rotateY', passedPercents, actionData);
592  }
593
594  rotateZ(actionData, passedPercents) {
595    actionData.unit = 'deg';
596    this.transform('rotateZ', passedPercents, actionData);
597  }
598
599  scale(actionData, passedPercents) {
600    const movePoint = this.getDirectionMovePoint(passedPercents, actionData.direction, actionData.range);
601    this.updateRulePart('transform', 'scale', 1 + actionData.speed * movePoint / 1000);
602  }
603
604  transform(action, passedPercents, actionData) {
605    if (actionData.direction) {
606      passedPercents = 100 - passedPercents;
607    }
608
609    this.updateRulePart('transform', action, this.getStep(passedPercents, actionData) + actionData.unit);
610  }
611
612  setCSSTransformVariables(elementSettings) {
613    this.CSSTransformVariables = [];
614    jQuery.each(elementSettings, (settingKey, settingValue) => {
615      const transformKeyMatches = settingKey.match(/_transform_(.+?)_effect/m);
616
617      if (transformKeyMatches && settingValue) {
618        if ('perspective' === transformKeyMatches[1]) {
619          this.CSSTransformVariables.unshift(transformKeyMatches[1]);
620          return;
621        }
622
623        if (this.CSSTransformVariables.includes(transformKeyMatches[1])) {
624          return;
625        }
626
627        this.CSSTransformVariables.push(transformKeyMatches[1]);
628      }
629    });
630  }
631
632  opacity(actionData, passedPercents) {
633    const movePoint = this.getDirectionMovePoint(passedPercents, actionData.direction, actionData.range),
634          level = actionData.level / 10,
635          opacity = 1 - level + this.getEffectValueFromMovePoint(level, movePoint);
636    this.$element.css({
637      opacity,
638      'will-change': 'opacity'
639    });
640  }
641
642  blur(actionData, passedPercents) {
643    const movePoint = this.getDirectionMovePoint(passedPercents, actionData.direction, actionData.range),
644          blur = actionData.level - this.getEffectValueFromMovePoint(actionData.level, movePoint);
645    this.updateRulePart('filter', 'blur', blur + 'px');
646  }
647
648  updateRulePart(ruleName, key, value) {
649    if (!this.rulesVariables[ruleName]) {
650      this.rulesVariables[ruleName] = {};
651    }
652
653    if (!this.rulesVariables[ruleName][key]) {
654      this.rulesVariables[ruleName][key] = true;
655      this.updateRule(ruleName);
656    }
657
658    const cssVarKey = `--${key}`;
659    this.$element[0].style.setProperty(cssVarKey, value);
660  }
661
662  updateRule(ruleName) {
663    let value = '';
664    value += this.concatTransformCSSProperties(ruleName);
665    value += this.concatTransformMotionEffectCSSProperties(ruleName);
666    this.$element.css(ruleName, value);
667  }
668
669  concatTransformCSSProperties(ruleName) {
670    let value = '';
671
672    if ('transform' === ruleName) {
673      jQuery.each(this.CSSTransformVariables, (index, variableKey) => {
674        const variableName = variableKey;
675
676        if (variableKey.startsWith('flip')) {
677          variableKey = variableKey.replace('flip', 'scale');
678        } // Adding default value because of the hover state. if there is no default the transform will break.
679
680
681        const defaultUnit = variableKey.startsWith('rotate') || variableKey.startsWith('skew') ? 'deg' : 'px',
682              defaultValue = variableKey.startsWith('scale') ? 1 : 0 + defaultUnit;
683        value += `${variableKey}(var(--e-transform-${variableName}, ${defaultValue}))`;
684      });
685    }
686
687    return value;
688  }
689
690  concatTransformMotionEffectCSSProperties(ruleName) {
691    let value = '';
692    jQuery.each(this.rulesVariables[ruleName], variableKey => {
693      value += `${variableKey}(var(--${variableKey}))`;
694    });
695    return value;
696  }
697
698  runAction(actionName, actionData, passedPercents, ...args) {
699    if (actionData.affectedRange) {
700      if (actionData.affectedRange.start > passedPercents) {
701        passedPercents = actionData.affectedRange.start;
702      }
703
704      if (actionData.affectedRange.end < passedPercents) {
705        passedPercents = actionData.affectedRange.end;
706      }
707    }
708
709    this[actionName](actionData, passedPercents, ...args);
710  }
711
712  refresh() {
713    this.rulesVariables = {};
714    this.CSSTransformVariables = [];
715    this.$element.css({
716      transform: '',
717      filter: '',
718      opacity: '',
719      'will-change': ''
720    });
721  }
722
723  onInit() {
724    this.$element = this.getSettings('$targetElement');
725    this.refresh();
726  }
727
728}
729
730exports.default = _default;
731
732/***/ }),
733
734/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js":
735/*!******************************************************************************!*\
736  !*** ../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js ***!
737  \******************************************************************************/
738/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
739
740"use strict";
741
742
743var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
744
745Object.defineProperty(exports, "__esModule", ({
746  value: true
747}));
748exports.default = void 0;
749
750var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js"));
751
752class _default extends elementorModules.ViewModule {
753  constructor(...args) {
754    super(...args);
755    (0, _defineProperty2.default)(this, "onInsideViewport", () => {
756      this.run();
757      this.animationFrameRequest = requestAnimationFrame(this.onInsideViewport);
758    });
759  }
760
761  __construct(options) {
762    this.motionFX = options.motionFX;
763
764    if (!this.intersectionObservers) {
765      this.setElementInViewportObserver();
766    }
767  }
768
769  setElementInViewportObserver() {
770    this.intersectionObserver = elementorModules.utils.Scroll.scrollObserver({
771      callback: event => {
772        if (event.isInViewport) {
773          this.onInsideViewport();
774        } else {
775          this.removeAnimationFrameRequest();
776        }
777      }
778    }); // Determine which element we should observe.
779
780    const observedElement = 'page' === this.motionFX.getSettings('range') ? elementorFrontend.elements.$body[0] : this.motionFX.elements.$parent[0];
781    this.intersectionObserver.observe(observedElement);
782  }
783
784  runCallback(...args) {
785    const callback = this.getSettings('callback');
786    callback(...args);
787  }
788
789  removeIntersectionObserver() {
790    if (this.intersectionObserver) {
791      this.intersectionObserver.unobserve(this.motionFX.elements.$parent[0]);
792    }
793  }
794
795  removeAnimationFrameRequest() {
796    if (this.animationFrameRequest) {
797      cancelAnimationFrame(this.animationFrameRequest);
798    }
799  }
800
801  destroy() {
802    this.removeAnimationFrameRequest();
803    this.removeIntersectionObserver();
804  }
805
806  onInit() {
807    super.onInit();
808  }
809
810}
811
812exports.default = _default;
813
814/***/ }),
815
816/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/mouse-move.js":
817/*!************************************************************************************!*\
818  !*** ../modules/motion-fx/assets/js/frontend/motion-fx/interactions/mouse-move.js ***!
819  \************************************************************************************/
820/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
821
822"use strict";
823
824
825var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
826
827Object.defineProperty(exports, "__esModule", ({
828  value: true
829}));
830exports.default = void 0;
831
832var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js"));
833
834class MouseMoveInteraction extends _base.default {
835  bindEvents() {
836    if (!MouseMoveInteraction.mouseTracked) {
837      elementorFrontend.elements.$window.on('mousemove', MouseMoveInteraction.updateMousePosition);
838      MouseMoveInteraction.mouseTracked = true;
839    }
840  }
841
842  run() {
843    const mousePosition = MouseMoveInteraction.mousePosition,
844          oldMousePosition = this.oldMousePosition;
845
846    if (oldMousePosition.x === mousePosition.x && oldMousePosition.y === mousePosition.y) {
847      return;
848    }
849
850    this.oldMousePosition = {
851      x: mousePosition.x,
852      y: mousePosition.y
853    };
854    const passedPercentsX = 100 / innerWidth * mousePosition.x,
855          passedPercentsY = 100 / innerHeight * mousePosition.y;
856    this.runCallback(passedPercentsX, passedPercentsY);
857  }
858
859  onInit() {
860    this.oldMousePosition = {};
861    super.onInit();
862  }
863
864}
865
866exports.default = MouseMoveInteraction;
867MouseMoveInteraction.mousePosition = {};
868
869MouseMoveInteraction.updateMousePosition = event => {
870  MouseMoveInteraction.mousePosition = {
871    x: event.clientX,
872    y: event.clientY
873  };
874};
875
876/***/ }),
877
878/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/scroll.js":
879/*!********************************************************************************!*\
880  !*** ../modules/motion-fx/assets/js/frontend/motion-fx/interactions/scroll.js ***!
881  \********************************************************************************/
882/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
883
884"use strict";
885
886
887var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
888
889Object.defineProperty(exports, "__esModule", ({
890  value: true
891}));
892exports.default = void 0;
893
894var _base = _interopRequireDefault(__webpack_require__(/*! ./base */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/base.js"));
895
896class _default extends _base.default {
897  run() {
898    if (pageYOffset === this.windowScrollTop) {
899      return false;
900    }
901
902    this.onScrollMovement();
903    this.windowScrollTop = pageYOffset;
904  }
905
906  onScrollMovement() {
907    this.updateMotionFxDimensions();
908    this.updateAnimation();
909    this.resetTransitionVariable();
910  }
911
912  resetTransitionVariable() {
913    this.motionFX.$element.css('--e-transform-transition-duration', '100ms');
914  }
915
916  updateMotionFxDimensions() {
917    const motionFXSettings = this.motionFX.getSettings();
918
919    if (motionFXSettings.refreshDimensions) {
920      this.motionFX.defineDimensions();
921    }
922  }
923
924  updateAnimation() {
925    let passedRangePercents;
926
927    if ('page' === this.motionFX.getSettings('range')) {
928      passedRangePercents = elementorModules.utils.Scroll.getPageScrollPercentage();
929    } else if (this.motionFX.getSettings('isFixedPosition')) {
930      passedRangePercents = elementorModules.utils.Scroll.getPageScrollPercentage({}, window.innerHeight);
931    } else {
932      passedRangePercents = elementorModules.utils.Scroll.getElementViewportPercentage(this.motionFX.elements.$parent);
933    }
934
935    this.runCallback(passedRangePercents);
936  }
937
938}
939
940exports.default = _default;
941
942/***/ }),
943
944/***/ "../modules/motion-fx/assets/js/frontend/motion-fx/motion-fx.js":
945/*!**********************************************************************!*\
946  !*** ../modules/motion-fx/assets/js/frontend/motion-fx/motion-fx.js ***!
947  \**********************************************************************/
948/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
949
950"use strict";
951
952
953var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
954
955Object.defineProperty(exports, "__esModule", ({
956  value: true
957}));
958exports.default = void 0;
959
960var _scroll = _interopRequireDefault(__webpack_require__(/*! ./interactions/scroll */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/scroll.js"));
961
962var _mouseMove = _interopRequireDefault(__webpack_require__(/*! ./interactions/mouse-move */ "../modules/motion-fx/assets/js/frontend/motion-fx/interactions/mouse-move.js"));
963
964var _actions = _interopRequireDefault(__webpack_require__(/*! ./actions */ "../modules/motion-fx/assets/js/frontend/motion-fx/actions.js"));
965
966class _default extends elementorModules.ViewModule {
967  getDefaultSettings() {
968    return {
969      type: 'element',
970      $element: null,
971      $dimensionsElement: null,
972      addBackgroundLayerTo: null,
973      interactions: {},
974      refreshDimensions: false,
975      range: 'viewport',
976      classes: {
977        element: 'motion-fx-element',
978        parent: 'motion-fx-parent',
979        backgroundType: 'motion-fx-element-type-background',
980        container: 'motion-fx-container',
981        layer: 'motion-fx-layer',
982        perspective: 'motion-fx-perspective'
983      }
984    };
985  }
986
987  bindEvents() {
988    this.onWindowResize = this.onWindowResize.bind(this);
989    elementorFrontend.elements.$window.on('resize', this.onWindowResize);
990  }
991
992  unbindEvents() {
993    elementorFrontend.elements.$window.off('resize', this.onWindowResize);
994  }
995
996  addBackgroundLayer() {
997    const settings = this.getSettings();
998    this.elements.$motionFXContainer = jQuery('<div>', {
999      class: settings.classes.container
1000    });
1001    this.elements.$motionFXLayer = jQuery('<div>', {
1002      class: settings.classes.layer
1003    });
1004    this.updateBackgroundLayerSize();
1005    this.elements.$motionFXContainer.prepend(this.elements.$motionFXLayer);
1006    const $addBackgroundLayerTo = settings.addBackgroundLayerTo ? this.$element.find(settings.addBackgroundLayerTo) : this.$element;
1007    $addBackgroundLayerTo.prepend(this.elements.$motionFXContainer);
1008  }
1009
1010  removeBackgroundLayer() {
1011    this.elements.$motionFXContainer.remove();
1012  }
1013
1014  updateBackgroundLayerSize() {
1015    const settings = this.getSettings(),
1016          speed = {
1017      x: 0,
1018      y: 0
1019    },
1020          mouseInteraction = settings.interactions.mouseMove,
1021          scrollInteraction = settings.interactions.scroll;
1022
1023    if (mouseInteraction && mouseInteraction.translateXY) {
1024      speed.x = mouseInteraction.translateXY.speed * 10;
1025      speed.y = mouseInteraction.translateXY.speed * 10;
1026    }
1027
1028    if (scrollInteraction) {
1029      if (scrollInteraction.translateX) {
1030        speed.x = scrollInteraction.translateX.speed * 10;
1031      }
1032
1033      if (scrollInteraction.translateY) {
1034        speed.y = scrollInteraction.translateY.speed * 10;
1035      }
1036    }
1037
1038    this.elements.$motionFXLayer.css({
1039      width: 100 + speed.x + '%',
1040      height: 100 + speed.y + '%'
1041    });
1042  }
1043
1044  defineDimensions() {
1045    const $dimensionsElement = this.getSettings('$dimensionsElement') || this.$element,
1046          elementOffset = $dimensionsElement.offset();
1047    const dimensions = {
1048      elementHeight: $dimensionsElement.outerHeight(),
1049      elementWidth: $dimensionsElement.outerWidth(),
1050      elementTop: elementOffset.top,
1051      elementLeft: elementOffset.left
1052    };
1053    dimensions.elementRange = dimensions.elementHeight + innerHeight;
1054    this.setSettings('dimensions', dimensions);
1055
1056    if ('background' === this.getSettings('type')) {
1057      this.defineBackgroundLayerDimensions();
1058    }
1059  }
1060
1061  defineBackgroundLayerDimensions() {
1062    const dimensions = this.getSettings('dimensions');
1063    dimensions.layerHeight = this.elements.$motionFXLayer.height();
1064    dimensions.layerWidth = this.elements.$motionFXLayer.width();
1065    dimensions.movableX = dimensions.layerWidth - dimensions.elementWidth;
1066    dimensions.movableY = dimensions.layerHeight - dimensions.elementHeight;
1067    this.setSettings('dimensions', dimensions);
1068  }
1069
1070  initInteractionsTypes() {
1071    this.interactionsTypes = {
1072      scroll: _scroll.default,
1073      mouseMove: _mouseMove.default
1074    };
1075  }
1076
1077  prepareSpecialActions() {
1078    const settings = this.getSettings(),
1079          hasTiltEffect = !!(settings.interactions.mouseMove && settings.interactions.mouseMove.tilt);
1080    this.elements.$parent.toggleClass(settings.classes.perspective, hasTiltEffect);
1081  }
1082
1083  cleanSpecialActions() {
1084    const settings = this.getSettings();
1085    this.elements.$parent.removeClass(settings.classes.perspective);
1086  }
1087
1088  runInteractions() {
1089    const settings = this.getSettings();
1090    this.actions.setCSSTransformVariables(settings.elementSettings);
1091    this.prepareSpecialActions();
1092    jQuery.each(settings.interactions, (interactionName, actions) => {
1093      this.interactions[interactionName] = new this.interactionsTypes[interactionName]({
1094        motionFX: this,
1095        callback: (...args) => {
1096          jQuery.each(actions, (actionName, actionData) => this.actions.runAction(actionName, actionData, ...args));
1097        }
1098      });
1099      this.interactions[interactionName].run();
1100    });
1101  }
1102
1103  destroyInteractions() {
1104    this.cleanSpecialActions();
1105    jQuery.each(this.interactions, (interactionName, interaction) => interaction.destroy());
1106    this.interactions = {};
1107  }
1108
1109  refresh() {
1110    this.actions.setSettings(this.getSettings());
1111
1112    if ('background' === this.getSettings('type')) {
1113      this.updateBackgroundLayerSize();
1114      this.defineBackgroundLayerDimensions();
1115    }
1116
1117    this.actions.refresh();
1118    this.destroyInteractions();
1119    this.runInteractions();
1120  }
1121
1122  destroy() {
1123    this.destroyInteractions();
1124    this.actions.refresh();
1125    const settings = this.getSettings();
1126    this.$element.removeClass(settings.classes.element);
1127    this.elements.$parent.removeClass(settings.classes.parent);
1128
1129    if ('background' === settings.type) {
1130      this.$element.removeClass(settings.classes.backgroundType);
1131      this.removeBackgroundLayer();
1132    }
1133  }
1134
1135  onInit() {
1136    super.onInit();
1137    const settings = this.getSettings();
1138    this.$element = settings.$element;
1139    this.elements.$parent = this.$element.parent();
1140    this.$element.addClass(settings.classes.element);
1141    this.elements.$parent = this.$element.parent();
1142    this.elements.$parent.addClass(settings.classes.parent);
1143
1144    if ('background' === settings.type) {
1145      this.$element.addClass(settings.classes.backgroundType);
1146      this.addBackgroundLayer();
1147    }
1148
1149    this.defineDimensions();
1150    settings.$targetElement = 'element' === settings.type ? this.$element : this.elements.$motionFXLayer;
1151    this.interactions = {};
1152    this.actions = new _actions.default(settings);
1153    this.initInteractionsTypes();
1154    this.runInteractions();
1155  }
1156
1157  onWindowResize() {
1158    this.defineDimensions();
1159  }
1160
1161}
1162
1163exports.default = _default;
1164
1165/***/ }),
1166
1167/***/ "../modules/payments/assets/js/frontend/frontend.js":
1168/*!**********************************************************!*\
1169  !*** ../modules/payments/assets/js/frontend/frontend.js ***!
1170  \**********************************************************/
1171/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1172
1173"use strict";
1174
1175
1176Object.defineProperty(exports, "__esModule", ({
1177  value: true
1178}));
1179exports.default = void 0;
1180
1181class _default extends elementorModules.Module {
1182  constructor() {
1183    super();
1184    elementorFrontend.elementsHandler.attachHandler('paypal-button', () => __webpack_require__.e(/*! import() | paypal-button */ "paypal-button").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/paypal-button */ "../modules/payments/assets/js/frontend/handlers/paypal-button.js")));
1185  }
1186
1187}
1188
1189exports.default = _default;
1190
1191/***/ }),
1192
1193/***/ "../modules/progress-tracker/assets/js/frontend/frontend.js":
1194/*!******************************************************************!*\
1195  !*** ../modules/progress-tracker/assets/js/frontend/frontend.js ***!
1196  \******************************************************************/
1197/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1198
1199"use strict";
1200
1201
1202Object.defineProperty(exports, "__esModule", ({
1203  value: true
1204}));
1205exports.default = void 0;
1206
1207class _default extends elementorModules.Module {
1208  constructor() {
1209    super();
1210    elementorFrontend.elementsHandler.attachHandler('progress-tracker', () => __webpack_require__.e(/*! import() | progress-tracker */ "progress-tracker").then(__webpack_require__.bind(__webpack_require__, /*! ./handlers/progress-tracker */ "../modules/progress-tracker/assets/js/frontend/handlers/progress-tracker.js")));
1211  }
1212
1213}
1214
1215exports.default = _default;
1216
1217/***/ }),
1218
1219/***/ "../modules/sticky/assets/js/frontend/frontend.js":
1220/*!********************************************************!*\
1221  !*** ../modules/sticky/assets/js/frontend/frontend.js ***!
1222  \********************************************************/
1223/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1224
1225"use strict";
1226
1227
1228var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
1229
1230Object.defineProperty(exports, "__esModule", ({
1231  value: true
1232}));
1233exports.default = void 0;
1234
1235var _sticky = _interopRequireDefault(__webpack_require__(/*! ./handlers/sticky */ "../modules/sticky/assets/js/frontend/handlers/sticky.js"));
1236
1237class _default extends elementorModules.Module {
1238  constructor() {
1239    super();
1240    elementorFrontend.elementsHandler.attachHandler('section', _sticky.default, null);
1241    elementorFrontend.elementsHandler.attachHandler('container', _sticky.default, null);
1242    elementorFrontend.elementsHandler.attachHandler('widget', _sticky.default, null);
1243  }
1244
1245}
1246
1247exports.default = _default;
1248
1249/***/ }),
1250
1251/***/ "../modules/sticky/assets/js/frontend/handlers/sticky.js":
1252/*!***************************************************************!*\
1253  !*** ../modules/sticky/assets/js/frontend/handlers/sticky.js ***!
1254  \***************************************************************/
1255/***/ ((__unused_webpack_module, exports) => {
1256
1257"use strict";
1258
1259
1260Object.defineProperty(exports, "__esModule", ({
1261  value: true
1262}));
1263exports.default = void 0;
1264
1265var _default = elementorModules.frontend.handlers.Base.extend({
1266  bindEvents() {
1267    elementorFrontend.addListenerOnce(this.getUniqueHandlerID() + 'sticky', 'resize', this.refresh);
1268  },
1269
1270  unbindEvents() {
1271    elementorFrontend.removeListeners(this.getUniqueHandlerID() + 'sticky', 'resize', this.refresh);
1272  },
1273
1274  isStickyInstanceActive() {
1275    return undefined !== this.$element.data('sticky');
1276  },
1277
1278  /**
1279   * Get the current active setting value for a responsive control.
1280   *
1281   * @param {string} setting
1282   * @return {any} - Setting value.
1283   */
1284  getResponsiveSetting(setting) {
1285    const elementSettings = this.getElementSettings();
1286    return elementorFrontend.getCurrentDeviceSetting(elementSettings, setting);
1287  },
1288
1289  /**
1290   * Return an array of settings names for responsive control (e.g. `settings`, `setting_tablet`, `setting_mobile` ).
1291   *
1292   * @param {string} setting
1293   * @return {string[]} - List of settings.
1294   */
1295  getResponsiveSettingList(setting) {
1296    const breakpoints = Object.keys(elementorFrontend.config.responsive.activeBreakpoints);
1297    return ['', ...breakpoints].map(suffix => {
1298      return suffix ? `${setting}_${suffix}` : setting;
1299    });
1300  },
1301
1302  activate() {
1303    var elementSettings = this.getElementSettings(),
1304        stickyOptions = {
1305      to: elementSettings.sticky,
1306      offset: this.getResponsiveSetting('sticky_offset'),
1307      effectsOffset: this.getResponsiveSetting('sticky_effects_offset'),
1308      classes: {
1309        sticky: 'elementor-sticky',
1310        stickyActive: 'elementor-sticky--active elementor-section--handles-inside',
1311        stickyEffects: 'elementor-sticky--effects',
1312        spacer: 'elementor-sticky__spacer'
1313      }
1314    },
1315        $wpAdminBar = elementorFrontend.elements.$wpAdminBar;
1316
1317    if (elementSettings.sticky_parent) {
1318      stickyOptions.parent = '.e-container, .elementor-widget-wrap';
1319    }
1320
1321    if ($wpAdminBar.length && 'top' === elementSettings.sticky && 'fixed' === $wpAdminBar.css('position')) {
1322      stickyOptions.offset += $wpAdminBar.height();
1323    }
1324
1325    this.$element.sticky(stickyOptions);
1326  },
1327
1328  deactivate() {
1329    if (!this.isStickyInstanceActive()) {
1330      return;
1331    }
1332
1333    this.$element.sticky('destroy');
1334  },
1335
1336  run(refresh) {
1337    if (!this.getElementSettings('sticky')) {
1338      this.deactivate();
1339      return;
1340    }
1341
1342    var currentDeviceMode = elementorFrontend.getCurrentDeviceMode(),
1343        activeDevices = this.getElementSettings('sticky_on');
1344
1345    if (-1 !== activeDevices.indexOf(currentDeviceMode)) {
1346      if (true === refresh) {
1347        this.reactivate();
1348      } else if (!this.isStickyInstanceActive()) {
1349        this.activate();
1350      }
1351    } else {
1352      this.deactivate();
1353    }
1354  },
1355
1356  refresh() {
1357    this.run(true);
1358  },
1359
1360  reactivate() {
1361    this.deactivate();
1362    this.activate();
1363  },
1364
1365  onElementChange(settingKey) {
1366    if (-1 !== ['sticky', 'sticky_on'].indexOf(settingKey)) {
1367      this.run(true);
1368    } // Settings that trigger a re-activation when changed.
1369
1370
1371    const settings = [...this.getResponsiveSettingList('sticky_offset'), ...this.getResponsiveSettingList('sticky_effects_offset'), 'sticky_parent'];
1372
1373    if (-1 !== settings.indexOf(settingKey)) {
1374      this.reactivate();
1375    }
1376  },
1377
1378  /**
1379   * Listen to device mode changes and re-initialize the sticky.
1380   *
1381   * @return {void}
1382   */
1383  onDeviceModeChange() {
1384    // Wait for the call stack to be empty.
1385    // The `run` function requests the current device mode from the CSS so it's not ready immediately.
1386    // (need to wait for the `deviceMode` event to change the CSS).
1387    // See `elementorFrontend.getCurrentDeviceMode()` for reference.
1388    setTimeout(this.refresh);
1389  },
1390
1391  onInit() {
1392    elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
1393
1394    if (elementorFrontend.isEditMode()) {
1395      elementor.listenTo(elementor.channels.deviceMode, 'change', () => this.onDeviceModeChange());
1396    }
1397
1398    this.run();
1399  },
1400
1401  onDestroy() {
1402    elementorModules.frontend.handlers.Base.prototype.onDestroy.apply(this, arguments);
1403    this.deactivate();
1404  }
1405
1406});
1407
1408exports.default = _default;
1409
1410/***/ }),
1411
1412/***/ "../modules/video-playlist/assets/js/frontend/frontend.js":
1413/*!****************************************************************!*\
1414  !*** ../modules/video-playlist/assets/js/frontend/frontend.js ***!
1415  \****************************************************************/
1416/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1417
1418"use strict";
1419
1420
1421Object.defineProperty(exports, "__esModule", ({
1422  value: true
1423}));
1424exports.default = void 0;
1425
1426class _default extends elementorModules.Module {
1427  constructor() {
1428    super();
1429    elementorFrontend.hooks.addAction('frontend/element_ready/video-playlist.default', $element => {
1430      __webpack_require__.e(/*! import() | video-playlist */ "video-playlist").then(__webpack_require__.bind(__webpack_require__, /*! ./handler */ "../modules/video-playlist/assets/js/frontend/handler.js")).then(({
1431        default: dynamicHandler
1432      }) => {
1433        elementorFrontend.elementsHandler.addHandler(dynamicHandler, {
1434          $element,
1435          toggleSelf: false
1436        });
1437      });
1438    });
1439  }
1440
1441}
1442
1443exports.default = _default;
1444
1445/***/ })
1445
1446
1447},
1448/******/ __webpack_require__ => { // webpackRuntimeModules
1449/******/ "use strict";
1450/******/ 
1451/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
1452/******/ var __webpack_exports__ = (__webpack_exec__("../assets/dev/js/frontend/frontend.js"));
1453/******/ }
1454]);
1455//# sourceMappingURL=frontend.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.