@bebranded/bb-contents 1.0.112 → 1.0.113
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 +80 -27
- 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.113
|
|
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.113');
|
|
36
36
|
|
|
37
37
|
// Configuration
|
|
38
38
|
const config = {
|
|
39
|
-
version: '1.0.
|
|
39
|
+
version: '1.0.113',
|
|
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)
|
|
@@ -409,28 +409,53 @@
|
|
|
409
409
|
const originalHeight = img.style.height;
|
|
410
410
|
|
|
411
411
|
img.onload = () => {
|
|
412
|
-
// SOLUTION MOBILE SAFARI : Pour les SVG sur mobile,
|
|
413
|
-
if (isSVG && isMobile) {
|
|
414
|
-
//
|
|
415
|
-
|
|
412
|
+
// SOLUTION MOBILE SAFARI : Pour les SVG sur mobile Safari, approche différente
|
|
413
|
+
if (isSVG && isMobile && isSafari) {
|
|
414
|
+
// SUR SAFARI MOBILE : Ne PAS utiliser object-fit qui cause du flou
|
|
415
|
+
// Utiliser des dimensions fixes et laisser le SVG se dimensionner naturellement
|
|
416
|
+
img.style.objectFit = 'none';
|
|
416
417
|
img.style.objectPosition = 'center';
|
|
417
418
|
|
|
418
|
-
//
|
|
419
|
+
// Forcer les dimensions du conteneur parent pour contraindre le SVG
|
|
420
|
+
const parent = img.parentElement;
|
|
421
|
+
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
|
+
parent.style.display = 'flex';
|
|
432
|
+
parent.style.alignItems = 'center';
|
|
433
|
+
parent.style.justifyContent = 'center';
|
|
434
|
+
parent.style.overflow = 'hidden';
|
|
435
|
+
parent.style.boxSizing = 'border-box';
|
|
436
|
+
|
|
437
|
+
// Forcer le SVG à prendre la taille du parent sans object-fit
|
|
438
|
+
img.style.width = '100%';
|
|
439
|
+
img.style.height = '100%';
|
|
440
|
+
img.style.maxWidth = '100%';
|
|
441
|
+
img.style.maxHeight = '100%';
|
|
442
|
+
img.style.boxSizing = 'border-box';
|
|
443
|
+
}
|
|
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
|
+
} else if (isSVG && isMobile) {
|
|
450
|
+
// Pour Chrome mobile, utiliser contain normalement
|
|
451
|
+
img.style.objectFit = 'contain';
|
|
452
|
+
img.style.objectPosition = 'center';
|
|
419
453
|
img.style.maxWidth = '100%';
|
|
420
454
|
img.style.maxHeight = '100%';
|
|
421
455
|
img.style.width = '100%';
|
|
422
456
|
img.style.height = '100%';
|
|
423
457
|
img.style.boxSizing = 'border-box';
|
|
424
458
|
|
|
425
|
-
// Forcer le GPU rendering
|
|
426
|
-
img.style.webkitTransform = 'translate3d(0, 0, 0)';
|
|
427
|
-
img.style.transform = 'translate3d(0, 0, 0)';
|
|
428
|
-
|
|
429
|
-
// Améliorer le rendu des SVG
|
|
430
|
-
img.style.imageRendering = 'crisp-edges';
|
|
431
|
-
|
|
432
|
-
// S'assurer que le conteneur parent permet au SVG de s'afficher correctement
|
|
433
|
-
// et empêche le débordement avec overflow hidden
|
|
434
459
|
const parent = img.parentElement;
|
|
435
460
|
if (parent) {
|
|
436
461
|
parent.style.display = 'flex';
|
|
@@ -466,6 +491,8 @@
|
|
|
466
491
|
|
|
467
492
|
// SOLUTION SAFARI MOBILE SIMPLE : Attendre plus longtemps
|
|
468
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);
|
|
469
496
|
|
|
470
497
|
// Timeout plus long sur mobile pour laisser le temps aux images de se charger
|
|
471
498
|
const maxWaitTime = isMobile ? 5000 : 3000; // 5 secondes sur mobile
|
|
@@ -541,6 +568,13 @@
|
|
|
541
568
|
const step = (parseFloat(speed) * (isVertical ? 1.5 : 0.8)) / 60;
|
|
542
569
|
let isPaused = false;
|
|
543
570
|
|
|
571
|
+
// OPTIMISATION SAFARI MOBILE : Ajouter will-change pour améliorer la fluidité
|
|
572
|
+
if (isSafari && isMobile) {
|
|
573
|
+
scrollContainer.style.willChange = 'transform';
|
|
574
|
+
scrollContainer.style.webkitBackfaceVisibility = 'hidden';
|
|
575
|
+
scrollContainer.style.backfaceVisibility = 'hidden';
|
|
576
|
+
}
|
|
577
|
+
|
|
544
578
|
// Ajuster la taille du conteneur
|
|
545
579
|
if (isVertical && !useAutoHeight) {
|
|
546
580
|
scrollContainer.style.height = totalSize + 'px';
|
|
@@ -561,27 +595,35 @@
|
|
|
561
595
|
? `translate3d(0, ${currentPosition}px, 0)`
|
|
562
596
|
: `translate3d(${currentPosition}px, 0, 0)`;
|
|
563
597
|
scrollContainer.style.transform = initialTransform;
|
|
598
|
+
|
|
599
|
+
// OPTIMISATION SAFARI MOBILE : Forcer un reflow avant de démarrer l'animation
|
|
600
|
+
if (isSafari && isMobile) {
|
|
601
|
+
void scrollContainer.offsetHeight;
|
|
602
|
+
}
|
|
564
603
|
|
|
565
|
-
// Fonction d'animation Safari
|
|
604
|
+
// Fonction d'animation Safari optimisée
|
|
566
605
|
let frameCount = 0;
|
|
567
|
-
|
|
606
|
+
let lastTime = performance.now();
|
|
607
|
+
const animate = (currentTime) => {
|
|
568
608
|
if (!isPaused) {
|
|
569
609
|
frameCount++;
|
|
570
610
|
|
|
611
|
+
// OPTIMISATION SAFARI MOBILE : Utiliser le temps réel pour une animation plus fluide
|
|
612
|
+
const deltaTime = isSafari && isMobile ? (currentTime - lastTime) / 16.67 : 1;
|
|
613
|
+
lastTime = currentTime;
|
|
614
|
+
|
|
571
615
|
if (direction === (isVertical ? 'bottom' : 'right')) {
|
|
572
|
-
currentPosition += step;
|
|
616
|
+
currentPosition += step * deltaTime;
|
|
573
617
|
if (currentPosition >= 0) {
|
|
574
618
|
currentPosition = -(finalContentSize + gapSize);
|
|
575
619
|
}
|
|
576
620
|
} else {
|
|
577
|
-
currentPosition -= step;
|
|
621
|
+
currentPosition -= step * deltaTime;
|
|
578
622
|
if (currentPosition <= -(2 * (finalContentSize + gapSize))) {
|
|
579
623
|
currentPosition = -(finalContentSize + gapSize);
|
|
580
624
|
}
|
|
581
625
|
}
|
|
582
626
|
|
|
583
|
-
// Animation continue
|
|
584
|
-
|
|
585
627
|
// ARRONDI pour éviter les erreurs de précision JavaScript
|
|
586
628
|
currentPosition = Math.round(currentPosition * 100) / 100;
|
|
587
629
|
|
|
@@ -594,10 +636,21 @@
|
|
|
594
636
|
requestAnimationFrame(animate);
|
|
595
637
|
};
|
|
596
638
|
|
|
597
|
-
// Démarrer l'animation avec un
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
639
|
+
// Démarrer l'animation avec un délai adapté pour Safari
|
|
640
|
+
if (isSafari && isMobile) {
|
|
641
|
+
// Safari mobile : attendre un peu plus pour que tout soit prêt
|
|
642
|
+
requestAnimationFrame(() => {
|
|
643
|
+
requestAnimationFrame(() => {
|
|
644
|
+
lastTime = performance.now();
|
|
645
|
+
animate(lastTime);
|
|
646
|
+
});
|
|
647
|
+
});
|
|
648
|
+
} else {
|
|
649
|
+
setTimeout(() => {
|
|
650
|
+
lastTime = performance.now();
|
|
651
|
+
animate(lastTime);
|
|
652
|
+
}, 50);
|
|
653
|
+
}
|
|
601
654
|
|
|
602
655
|
// Pause au survol pour Safari
|
|
603
656
|
if (element.getAttribute('bb-marquee-pause') === 'true') {
|