Diff: STRATO-apps/wordpress_03/app/wp-content/themes/blocksy/static/js/main.js

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + import './public-path'
2 + import './events'
3 +
4 + import ctEvents from 'ct-events'
5 +
6 + import { watchLayoutContainerForReveal } from './frontend/animated-element'
7 + import { onDocumentLoaded, handleEntryPoints, loadStyle } from './helpers'
8 +
9 + import { getCurrentScreen } from './frontend/helpers/current-screen'
10 + import { mountDynamicChunks } from './dynamic-chunks'
11 +
12 + import { menuEntryPoints } from './frontend/entry-points/menus'
13 + import { liveSearchEntryPoints } from './frontend/entry-points/live-search'
14 +
15 + import { preloadClickHandlers } from './frontend/dynamic-chunks/click-trigger'
16 + import { isTouchDevice } from './frontend/helpers/is-touch-device'
17 +
18 + export const areWeDealingWithSafari = /apple/i.test(navigator.vendor)
19 +
20 + /**
21 + * iOS hover fix
22 + */
23 + document.addEventListener('click', (x) => 0)
24 +
25 + import {
26 + fastOverlayHandleClick,
27 + fastOverlayMount
28 + } from './frontend/fast-overlay'
29 + // import { mount } from './frontend/social-buttons'
30 +
31 + let allFrontendEntryPoints = [
32 + ...menuEntryPoints,
33 + ...liveSearchEntryPoints,
34 +
35 + {
36 + els: '[data-parallax]',
37 + load: () => import('./frontend/parallax/register-listener'),
38 + events: ['blocksy:parallax:init']
39 + },
40 +
41 + {
42 + els: '.flexy-container[data-flexy*="no"]',
43 + load: () => import('./frontend/flexy'),
44 + trigger: ['hover-with-touch']
45 + },
46 +
47 + {
48 + els: '.ct-share-box [data-network="pinterest"]',
49 + load: () => import('./frontend/social-buttons'),
50 + trigger: ['click']
51 + },
52 +
53 + {
54 + els: '.ct-share-box [data-network="clipboard"]',
55 + load: () => import('./frontend/social-buttons'),
56 + trigger: ['click']
57 + },
58 +
59 + {
60 + els: '.ct-media-container[data-media-id]:not([data-state*="hover"]), .ct-dynamic-media[data-media-id]:not([data-state*="hover"])',
61 + load: () => import('./frontend/lazy/video-on-click'),
62 + trigger: ['click', 'slight-mousemove', 'scroll']
63 + },
64 +
65 + {
66 + els: '.ct-media-container[data-media-id][data-state*="hover"], .ct-dynamic-media[data-media-id][data-state*="hover"]',
67 + load: () => import('./frontend/lazy/video-on-click'),
68 + trigger: ['click', 'hover-with-touch']
69 + },
70 +
71 + {
72 + els: '.ct-share-box [data-network]:not([data-network="pinterest"]):not([data-network="email"]):not([data-network="clipboard"])',
73 + load: () => import('./frontend/social-buttons'),
74 + trigger: ['hover'],
75 + condition: () =>
76 + !/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
77 + navigator.userAgent
78 + )
79 + },
80 +
81 + {
82 + els: () => {
83 + const popperEls = [
84 + '.ct-language-switcher > .ct-active-language',
85 + '.ct-header-account[data-interaction="dropdown"] > .ct-account-item'
86 + ]
87 +
88 + const maybeCart = document.querySelector(
89 + '.ct-header-cart > .ct-cart-content:not([data-count="0"])'
90 + )
91 +
92 + // Cart within offcanvas doesn't have a dropdown
93 + if (maybeCart && !maybeCart.closest('#offcanvas')) {
94 + popperEls.push('.ct-header-cart > .ct-cart-item')
95 + }
96 +
97 + return popperEls
98 + },
99 + load: () => import('./frontend/popper-elements'),
100 + trigger: ['hover-with-click']
101 + },
102 +
103 + {
104 + els: '.ct-back-to-top, .ct-shortcuts-bar [data-shortcut*="scroll_top"]',
105 + load: () => import('./frontend/back-to-top-link'),
106 + events: ['ct:back-to-top:mount'],
107 + trigger: ['scroll']
108 + },
109 +
110 + {
111 + els: '.ct-pagination:not([data-pagination="simple"])',
112 + load: () => import('./frontend/layouts/infinite-scroll'),
113 + trigger: ['scroll']
114 + },
115 +
116 + {
117 + els: ['.entries[data-layout]', '[data-products].products'],
118 + load: () =>
119 + new Promise((r) => r({ mount: watchLayoutContainerForReveal }))
120 + },
121 +
122 + {
123 + els: [
124 + '.ct-has-link-overlay.is-layout-slider .flexy-item:has(> * > .ct-link-overlay)',
125 + '.ct-has-link-overlay:not(.is-layout-slider) *:has(> .ct-link-overlay)'
126 + ],
127 + load: () => import('./frontend/link-overlay'),
128 + trigger: ['click']
129 + },
130 +
131 + {
132 + els: ['.ct-modal-action'],
133 + load: () => new Promise((r) => r({ mount: fastOverlayMount })),
134 + events: ['ct:header:update'],
135 + trigger: ['click']
136 + },
137 +
138 + {
139 + els: ['.ct-expandable-trigger'],
140 + load: () => import('./frontend/generic-accordion'),
141 + trigger: ['click']
142 + },
143 +
144 + {
145 + els: ['.ct-header-search'],
146 + load: () => new Promise((r) => r({ mount: fastOverlayMount })),
147 + mount: ({ mount, el, ...rest }) => {
148 + mount(el, {
149 + ...rest,
150 + focus: true
151 + })
152 + },
153 + events: [],
154 + trigger: ['click']
155 + }
156 + ]
157 +
158 + if (document.body.className.indexOf('woocommerce') > -1) {
159 + import('./frontend/woocommerce/main').then(({ wooEntryPoints }) => {
160 + allFrontendEntryPoints = [...allFrontendEntryPoints, ...wooEntryPoints]
161 +
162 + handleEntryPoints(allFrontendEntryPoints, {
163 + immediate: true,
164 + skipEvents: true
165 + })
166 + })
167 + }
168 +
169 + handleEntryPoints(allFrontendEntryPoints, {
170 + immediate: /comp|inter|loaded/.test(document.readyState)
171 + })
172 +
173 + const initOverlayTrigger = () => {
174 + ;[
175 + ...document.querySelectorAll('.ct-header-trigger'),
176 + ...document.querySelectorAll('.ct-offcanvas-trigger')
177 + ].map((menuToggle) => {
178 + if (menuToggle && !menuToggle.hasListener) {
179 + menuToggle.hasListener = true
180 +
181 + menuToggle.addEventListener('click', (event) => {
182 + event.preventDefault()
183 +
184 + if (!menuToggle.dataset.togglePanel && !menuToggle.hash) {
185 + return
186 + }
187 +
188 + let offcanvas = document.querySelector(
189 + menuToggle.dataset.togglePanel || menuToggle.hash
190 + )
191 +
192 + if (!offcanvas) {
193 + return
194 + }
195 +
196 + fastOverlayHandleClick(event, {
197 + container: offcanvas,
198 + closeWhenLinkInside: !menuToggle.closest('.ct-header-cart'),
199 + computeScrollContainer: () => {
200 + if (
201 + offcanvas.querySelector('.cart_list') &&
202 + !offcanvas.querySelector(
203 + '[data-id="cart"] .cart_list'
204 + )
205 + ) {
206 + return offcanvas.querySelector('.cart_list')
207 + }
208 +
209 + if (
210 + getCurrentScreen() === 'mobile' &&
211 + offcanvas.querySelector(
212 + '[data-device="mobile"] > .ct-panel-content-inner'
213 + )
214 + ) {
215 + return offcanvas.querySelector(
216 + '[data-device="mobile"] > .ct-panel-content-inner'
217 + )
218 + }
219 +
220 + return offcanvas.querySelector(
221 + '.ct-panel-content > .ct-panel-content-inner'
222 + )
223 + }
224 + })
225 + })
226 + }
227 + })
228 + }
229 +
230 + const mountIntegrations = (integrations) => {
231 + if (integrations.length > 0) {
232 + Promise.all(
233 + integrations
234 + .filter(({ check }) => check())
235 + .map(({ promise }) => promise())
236 + ).then((integrations) => {
237 + integrations.map(({ mount }) => mount())
238 + })
239 + }
240 + }
241 +
242 + export const preloadLazyAssets = (userCall = true) => {
243 + loadStyle(ct_localizations.dynamic_styles.lazy_load)
244 + preloadClickHandlers()
245 + import('./frontend/handle-3rd-party-events')
246 +
247 + if (userCall) {
248 + ctEvents.trigger('blocksy:frontend:init')
249 + }
250 + }
251 +
252 + onDocumentLoaded(() => {
253 + document.body.addEventListener(
254 + 'mouseover',
255 + () => {
256 + preloadLazyAssets(false)
257 +
258 + const maybeModalSearch = document.querySelector(
259 + '#search-modal .ct-search-form input'
260 + )
261 +
262 + if (maybeModalSearch && maybeModalSearch.value.trim().length > 0) {
263 + maybeModalSearch.dispatchEvent(
264 + new Event('input', { bubbles: true })
265 + )
266 + }
267 + },
268 + { once: true, passive: true }
269 + )
270 +
271 + let inputs = [
272 + ...document.querySelectorAll(
273 + '.comment-form [class*="comment-form-field"]'
274 + )
275 + ]
276 + .reduce(
277 + (result, parent) => [
278 + ...result,
279 + parent.querySelector('input,textarea')
280 + ],
281 + []
282 + )
283 + .filter((input) => input.type !== 'hidden' && input.type !== 'checkbox')
284 +
285 + const renderEmptiness = () => {
286 + inputs.map((input) => {
287 + input.parentNode.classList.remove('ct-not-empty')
288 +
289 + if (!input.value) {
290 + return
291 + }
292 +
293 + if (input.value.trim().length > 0) {
294 + input.parentNode.classList.add('ct-not-empty')
295 + }
296 + })
297 + }
298 +
299 + setTimeout(() => {
300 + renderEmptiness()
301 + }, 10)
302 +
303 + inputs.map((input) => input.addEventListener('input', renderEmptiness))
304 +
305 + mountDynamicChunks()
306 +
307 + setTimeout(() => {
308 + initOverlayTrigger()
309 + })
310 +
311 + mountIntegrations([
312 + {
313 + promise: () => import('./frontend/integration/litespeed'),
314 + check: () =>
315 + !![...document.childNodes].find((c) => {
316 + if (c.nodeType !== 8) {
317 + return false
318 + }
319 +
320 + return c.nodeValue.toLowerCase().includes('litespeed')
321 + })
322 + }
323 + ])
324 + })
325 +
326 + let isPageLoad = true
327 +
328 + ctEvents.on('blocksy:frontend:init', () => {
329 + handleEntryPoints(allFrontendEntryPoints, {
330 + immediate: true,
331 + skipEvents: true
332 + })
333 +
334 + mountDynamicChunks()
335 +
336 + initOverlayTrigger()
337 +
338 + if (isPageLoad) {
339 + isPageLoad = false
340 + } else {
341 + mountIntegrations([
342 + {
343 + promise: () => import('./frontend/integration/stackable'),
344 + check: () => true
345 + },
346 +
347 + {
348 + promise: () => import('./frontend/integration/greenshift'),
349 + check: () => !!window.gsInitTabs
350 + },
351 +
352 + {
353 + promise: () => import('./frontend/integration/cf7'),
354 + check: () => !!window.wpcf7
355 + },
356 +
357 + {
358 + promise: () => import('./frontend/integration/turnstile'),
359 + check: () => !!window.turnstile
360 + },
361 +
362 + {
363 + promise: () => import('./frontend/integration/elementor'),
364 + check: () => !!window.elementorFrontend
365 + },
366 +
367 + {
368 + promise: () =>
369 + import('./frontend/integration/elementor-premium-addons'),
370 + check: () => !!window.premiumWooProducts
371 + },
372 +
373 + {
374 + promise: () =>
375 + import(
376 + './frontend/integration/advanced-product-fields-for-woocommerce'
377 + ),
378 + check: () => !!window._wapf
379 + }
380 + ])
381 + }
382 + })
383 +
384 + ctEvents.on(
385 + 'ct:overlay:handle-click',
386 + ({ e, href, container, options = {} }) => {
387 + fastOverlayHandleClick(e, {
388 + ...(href
389 + ? {
390 + container: document.querySelector(href)
391 + }
392 + : {}),
393 +
394 + ...(container ? { container } : {}),
395 + ...options
396 + })
397 + }
398 + )
399 +
400 + export { loadStyle, handleEntryPoints, onDocumentLoaded } from './helpers'
401 + export { registerDynamicChunk, loadDynamicChunk } from './dynamic-chunks'
402 + export { getCurrentScreen } from './frontend/helpers/current-screen'
403 +
404 + export { fastOverlayPreloadAssets as overlayPreloadAssets } from './frontend/fast-overlay'
405 +