@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.
Files changed (2) hide show
  1. package/bb-contents.js +80 -27
  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.112
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.112');
35
+ console.log('bb-contents | v1.0.113');
36
36
 
37
37
  // Configuration
38
38
  const config = {
39
- version: '1.0.112',
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, appliquer les styles AVANT le clonage
413
- if (isSVG && isMobile) {
414
- // Utiliser contain pour éviter le débordement
415
- img.style.objectFit = 'contain';
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
- // Ajouter des contraintes pour empêcher le débordement et forcer la taille
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 avec debug des resets
604
+ // Fonction d'animation Safari optimisée
566
605
  let frameCount = 0;
567
- const animate = () => {
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 petit délai pour Safari
598
- setTimeout(() => {
599
- animate();
600
- }, 50);
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') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bebranded/bb-contents",
3
- "version": "1.0.112",
3
+ "version": "1.0.113",
4
4
  "description": "Contenus additionnels français pour Webflow",
5
5
  "main": "bb-contents.js",
6
6
  "scripts": {