@bebranded/bb-contents 1.0.19-beta → 1.0.21-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bb-contents.js +35 -10
- package/package.json +1 -1
package/bb-contents.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* BeBranded Contents
|
|
3
3
|
* Contenus additionnels français pour Webflow
|
|
4
|
-
* @version 1.0.
|
|
4
|
+
* @version 1.0.21-beta
|
|
5
5
|
* @author BeBranded
|
|
6
6
|
* @license MIT
|
|
7
7
|
* @website https://www.bebranded.xyz
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
// Configuration
|
|
19
19
|
const config = {
|
|
20
|
-
version: '1.0.
|
|
20
|
+
version: '1.0.21-beta',
|
|
21
21
|
debug: window.location.hostname === 'localhost' || window.location.hostname.includes('webflow.io'),
|
|
22
22
|
prefix: 'bb-', // utilisé pour générer les sélecteurs (data-bb-*)
|
|
23
23
|
i18n: {
|
|
@@ -317,11 +317,15 @@
|
|
|
317
317
|
bbContents.utils.log('Module détecté: marquee');
|
|
318
318
|
|
|
319
319
|
elements.forEach(element => {
|
|
320
|
-
|
|
320
|
+
// Vérifier si l'élément a déjà été traité par un autre module
|
|
321
|
+
if (element.bbProcessed || element.hasAttribute('data-bb-youtube-processed')) {
|
|
322
|
+
bbContents.utils.log('Élément marquee déjà traité par un autre module, ignoré:', element);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
321
325
|
element.bbProcessed = true;
|
|
322
326
|
|
|
323
327
|
// Récupérer les options
|
|
324
|
-
const speed = bbContents._getAttr(element, 'bb-marquee-speed') || '
|
|
328
|
+
const speed = bbContents._getAttr(element, 'bb-marquee-speed') || '3000';
|
|
325
329
|
const direction = bbContents._getAttr(element, 'bb-marquee-direction') || 'left';
|
|
326
330
|
const pause = bbContents._getAttr(element, 'bb-marquee-pause') || 'true';
|
|
327
331
|
const gap = bbContents._getAttr(element, 'bb-marquee-gap') || '50';
|
|
@@ -357,9 +361,14 @@
|
|
|
357
361
|
|
|
358
362
|
// Assembler
|
|
359
363
|
mainContainer.appendChild(scrollContainer);
|
|
364
|
+
// Sauvegarder le contenu original avant de vider
|
|
365
|
+
const originalMarqueeContent = element.innerHTML;
|
|
360
366
|
element.innerHTML = '';
|
|
361
367
|
element.appendChild(mainContainer);
|
|
362
368
|
|
|
369
|
+
// Marquer l'élément comme traité par le module marquee
|
|
370
|
+
element.setAttribute('data-bb-marquee-processed', 'true');
|
|
371
|
+
|
|
363
372
|
// Animation JavaScript simple et efficace
|
|
364
373
|
const isVertical = orientation === 'vertical';
|
|
365
374
|
let animationId;
|
|
@@ -370,14 +379,17 @@
|
|
|
370
379
|
if (!startTime) startTime = timestamp;
|
|
371
380
|
const elapsed = timestamp - startTime;
|
|
372
381
|
|
|
373
|
-
// Vitesse en millisecondes
|
|
382
|
+
// Vitesse en millisecondes (plus lente pour une transition fluide)
|
|
374
383
|
const speedMs = parseInt(speed);
|
|
375
384
|
const progress = (elapsed % speedMs) / speedMs;
|
|
376
385
|
|
|
377
|
-
// Calculer la taille du contenu
|
|
386
|
+
// Calculer la taille du contenu avec une transition plus douce
|
|
378
387
|
const contentSize = isVertical ? scrollContainer.scrollHeight / 2 : scrollContainer.scrollWidth / 2;
|
|
379
388
|
currentPosition = -progress * contentSize;
|
|
380
389
|
|
|
390
|
+
// Appliquer une transition CSS pour plus de fluidité
|
|
391
|
+
scrollContainer.style.transition = 'transform 0.1s ease-out';
|
|
392
|
+
|
|
381
393
|
// Appliquer la transformation
|
|
382
394
|
scrollContainer.style.transform = isVertical
|
|
383
395
|
? `translateY(${currentPosition}px)`
|
|
@@ -386,10 +398,10 @@
|
|
|
386
398
|
animationId = requestAnimationFrame(animate);
|
|
387
399
|
};
|
|
388
400
|
|
|
389
|
-
// Démarrer l'animation
|
|
401
|
+
// Démarrer l'animation avec un délai pour laisser le DOM se stabiliser
|
|
390
402
|
setTimeout(() => {
|
|
391
403
|
animationId = requestAnimationFrame(animate);
|
|
392
|
-
},
|
|
404
|
+
}, 200);
|
|
393
405
|
|
|
394
406
|
// Pause au survol
|
|
395
407
|
if (pause === 'true') {
|
|
@@ -437,7 +449,11 @@
|
|
|
437
449
|
bbContents.utils.log('Module détecté: youtube');
|
|
438
450
|
|
|
439
451
|
elements.forEach(element => {
|
|
440
|
-
|
|
452
|
+
// Vérifier si l'élément a déjà été traité par un autre module
|
|
453
|
+
if (element.bbProcessed || element.hasAttribute('data-bb-marquee-processed')) {
|
|
454
|
+
bbContents.utils.log('Élément youtube déjà traité par un autre module, ignoré:', element);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
441
457
|
element.bbProcessed = true;
|
|
442
458
|
|
|
443
459
|
const channelId = bbContents._getAttr(element, 'bb-youtube-channel');
|
|
@@ -478,6 +494,9 @@
|
|
|
478
494
|
// Cacher le template original
|
|
479
495
|
template.style.display = 'none';
|
|
480
496
|
|
|
497
|
+
// Marquer l'élément comme traité par le module YouTube
|
|
498
|
+
element.setAttribute('data-bb-youtube-processed', 'true');
|
|
499
|
+
|
|
481
500
|
// Afficher un loader
|
|
482
501
|
container.innerHTML = '<div style="padding: 20px; text-align: center; color: #6b7280;">Chargement des vidéos YouTube...</div>';
|
|
483
502
|
|
|
@@ -512,9 +531,15 @@
|
|
|
512
531
|
let videos = data.items;
|
|
513
532
|
bbContents.utils.log(`Vidéos reçues de l'API: ${videos.length} (allowShorts: ${allowShorts})`);
|
|
514
533
|
|
|
515
|
-
// Vider le conteneur
|
|
534
|
+
// Vider le conteneur (en préservant les éléments marquee)
|
|
535
|
+
const marqueeElements = container.querySelectorAll('[data-bb-marquee-processed]');
|
|
516
536
|
container.innerHTML = '';
|
|
517
537
|
|
|
538
|
+
// Restaurer les éléments marquee si présents
|
|
539
|
+
marqueeElements.forEach(marqueeEl => {
|
|
540
|
+
container.appendChild(marqueeEl);
|
|
541
|
+
});
|
|
542
|
+
|
|
518
543
|
// Cloner le template pour chaque vidéo
|
|
519
544
|
videos.forEach(item => {
|
|
520
545
|
const videoId = item.id.videoId;
|