@bebranded/bb-contents 1.0.96 → 1.0.98

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 +43 -58
  2. package/package.json +1 -1
package/bb-contents.js CHANGED
@@ -320,13 +320,9 @@
320
320
  ${isVertical ? 'min-height: 100px;' : ''}
321
321
  `;
322
322
 
323
- // Créer 3 copies pour le défilement infini
324
- const repeatBlock1 = mainBlock.cloneNode(true);
325
- const repeatBlock2 = mainBlock.cloneNode(true);
326
-
323
+ // Ne créer que le mainBlock pour l'instant
324
+ // Les copies seront créées après le chargement des images
327
325
  scrollContainer.appendChild(mainBlock);
328
- scrollContainer.appendChild(repeatBlock1);
329
- scrollContainer.appendChild(repeatBlock2);
330
326
  mainContainer.appendChild(scrollContainer);
331
327
 
332
328
  element.innerHTML = '';
@@ -368,6 +364,12 @@
368
364
  speed, direction, gap, isVertical, useAutoHeight, contentSize, gapSize
369
365
  });
370
366
  } else {
367
+ // Solution standard : créer les copies maintenant (les navigateurs non-Safari gèrent mieux)
368
+ const repeatBlock1 = mainBlock.cloneNode(true);
369
+ const repeatBlock2 = mainBlock.cloneNode(true);
370
+ scrollContainer.appendChild(repeatBlock1);
371
+ scrollContainer.appendChild(repeatBlock2);
372
+
371
373
  // Solution standard pour autres navigateurs
372
374
  this.initStandardAnimation(element, scrollContainer, mainBlock, {
373
375
  speed, direction, pauseOnHover, gap, isVertical, useAutoHeight, contentSize, gapSize, step
@@ -389,65 +391,40 @@
389
391
  const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) ||
390
392
  (window.innerWidth <= 768 && /Chrome|CriOS/i.test(navigator.userAgent));
391
393
 
392
- // OPTIMISATION: Charger les images en respectant le CSS Webflow
393
- images.forEach(img => {
394
- // Préserver les styles CSS existants AVANT toute modification
395
- const computedStyle = getComputedStyle(img);
396
- const originalObjectFit = img.style.objectFit || computedStyle.objectFit;
397
- const originalObjectPosition = img.style.objectPosition || computedStyle.objectPosition;
398
- const originalWidth = computedStyle.width;
399
- const originalHeight = computedStyle.height;
400
-
401
- // OPTIMISATION MOBILE : Améliorer le rendu des images sur mobile (sans transform sur l'image)
402
- if (isMobile) {
403
- // Forcer le rendu haute qualité sur mobile sans transform (évite conflit avec translate3d du parent)
404
- img.style.backfaceVisibility = 'hidden';
405
- img.style.webkitBackfaceVisibility = 'hidden';
406
- // Ne PAS mettre transform sur l'image car le parent utilise translate3d
407
- // Cela évite les problèmes de flou causés par les transformations multiples
408
- img.style.willChange = 'auto'; // Éviter will-change qui peut causer du flou
409
- }
410
-
411
- // Charger l'image si nécessaire
412
- if (img.complete && img.naturalWidth > 0) {
413
- // Image déjà chargée, ne rien toucher
414
- imagesLoaded++;
415
- } else {
394
+ // SOLUTION MOBILE : Charger toutes les images AVANT de créer les copies pour éviter le flou
395
+ const loadImage = (img) => {
396
+ return new Promise((resolve) => {
397
+ if (img.complete && img.naturalWidth > 0 && img.naturalHeight > 0) {
398
+ // Image déjà chargée et rendue
399
+ imagesLoaded++;
400
+ resolve();
401
+ return;
402
+ }
403
+
416
404
  if (img.dataset.src && !img.src) {
417
405
  img.src = img.dataset.src;
418
406
  }
419
407
 
420
- // OPTIMISATION MOBILE : Utiliser eager sur mobile pour éviter le flou de lazy loading
421
- if (!img.loading) {
422
- img.loading = isMobile ? 'eager' : 'lazy'; // eager sur mobile pour meilleur rendu
408
+ // Utiliser eager sur mobile pour éviter le flou de lazy loading
409
+ if (!img.loading && isMobile) {
410
+ img.loading = 'eager';
423
411
  }
424
412
 
425
413
  img.onload = () => {
426
- // OPTIMISATION: Restaurer les styles CSS après chargement
427
- if (originalObjectFit && originalObjectFit !== 'none') {
428
- img.style.objectFit = originalObjectFit;
429
- }
430
- if (originalObjectPosition && originalObjectPosition !== 'initial') {
431
- img.style.objectPosition = originalObjectPosition;
432
- }
433
-
434
- // OPTIMISATION MOBILE : Respecter les dimensions CSS de Webflow
435
- // Ne PAS forcer auto si les dimensions CSS sont définies dans Webflow
436
- // Le CSS de Webflow prend toujours le dessus
437
-
438
- // Forcer le recalcul pour mobile (important pour le rendu)
439
- if (isMobile) {
440
- // Force reflow pour meilleur rendu sans ajouter de transform
441
- void img.offsetHeight;
442
- }
443
-
444
414
  imagesLoaded++;
415
+ // Forcer un reflow pour s'assurer que l'image est rendue
416
+ void img.offsetHeight;
417
+ resolve();
445
418
  };
446
419
  img.onerror = () => {
447
420
  imagesLoaded++;
421
+ resolve(); // Résoudre même en cas d'erreur
448
422
  };
449
- }
450
- });
423
+ });
424
+ };
425
+
426
+ // Charger toutes les images en parallèle
427
+ Promise.all(Array.from(images).map(loadImage));
451
428
 
452
429
  // Timeout plus long sur mobile pour laisser le temps aux images de se charger
453
430
  const maxWaitTime = isMobile ? 5000 : 3000; // 5 secondes sur mobile
@@ -457,11 +434,19 @@
457
434
  waitTimeout += 100;
458
435
 
459
436
  if (imagesLoaded >= totalImages || imagesLoaded === 0 || waitTimeout >= maxWaitTime) {
460
- // Attendre plus longtemps sur mobile pour le rendu visuel
461
- const renderDelay = isMobile ? 1000 : 200;
462
- setTimeout(() => {
463
- startSafariAnimation();
464
- }, renderDelay);
437
+ // Attendre un frame pour le rendu complet, surtout sur mobile
438
+ requestAnimationFrame(() => {
439
+ 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();
448
+ });
449
+ });
465
450
  } else {
466
451
  setTimeout(waitForImages, 100);
467
452
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bebranded/bb-contents",
3
- "version": "1.0.96",
3
+ "version": "1.0.98",
4
4
  "description": "Contenus additionnels français pour Webflow",
5
5
  "main": "bb-contents.js",
6
6
  "scripts": {