@bebranded/bb-contents 1.0.18-beta → 1.0.20-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.
Files changed (2) hide show
  1. package/bb-contents.js +47 -40
  2. 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.18-beta
4
+ * @version 1.0.20-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.18-beta',
20
+ version: '1.0.20-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: {
@@ -304,7 +304,7 @@
304
304
  }
305
305
  },
306
306
 
307
- // Module Marquee - Version hybride (CSS + JavaScript)
307
+ // Module Marquee - Version simplifiée et corrigée
308
308
  marquee: {
309
309
  detect: function(scope) {
310
310
  return scope.querySelector('[bb-marquee]') !== null;
@@ -317,10 +317,14 @@
317
317
  bbContents.utils.log('Module détecté: marquee');
318
318
 
319
319
  elements.forEach(element => {
320
- if (element.bbProcessed) return;
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
- // Récupérer les options avec valeurs par défaut optimisées
327
+ // Récupérer les options
324
328
  const speed = bbContents._getAttr(element, 'bb-marquee-speed') || '100';
325
329
  const direction = bbContents._getAttr(element, 'bb-marquee-direction') || 'left';
326
330
  const pause = bbContents._getAttr(element, 'bb-marquee-pause') || 'true';
@@ -329,8 +333,8 @@
329
333
  const height = bbContents._getAttr(element, 'bb-marquee-height');
330
334
  const minHeight = bbContents._getAttr(element, 'bb-marquee-min-height');
331
335
 
332
- // Calculer la vitesse en millisecondes (comme la version live)
333
- const speedMs = parseInt(speed);
336
+ // Sauvegarder le contenu original
337
+ const originalContent = element.innerHTML;
334
338
 
335
339
  // Créer le conteneur principal
336
340
  const mainContainer = document.createElement('div');
@@ -342,7 +346,7 @@
342
346
  ${minHeight ? `min-height: ${minHeight};` : ''}
343
347
  `;
344
348
 
345
- // Créer le conteneur de défilement avec animation CSS de base
349
+ // Créer le conteneur de défilement
346
350
  const scrollContainer = document.createElement('div');
347
351
  scrollContainer.style.cssText = `
348
352
  display: flex;
@@ -350,48 +354,43 @@
350
354
  ${orientation === 'vertical' ? 'flex-direction: column;' : ''}
351
355
  gap: ${gap}px;
352
356
  will-change: transform;
353
- ${orientation === 'vertical' ? 'white-space: nowrap;' : ''}
354
357
  `;
355
358
 
356
- // Dupliquer le contenu pour l'effet infini
357
- const originalContent = element.innerHTML;
359
+ // Dupliquer le contenu
358
360
  scrollContainer.innerHTML = originalContent + originalContent;
359
361
 
360
- // Ajouter les styles CSS optimisés
361
- const style = document.createElement('style');
362
- style.textContent = `
363
- @keyframes marquee-horizontal {
364
- 0% { transform: translateX(0); }
365
- 100% { transform: translateX(-50%); }
366
- }
367
- @keyframes marquee-vertical {
368
- 0% { transform: translateY(0); }
369
- 100% { transform: translateY(-50%); }
370
- }
371
- `;
372
- document.head.appendChild(style);
362
+ // Assembler
363
+ mainContainer.appendChild(scrollContainer);
364
+ // Sauvegarder le contenu original avant de vider
365
+ const originalMarqueeContent = element.innerHTML;
366
+ element.innerHTML = '';
367
+ element.appendChild(mainContainer);
368
+
369
+ // Marquer l'élément comme traité par le module marquee
370
+ element.setAttribute('data-bb-marquee-processed', 'true');
373
371
 
374
- // Fonction d'animation JavaScript pour contrôle précis (comme la version live)
372
+ // Animation JavaScript simple et efficace
375
373
  const isVertical = orientation === 'vertical';
376
374
  let animationId;
377
375
  let startTime;
378
376
  let currentPosition = 0;
379
- const contentSize = isVertical ? scrollContainer.scrollHeight / 2 : scrollContainer.scrollWidth / 2;
380
377
 
381
378
  const animate = (timestamp) => {
382
379
  if (!startTime) startTime = timestamp;
383
380
  const elapsed = timestamp - startTime;
384
381
 
385
- // Calculer la position basée sur la vitesse (comme la version live)
382
+ // Vitesse en millisecondes
383
+ const speedMs = parseInt(speed);
386
384
  const progress = (elapsed % speedMs) / speedMs;
385
+
386
+ // Calculer la taille du contenu
387
+ const contentSize = isVertical ? scrollContainer.scrollHeight / 2 : scrollContainer.scrollWidth / 2;
387
388
  currentPosition = -progress * contentSize;
388
389
 
389
390
  // Appliquer la transformation
390
- if (isVertical) {
391
- scrollContainer.style.transform = `translateY(${currentPosition}px)`;
392
- } else {
393
- scrollContainer.style.transform = `translateX(${currentPosition}px)`;
394
- }
391
+ scrollContainer.style.transform = isVertical
392
+ ? `translateY(${currentPosition}px)`
393
+ : `translateX(${currentPosition}px)`;
395
394
 
396
395
  animationId = requestAnimationFrame(animate);
397
396
  };
@@ -428,14 +427,9 @@
428
427
  mainContainer.style.height = maxHeight + 'px';
429
428
  }
430
429
  }
431
-
432
- // Assembler
433
- mainContainer.appendChild(scrollContainer);
434
- element.innerHTML = '';
435
- element.appendChild(mainContainer);
436
430
  });
437
431
 
438
- bbContents.utils.log('Module Marquee hybride initialisé:', elements.length, 'éléments');
432
+ bbContents.utils.log('Module Marquee initialisé:', elements.length, 'éléments');
439
433
  }
440
434
  },
441
435
 
@@ -452,7 +446,11 @@
452
446
  bbContents.utils.log('Module détecté: youtube');
453
447
 
454
448
  elements.forEach(element => {
455
- if (element.bbProcessed) return;
449
+ // Vérifier si l'élément a déjà été traité par un autre module
450
+ if (element.bbProcessed || element.hasAttribute('data-bb-marquee-processed')) {
451
+ bbContents.utils.log('Élément youtube déjà traité par un autre module, ignoré:', element);
452
+ return;
453
+ }
456
454
  element.bbProcessed = true;
457
455
 
458
456
  const channelId = bbContents._getAttr(element, 'bb-youtube-channel');
@@ -493,6 +491,9 @@
493
491
  // Cacher le template original
494
492
  template.style.display = 'none';
495
493
 
494
+ // Marquer l'élément comme traité par le module YouTube
495
+ element.setAttribute('data-bb-youtube-processed', 'true');
496
+
496
497
  // Afficher un loader
497
498
  container.innerHTML = '<div style="padding: 20px; text-align: center; color: #6b7280;">Chargement des vidéos YouTube...</div>';
498
499
 
@@ -527,9 +528,15 @@
527
528
  let videos = data.items;
528
529
  bbContents.utils.log(`Vidéos reçues de l'API: ${videos.length} (allowShorts: ${allowShorts})`);
529
530
 
530
- // Vider le conteneur
531
+ // Vider le conteneur (en préservant les éléments marquee)
532
+ const marqueeElements = container.querySelectorAll('[data-bb-marquee-processed]');
531
533
  container.innerHTML = '';
532
534
 
535
+ // Restaurer les éléments marquee si présents
536
+ marqueeElements.forEach(marqueeEl => {
537
+ container.appendChild(marqueeEl);
538
+ });
539
+
533
540
  // Cloner le template pour chaque vidéo
534
541
  videos.forEach(item => {
535
542
  const videoId = item.id.videoId;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bebranded/bb-contents",
3
- "version": "1.0.18-beta",
3
+ "version": "1.0.20-beta",
4
4
  "description": "Contenus additionnels français pour Webflow",
5
5
  "main": "bb-contents.js",
6
6
  "scripts": {