@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.
Files changed (2) hide show
  1. package/bb-contents.js +60 -49
  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.113
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.113');
35
+ console.log('bb-contents | v1.0.115');
36
36
 
37
37
  // Configuration
38
38
  const config = {
39
- version: '1.0.113',
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, approche différente
416
+ // SOLUTION MOBILE SAFARI : Pour les SVG sur mobile Safari, utiliser contain avec optimisations
413
417
  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';
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
- // Forcer les dimensions du conteneur parent pour contraindre le SVG
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
- // 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';
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 (ou s'il n'y a pas d'images, attendre un minimum)
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 || waitTimeout >= maxWaitTime) {
512
- // Toutes les images sont chargées OU timeout atteint
513
- // Attendre plus longtemps sur mobile pour le rendu visuel
514
- const renderDelay = isMobile ? 1000 : 200;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bebranded/bb-contents",
3
- "version": "1.0.113",
3
+ "version": "1.0.115",
4
4
  "description": "Contenus additionnels français pour Webflow",
5
5
  "main": "bb-contents.js",
6
6
  "scripts": {