@bebranded/bb-contents 1.0.105 → 1.0.106
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 +56 -112
- 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.106
|
|
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.
|
|
35
|
+
console.log('bb-contents | v1.0.106');
|
|
36
36
|
|
|
37
37
|
// Configuration
|
|
38
38
|
const config = {
|
|
39
|
-
version: '1.0.
|
|
39
|
+
version: '1.0.106',
|
|
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)
|
|
@@ -391,117 +391,67 @@
|
|
|
391
391
|
const totalImages = images.length;
|
|
392
392
|
|
|
393
393
|
|
|
394
|
-
//
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
394
|
+
// OPTIMISATION: Charger les images sans forcer les dimensions
|
|
395
|
+
images.forEach(img => {
|
|
396
|
+
if (img.dataset.src && !img.src) {
|
|
397
|
+
img.src = img.dataset.src;
|
|
398
|
+
img.loading = 'eager';
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// OPTIMISATION: Préserver les styles CSS existants (object-fit, etc.)
|
|
402
|
+
const originalObjectFit = img.style.objectFit || getComputedStyle(img).objectFit;
|
|
403
|
+
const originalObjectPosition = img.style.objectPosition || getComputedStyle(img).objectPosition;
|
|
404
|
+
const originalWidth = img.style.width;
|
|
405
|
+
const originalHeight = img.style.height;
|
|
406
|
+
|
|
407
|
+
img.onload = () => {
|
|
408
|
+
// OPTIMISATION: Restaurer les styles CSS après chargement
|
|
409
|
+
if (originalObjectFit && originalObjectFit !== 'none') {
|
|
410
|
+
img.style.objectFit = originalObjectFit;
|
|
408
411
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
img.src = img.dataset.src;
|
|
412
|
+
if (originalObjectPosition && originalObjectPosition !== 'initial') {
|
|
413
|
+
img.style.objectPosition = originalObjectPosition;
|
|
412
414
|
}
|
|
413
415
|
|
|
414
|
-
//
|
|
415
|
-
if (!
|
|
416
|
-
img.
|
|
416
|
+
// OPTIMISATION: Préserver les dimensions naturelles des images
|
|
417
|
+
if (!originalWidth || originalWidth === '') {
|
|
418
|
+
img.style.width = 'auto';
|
|
419
|
+
}
|
|
420
|
+
if (!originalHeight || originalHeight === '') {
|
|
421
|
+
img.style.height = 'auto';
|
|
417
422
|
}
|
|
418
423
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
// Double reflow pour mobile (surtout Retina)
|
|
426
|
-
if (isMobile) {
|
|
427
|
-
requestAnimationFrame(() => {
|
|
428
|
-
void img.offsetHeight;
|
|
429
|
-
imagesLoaded++;
|
|
430
|
-
resolve();
|
|
431
|
-
});
|
|
432
|
-
} else {
|
|
433
|
-
imagesLoaded++;
|
|
434
|
-
resolve();
|
|
435
|
-
}
|
|
436
|
-
} else {
|
|
437
|
-
imagesLoaded++;
|
|
438
|
-
resolve();
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
img.onerror = () => {
|
|
442
|
-
imagesLoaded++;
|
|
443
|
-
resolve(); // Résoudre même en cas d'erreur
|
|
444
|
-
};
|
|
445
|
-
});
|
|
446
|
-
};
|
|
424
|
+
imagesLoaded++;
|
|
425
|
+
};
|
|
426
|
+
img.onerror = () => {
|
|
427
|
+
imagesLoaded++;
|
|
428
|
+
};
|
|
429
|
+
});
|
|
447
430
|
|
|
448
|
-
//
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
431
|
+
// SOLUTION SAFARI MOBILE SIMPLE : Attendre plus longtemps
|
|
432
|
+
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
|
|
433
|
+
|
|
434
|
+
// Timeout plus long sur mobile pour laisser le temps aux images de se charger
|
|
435
|
+
const maxWaitTime = isMobile ? 5000 : 3000; // 5 secondes sur mobile
|
|
436
|
+
let waitTimeout = 0;
|
|
437
|
+
|
|
438
|
+
const waitForImages = () => {
|
|
439
|
+
waitTimeout += 100;
|
|
457
440
|
|
|
458
|
-
if (
|
|
459
|
-
// Attendre
|
|
460
|
-
|
|
461
|
-
requestAnimationFrame(() => {
|
|
462
|
-
// Délai supplémentaire sur mobile pour garantir le rendu Retina
|
|
463
|
-
const renderDelay = isMobile ? 100 : 0;
|
|
464
|
-
setTimeout(() => {
|
|
465
|
-
// Forcer un reflow complet du mainBlock avant clonage
|
|
466
|
-
void mainBlock.offsetHeight;
|
|
467
|
-
|
|
468
|
-
// Maintenant créer les copies avec les images complètement chargées et rendues
|
|
469
|
-
const repeatBlock1 = mainBlock.cloneNode(true);
|
|
470
|
-
const repeatBlock2 = mainBlock.cloneNode(true);
|
|
471
|
-
|
|
472
|
-
// Forcer un reflow après clonage pour garantir le rendu
|
|
473
|
-
scrollContainer.appendChild(repeatBlock1);
|
|
474
|
-
void repeatBlock1.offsetHeight;
|
|
475
|
-
scrollContainer.appendChild(repeatBlock2);
|
|
476
|
-
void repeatBlock2.offsetHeight;
|
|
477
|
-
|
|
478
|
-
// Démarrer l'animation
|
|
479
|
-
startSafariAnimation();
|
|
480
|
-
}, renderDelay);
|
|
481
|
-
});
|
|
482
|
-
});
|
|
483
|
-
} else {
|
|
484
|
-
// Fallback : attendre un peu plus si certaines images ne sont pas prêtes
|
|
441
|
+
if (imagesLoaded >= totalImages || imagesLoaded === 0 || waitTimeout >= maxWaitTime) {
|
|
442
|
+
// Attendre plus longtemps sur mobile pour le rendu visuel
|
|
443
|
+
const renderDelay = isMobile ? 1000 : 200;
|
|
485
444
|
setTimeout(() => {
|
|
486
|
-
const repeatBlock1 = mainBlock.cloneNode(true);
|
|
487
|
-
const repeatBlock2 = mainBlock.cloneNode(true);
|
|
488
|
-
scrollContainer.appendChild(repeatBlock1);
|
|
489
|
-
scrollContainer.appendChild(repeatBlock2);
|
|
490
445
|
startSafariAnimation();
|
|
491
|
-
},
|
|
446
|
+
}, renderDelay);
|
|
447
|
+
} else {
|
|
448
|
+
setTimeout(waitForImages, 100);
|
|
492
449
|
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
const repeatBlock2 = mainBlock.cloneNode(true);
|
|
497
|
-
scrollContainer.appendChild(repeatBlock1);
|
|
498
|
-
scrollContainer.appendChild(repeatBlock2);
|
|
499
|
-
startSafariAnimation();
|
|
500
|
-
});
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
waitForImages();
|
|
501
453
|
|
|
502
454
|
const startSafariAnimation = () => {
|
|
503
|
-
// Vérifier que speed est bien défini et valide
|
|
504
|
-
const validSpeed = parseFloat(speed) || 100;
|
|
505
455
|
|
|
506
456
|
// Recalculer la taille après chargement des images
|
|
507
457
|
const newContentSize = isVertical ? mainBlock.offsetHeight : mainBlock.offsetWidth;
|
|
@@ -522,7 +472,7 @@
|
|
|
522
472
|
|
|
523
473
|
// Solution Safari simplifiée
|
|
524
474
|
const totalSize = finalContentSize * 3 + gapSize * 2;
|
|
525
|
-
const step = (
|
|
475
|
+
const step = (parseFloat(speed) * (isVertical ? 1.5 : 0.8)) / 60;
|
|
526
476
|
let isPaused = false;
|
|
527
477
|
|
|
528
478
|
// Ajuster la taille du conteneur
|
|
@@ -540,11 +490,6 @@
|
|
|
540
490
|
currentPosition = 0;
|
|
541
491
|
}
|
|
542
492
|
|
|
543
|
-
// Désactiver will-change sur mobile après initialisation pour éviter le flou
|
|
544
|
-
if (isMobile) {
|
|
545
|
-
scrollContainer.style.willChange = 'auto';
|
|
546
|
-
}
|
|
547
|
-
|
|
548
493
|
// Forcer la position initiale pour éviter l'invisibilité
|
|
549
494
|
const initialTransform = isVertical
|
|
550
495
|
? `translate3d(0, ${currentPosition}px, 0)`
|
|
@@ -583,11 +528,10 @@
|
|
|
583
528
|
requestAnimationFrame(animate);
|
|
584
529
|
};
|
|
585
530
|
|
|
586
|
-
// Démarrer l'animation
|
|
587
|
-
|
|
588
|
-
requestAnimationFrame(() => {
|
|
531
|
+
// Démarrer l'animation avec un petit délai pour Safari
|
|
532
|
+
setTimeout(() => {
|
|
589
533
|
animate();
|
|
590
|
-
});
|
|
534
|
+
}, 50);
|
|
591
535
|
|
|
592
536
|
// Pause au survol pour Safari
|
|
593
537
|
if (element.getAttribute('bb-marquee-pause') === 'true') {
|