@bebranded/bb-contents 1.0.98 → 1.0.100

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 +77 -31
  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.94-test
4
+ * @version 1.0.100
5
5
  * @author BeBranded
6
6
  * @license MIT
7
7
  * @website https://www.bebranded.xyz
@@ -32,11 +32,11 @@
32
32
  window._bbContentsInitialized = true;
33
33
 
34
34
  // Log de démarrage simple (une seule fois)
35
- console.log('bb-contents | v1.0.94-test');
35
+ console.log('bb-contents | v1.0.100');
36
36
 
37
37
  // Configuration
38
38
  const config = {
39
- version: '1.0.94-test',
39
+ version: '1.0.100',
40
40
  debug: false, // Debug désactivé pour rendu propre
41
41
  prefix: 'bb-', // utilisé pour générer les sélecteurs (data-bb-*)
42
42
  youtubeEndpoint: null, // URL du worker YouTube (à définir par l'utilisateur)
@@ -394,8 +394,10 @@
394
394
  // SOLUTION MOBILE : Charger toutes les images AVANT de créer les copies pour éviter le flou
395
395
  const loadImage = (img) => {
396
396
  return new Promise((resolve) => {
397
+ // Vérifier que l'image est complètement chargée avec dimensions naturelles
397
398
  if (img.complete && img.naturalWidth > 0 && img.naturalHeight > 0) {
398
- // Image déjà chargée et rendue
399
+ // Image déjà chargée, vérifier le rendu avec un reflow
400
+ void img.offsetHeight;
399
401
  imagesLoaded++;
400
402
  resolve();
401
403
  return;
@@ -411,10 +413,26 @@
411
413
  }
412
414
 
413
415
  img.onload = () => {
414
- imagesLoaded++;
415
- // Forcer un reflow pour s'assurer que l'image est rendue
416
- void img.offsetHeight;
417
- resolve();
416
+ // Vérifier que les dimensions naturelles sont disponibles
417
+ if (img.naturalWidth > 0 && img.naturalHeight > 0) {
418
+ // Forcer un reflow complet pour s'assurer que l'image est rendue
419
+ void img.offsetHeight;
420
+ void img.offsetWidth;
421
+ // Double reflow pour mobile (surtout Retina)
422
+ if (isMobile) {
423
+ requestAnimationFrame(() => {
424
+ void img.offsetHeight;
425
+ imagesLoaded++;
426
+ resolve();
427
+ });
428
+ } else {
429
+ imagesLoaded++;
430
+ resolve();
431
+ }
432
+ } else {
433
+ imagesLoaded++;
434
+ resolve();
435
+ }
418
436
  };
419
437
  img.onerror = () => {
420
438
  imagesLoaded++;
@@ -423,36 +441,59 @@
423
441
  });
424
442
  };
425
443
 
426
- // Charger toutes les images en parallèle
427
- Promise.all(Array.from(images).map(loadImage));
428
-
429
- // Timeout plus long sur mobile pour laisser le temps aux images de se charger
430
- const maxWaitTime = isMobile ? 5000 : 3000; // 5 secondes sur mobile
431
- let waitTimeout = 0;
432
-
433
- const waitForImages = () => {
434
- waitTimeout += 100;
444
+ // Attendre réellement que toutes les images soient chargées
445
+ Promise.all(Array.from(images).map(loadImage)).then(() => {
446
+ // Vérifier que toutes les images ont leurs dimensions naturelles
447
+ let allImagesReady = true;
448
+ images.forEach(img => {
449
+ if (!img.complete || img.naturalWidth === 0 || img.naturalHeight === 0) {
450
+ allImagesReady = false;
451
+ }
452
+ });
435
453
 
436
- if (imagesLoaded >= totalImages || imagesLoaded === 0 || waitTimeout >= maxWaitTime) {
437
- // Attendre un frame pour le rendu complet, surtout sur mobile
454
+ if (allImagesReady || images.length === 0) {
455
+ // Attendre plusieurs frames pour garantir le rendu complet, surtout sur mobile
438
456
  requestAnimationFrame(() => {
439
457
  requestAnimationFrame(() => {
440
- // Maintenant créer les copies avec les images complètement chargées
441
- const repeatBlock1 = mainBlock.cloneNode(true);
442
- const repeatBlock2 = mainBlock.cloneNode(true);
443
- scrollContainer.appendChild(repeatBlock1);
444
- scrollContainer.appendChild(repeatBlock2);
445
-
446
- // Démarrer l'animation
447
- startSafariAnimation();
458
+ // Délai supplémentaire sur mobile pour garantir le rendu Retina
459
+ const renderDelay = isMobile ? 100 : 0;
460
+ setTimeout(() => {
461
+ // Forcer un reflow complet du mainBlock avant clonage
462
+ void mainBlock.offsetHeight;
463
+
464
+ // Maintenant créer les copies avec les images complètement chargées et rendues
465
+ const repeatBlock1 = mainBlock.cloneNode(true);
466
+ const repeatBlock2 = mainBlock.cloneNode(true);
467
+
468
+ // Forcer un reflow après clonage pour garantir le rendu
469
+ scrollContainer.appendChild(repeatBlock1);
470
+ void repeatBlock1.offsetHeight;
471
+ scrollContainer.appendChild(repeatBlock2);
472
+ void repeatBlock2.offsetHeight;
473
+
474
+ // Démarrer l'animation
475
+ startSafariAnimation();
476
+ }, renderDelay);
448
477
  });
449
478
  });
450
479
  } else {
451
- setTimeout(waitForImages, 100);
480
+ // Fallback : attendre un peu plus si certaines images ne sont pas prêtes
481
+ setTimeout(() => {
482
+ const repeatBlock1 = mainBlock.cloneNode(true);
483
+ const repeatBlock2 = mainBlock.cloneNode(true);
484
+ scrollContainer.appendChild(repeatBlock1);
485
+ scrollContainer.appendChild(repeatBlock2);
486
+ startSafariAnimation();
487
+ }, 500);
452
488
  }
453
- };
454
-
455
- waitForImages();
489
+ }).catch(() => {
490
+ // En cas d'erreur, créer les copies quand même
491
+ const repeatBlock1 = mainBlock.cloneNode(true);
492
+ const repeatBlock2 = mainBlock.cloneNode(true);
493
+ scrollContainer.appendChild(repeatBlock1);
494
+ scrollContainer.appendChild(repeatBlock2);
495
+ startSafariAnimation();
496
+ });
456
497
 
457
498
  const startSafariAnimation = () => {
458
499
  // Forcer le chargement des images restantes si timeout
@@ -513,6 +554,11 @@
513
554
  currentPosition = 0;
514
555
  }
515
556
 
557
+ // Désactiver will-change sur mobile après initialisation pour éviter le flou
558
+ if (isMobile) {
559
+ scrollContainer.style.willChange = 'auto';
560
+ }
561
+
516
562
  // Forcer la position initiale pour éviter l'invisibilité
517
563
  const initialTransform = isVertical
518
564
  ? `translate3d(0, ${currentPosition}px, 0)`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bebranded/bb-contents",
3
- "version": "1.0.98",
3
+ "version": "1.0.100",
4
4
  "description": "Contenus additionnels français pour Webflow",
5
5
  "main": "bb-contents.js",
6
6
  "scripts": {