@bebranded/bb-contents 1.0.113 → 1.0.115
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 +60 -49
- 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.115
|
|
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.115');
|
|
36
36
|
|
|
37
37
|
// Configuration
|
|
38
38
|
const config = {
|
|
39
|
-
version: '1.0.
|
|
39
|
+
version: '1.0.115',
|
|
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)
|
|
@@ -390,6 +390,10 @@
|
|
|
390
390
|
let imagesLoaded = 0;
|
|
391
391
|
const totalImages = images.length;
|
|
392
392
|
|
|
393
|
+
// DÉCLARER isMobile et isSafari AVANT leur utilisation dans img.onload
|
|
394
|
+
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
|
|
395
|
+
// Détecter spécifiquement Safari (pas Chrome mobile)
|
|
396
|
+
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent) || /iPhone|iPad|iPod/.test(navigator.userAgent);
|
|
393
397
|
|
|
394
398
|
// OPTIMISATION: Charger les images et appliquer les styles SVG AVANT le clonage
|
|
395
399
|
// pour éviter les reflows qui causent la saccade de l'animation
|
|
@@ -409,43 +413,42 @@
|
|
|
409
413
|
const originalHeight = img.style.height;
|
|
410
414
|
|
|
411
415
|
img.onload = () => {
|
|
412
|
-
// SOLUTION MOBILE SAFARI : Pour les SVG sur mobile Safari,
|
|
416
|
+
// SOLUTION MOBILE SAFARI : Pour les SVG sur mobile Safari, utiliser contain avec optimisations
|
|
413
417
|
if (isSVG && isMobile && isSafari) {
|
|
414
|
-
// SUR SAFARI MOBILE :
|
|
415
|
-
|
|
416
|
-
img.style.objectFit = 'none';
|
|
418
|
+
// SUR SAFARI MOBILE : Utiliser contain MAIS avec des optimisations pour éviter le flou
|
|
419
|
+
img.style.objectFit = 'contain';
|
|
417
420
|
img.style.objectPosition = 'center';
|
|
418
421
|
|
|
419
|
-
//
|
|
422
|
+
// Dimensions avec contraintes pour forcer contain
|
|
423
|
+
img.style.width = '100%';
|
|
424
|
+
img.style.height = '100%';
|
|
425
|
+
img.style.maxWidth = '100%';
|
|
426
|
+
img.style.maxHeight = '100%';
|
|
427
|
+
img.style.boxSizing = 'border-box';
|
|
428
|
+
|
|
429
|
+
// Optimisations pour améliorer le rendu des SVG avec contain
|
|
430
|
+
// Utiliser auto au lieu de crisp-edges pour contain
|
|
431
|
+
img.style.imageRendering = 'auto';
|
|
432
|
+
img.style.webkitBackfaceVisibility = 'hidden';
|
|
433
|
+
img.style.backfaceVisibility = 'hidden';
|
|
434
|
+
|
|
435
|
+
// Forcer le GPU rendering AVANT d'appliquer contain
|
|
436
|
+
img.style.webkitTransform = 'translateZ(0)';
|
|
437
|
+
img.style.transform = 'translateZ(0)';
|
|
438
|
+
|
|
439
|
+
// Conteneur parent pour contraindre et centrer
|
|
420
440
|
const parent = img.parentElement;
|
|
421
441
|
if (parent) {
|
|
422
|
-
// S'assurer que le parent a des dimensions fixes
|
|
423
|
-
const parentComputed = getComputedStyle(parent);
|
|
424
|
-
if (!parentComputed.width || parentComputed.width === 'auto') {
|
|
425
|
-
parent.style.width = '100%';
|
|
426
|
-
}
|
|
427
|
-
if (!parentComputed.height || parentComputed.height === 'auto') {
|
|
428
|
-
parent.style.height = '100%';
|
|
429
|
-
}
|
|
430
|
-
|
|
431
442
|
parent.style.display = 'flex';
|
|
432
443
|
parent.style.alignItems = 'center';
|
|
433
444
|
parent.style.justifyContent = 'center';
|
|
434
445
|
parent.style.overflow = 'hidden';
|
|
435
446
|
parent.style.boxSizing = 'border-box';
|
|
436
447
|
|
|
437
|
-
//
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
img.style.maxWidth = '100%';
|
|
441
|
-
img.style.maxHeight = '100%';
|
|
442
|
-
img.style.boxSizing = 'border-box';
|
|
448
|
+
// S'assurer que le parent a des dimensions
|
|
449
|
+
if (!parent.style.width) parent.style.width = '100%';
|
|
450
|
+
if (!parent.style.height) parent.style.height = '100%';
|
|
443
451
|
}
|
|
444
|
-
|
|
445
|
-
// Améliorer le rendu des SVG sans object-fit
|
|
446
|
-
img.style.imageRendering = 'crisp-edges';
|
|
447
|
-
img.style.webkitBackfaceVisibility = 'hidden';
|
|
448
|
-
img.style.backfaceVisibility = 'hidden';
|
|
449
452
|
} else if (isSVG && isMobile) {
|
|
450
453
|
// Pour Chrome mobile, utiliser contain normalement
|
|
451
454
|
img.style.objectFit = 'contain';
|
|
@@ -489,11 +492,6 @@
|
|
|
489
492
|
};
|
|
490
493
|
});
|
|
491
494
|
|
|
492
|
-
// SOLUTION SAFARI MOBILE SIMPLE : Attendre plus longtemps
|
|
493
|
-
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
|
|
494
|
-
// Détecter spécifiquement Safari (pas Chrome mobile)
|
|
495
|
-
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent) || /iPhone|iPad|iPod/.test(navigator.userAgent);
|
|
496
|
-
|
|
497
495
|
// Timeout plus long sur mobile pour laisser le temps aux images de se charger
|
|
498
496
|
const maxWaitTime = isMobile ? 5000 : 3000; // 5 secondes sur mobile
|
|
499
497
|
let waitTimeout = 0;
|
|
@@ -501,17 +499,41 @@
|
|
|
501
499
|
const waitForImages = () => {
|
|
502
500
|
waitTimeout += 100;
|
|
503
501
|
|
|
504
|
-
// Attendre que TOUTES les images soient chargées
|
|
502
|
+
// SAFARI MOBILE : Attendre ABSOLUMENT que TOUTES les images soient chargées
|
|
505
503
|
if (totalImages === 0) {
|
|
506
504
|
// Pas d'images, démarrer après un court délai
|
|
507
505
|
const renderDelay = isMobile ? 500 : 100;
|
|
508
506
|
setTimeout(() => {
|
|
509
507
|
startSafariAnimation();
|
|
510
508
|
}, renderDelay);
|
|
511
|
-
} else if (imagesLoaded >= totalImages
|
|
512
|
-
//
|
|
513
|
-
|
|
514
|
-
|
|
509
|
+
} else if (imagesLoaded >= totalImages) {
|
|
510
|
+
// SAFARI MOBILE : Vérifier que les images ont vraiment leurs dimensions
|
|
511
|
+
let imagesReady = true;
|
|
512
|
+
if (isSafari && isMobile) {
|
|
513
|
+
images.forEach(img => {
|
|
514
|
+
if (!img.complete || img.naturalWidth === 0 || img.naturalHeight === 0) {
|
|
515
|
+
imagesReady = false;
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
if (imagesReady) {
|
|
521
|
+
// Toutes les images sont chargées ET ont leurs dimensions
|
|
522
|
+
// Attendre plus longtemps sur mobile Safari pour le rendu visuel
|
|
523
|
+
const renderDelay = isSafari && isMobile ? 1500 : (isMobile ? 1000 : 200);
|
|
524
|
+
setTimeout(() => {
|
|
525
|
+
startSafariAnimation();
|
|
526
|
+
}, renderDelay);
|
|
527
|
+
} else {
|
|
528
|
+
// Continuer à attendre que les dimensions soient disponibles
|
|
529
|
+
setTimeout(waitForImages, 100);
|
|
530
|
+
}
|
|
531
|
+
} else if (waitTimeout >= maxWaitTime) {
|
|
532
|
+
// Timeout atteint : forcer le démarrage mais c'est un fallback
|
|
533
|
+
if (bbContents.config.debug) {
|
|
534
|
+
console.warn('[MARQUEE] Timeout atteint, certaines images peuvent ne pas être chargées');
|
|
535
|
+
}
|
|
536
|
+
const renderDelay = isSafari && isMobile ? 1500 : (isMobile ? 1000 : 200);
|
|
515
537
|
setTimeout(() => {
|
|
516
538
|
startSafariAnimation();
|
|
517
539
|
}, renderDelay);
|
|
@@ -538,14 +560,6 @@
|
|
|
538
560
|
// Cela évite les reflows qui causaient la saccade de l'animation
|
|
539
561
|
// Les copies héritent automatiquement des styles des images originales
|
|
540
562
|
|
|
541
|
-
// Vérifier que les images ont une taille visible
|
|
542
|
-
let imagesWithSize = 0;
|
|
543
|
-
images.forEach(img => {
|
|
544
|
-
if (img.offsetWidth > 0 && img.offsetHeight > 0) {
|
|
545
|
-
imagesWithSize++;
|
|
546
|
-
}
|
|
547
|
-
});
|
|
548
|
-
|
|
549
563
|
// Recalculer la taille après chargement des images
|
|
550
564
|
const newContentSize = isVertical ? mainBlock.offsetHeight : mainBlock.offsetWidth;
|
|
551
565
|
|
|
@@ -602,12 +616,9 @@
|
|
|
602
616
|
}
|
|
603
617
|
|
|
604
618
|
// Fonction d'animation Safari optimisée
|
|
605
|
-
let frameCount = 0;
|
|
606
619
|
let lastTime = performance.now();
|
|
607
620
|
const animate = (currentTime) => {
|
|
608
621
|
if (!isPaused) {
|
|
609
|
-
frameCount++;
|
|
610
|
-
|
|
611
622
|
// OPTIMISATION SAFARI MOBILE : Utiliser le temps réel pour une animation plus fluide
|
|
612
623
|
const deltaTime = isSafari && isMobile ? (currentTime - lastTime) / 16.67 : 1;
|
|
613
624
|
lastTime = currentTime;
|