<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Brian Mura</title>
	<atom:link href="https://brianmura.fr/feed/" rel="self" type="application/rss+xml" />
	<link>https://brianmura.fr</link>
	<description></description>
	<lastBuildDate>Sun, 19 Jul 2026 15:49:33 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://brianmura.fr/wp-content/uploads/2024/12/cropped-courtesy-logo-32x32.jpg</url>
	<title>Brian Mura</title>
	<link>https://brianmura.fr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Au beurre</title>
		<link>https://brianmura.fr/video/au-beurre/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 08:57:12 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Au beurre]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=20271</guid>

					<description><![CDATA[Beurre &#124; corps &#124; 2005.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="20271" class="elementor elementor-20271">
				<div class="elementor-element elementor-element-722daef e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="722daef" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-1862921 elementor-widget elementor-widget-html" data-id="1862921" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="beurre-viewer" class="serie-viewer">

  <aside id="beurre-caption" class="serie-caption">

    <div class="serie-title">Au beurre</div>

          <div class="serie-meta">
                  <span>- Beurre</span>
                  <span>- Corps</span>
                  <span>- 2005</span>
              </div>
    
	
    
  </aside>


<div id="beurre-stage" class="serie-stage">

  
          <img decoding="async"
        id="beurre-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2026/07/beurre-2.jpg"
        alt="Au beurre — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 3</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="beurre-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/07/beurre-2.jpg"
        alt="Au beurre — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/07/beurre.jpg"
        alt="Au beurre — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/07/beurre-3.jpg"
        alt="Au beurre — 3"
        class="serie-mobile-img"
        data-index="2"
      >
      </div>

<!-- Lightbox mobile -->
<div id="beurre-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'beurre';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/07\/beurre-2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/07\/beurre.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/07\/beurre-3.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Au beurre — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Au beurre — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Continents</title>
		<link>https://brianmura.fr/dessin-peinture/continents/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 17:31:08 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=20088</guid>

					<description><![CDATA[Tables de ping-pong délaissées &#124; dessinées au marteau &#124; 2012.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="20088" class="elementor elementor-20088">
				<div class="elementor-element elementor-element-81e6de7 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="81e6de7" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-5589016 elementor-widget elementor-widget-html" data-id="5589016" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="continents-viewer" class="serie-viewer">

  <aside id="continents-caption" class="serie-caption">

    <div class="serie-title">Continents</div>

          <div class="serie-meta">
                  <span>- Tables de ping-pong délaissées, dessinées au marteau</span>
                  <span>- 2012</span>
              </div>
    
	
    
  </aside>


<div id="continents-stage" class="serie-stage">

  
          <img decoding="async"
        id="continents-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2026/dessins/continents.jpg"
        alt="Continents — 1"
      >
    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="continents-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/dessins/continents.jpg"
        alt="Continents — 1"
        class="serie-mobile-img"
        data-index="0"
      >
      </div>

<!-- Lightbox mobile -->
<div id="continents-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'continents';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/dessins\/continents.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Continents — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Continents — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les Badinages de Bains de mer</title>
		<link>https://brianmura.fr/sculpture/les-badinages-de-bains-de-mer/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Tue, 26 May 2026 06:27:12 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=18605</guid>

					<description><![CDATA[Badinages de Bains de mer &#124; pâtes de riz &#124; balais essuie-glaces &#124;
ustensiles de dégustation &#124; ~30 x 15 cm. &#124; 2026 - [...].]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="18605" class="elementor elementor-18605">
				<div class="elementor-element elementor-element-7306daf e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="7306daf" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-9a16e8f elementor-widget elementor-widget-html" data-id="9a16e8f" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="badinages-viewer" class="serie-viewer">

  <aside id="badinages-caption" class="serie-caption">

    <div class="serie-title">Badinages de bains de mer</div>

          <div class="serie-meta">
                  <span>- Pâtes de riz</span>
                  <span>- Ustensiles de dégustation</span>
                  <span>- Balais essuie glace</span>
                  <span>~ 30 x 15 cm</span>
                  <span>- 2026 - [...]</span>
              </div>
    
	      <div class="serie-description">

        			<p>Je me rappelle cueillir des algues au Vallon des Auffes en écoutant de grandes dames qui barbotaient en s'échangeant des recettes de cuisine secrètes.</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="badinages-stage" class="serie-stage">

  
          <img decoding="async"
        id="badinages-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-45.jpg"
        alt="Badinages de bains de mer — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 51</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="badinages-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-45.jpg"
        alt="Badinages de bains de mer — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-44.jpg"
        alt="Badinages de bains de mer — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-43.jpg"
        alt="Badinages de bains de mer — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-42.jpg"
        alt="Badinages de bains de mer — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-41-1.jpg"
        alt="Badinages de bains de mer — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-40-1.jpg"
        alt="Badinages de bains de mer — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-39-2.jpg"
        alt="Badinages de bains de mer — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-48-web.jpg"
        alt="Badinages de bains de mer — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/03/serp-47-web.jpg"
        alt="Badinages de bains de mer — 9"
        class="serie-mobile-img"
        data-index="8"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-38-2.jpg"
        alt="Badinages de bains de mer — 10"
        class="serie-mobile-img"
        data-index="9"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-36-1.jpg"
        alt="Badinages de bains de mer — 11"
        class="serie-mobile-img"
        data-index="10"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-41.jpg"
        alt="Badinages de bains de mer — 12"
        class="serie-mobile-img"
        data-index="11"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-40.jpg"
        alt="Badinages de bains de mer — 13"
        class="serie-mobile-img"
        data-index="12"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-39-1.jpg"
        alt="Badinages de bains de mer — 14"
        class="serie-mobile-img"
        data-index="13"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-38-1.jpg"
        alt="Badinages de bains de mer — 15"
        class="serie-mobile-img"
        data-index="14"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-37-1.jpg"
        alt="Badinages de bains de mer — 16"
        class="serie-mobile-img"
        data-index="15"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-39.jpg"
        alt="Badinages de bains de mer — 17"
        class="serie-mobile-img"
        data-index="16"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-38.jpg"
        alt="Badinages de bains de mer — 18"
        class="serie-mobile-img"
        data-index="17"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-37.jpg"
        alt="Badinages de bains de mer — 19"
        class="serie-mobile-img"
        data-index="18"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/02/serp-36.jpg"
        alt="Badinages de bains de mer — 20"
        class="serie-mobile-img"
        data-index="19"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-35.jpg"
        alt="Badinages de bains de mer — 21"
        class="serie-mobile-img"
        data-index="20"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-34.webp"
        alt="Badinages de bains de mer — 22"
        class="serie-mobile-img"
        data-index="21"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-32-scaled.webp"
        alt="Badinages de bains de mer — 23"
        class="serie-mobile-img"
        data-index="22"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-31.webp"
        alt="Badinages de bains de mer — 24"
        class="serie-mobile-img"
        data-index="23"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-30.webp"
        alt="Badinages de bains de mer — 25"
        class="serie-mobile-img"
        data-index="24"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-29.webp"
        alt="Badinages de bains de mer — 26"
        class="serie-mobile-img"
        data-index="25"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-25.webp"
        alt="Badinages de bains de mer — 27"
        class="serie-mobile-img"
        data-index="26"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-25.webp"
        alt="Badinages de bains de mer — 28"
        class="serie-mobile-img"
        data-index="27"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-26-scaled.webp"
        alt="Badinages de bains de mer — 29"
        class="serie-mobile-img"
        data-index="28"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-21.webp"
        alt="Badinages de bains de mer — 30"
        class="serie-mobile-img"
        data-index="29"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-1-web.webp"
        alt="Badinages de bains de mer — 31"
        class="serie-mobile-img"
        data-index="30"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-22.jpg"
        alt="Badinages de bains de mer — 32"
        class="serie-mobile-img"
        data-index="31"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-24.jpg"
        alt="Badinages de bains de mer — 33"
        class="serie-mobile-img"
        data-index="32"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/serp-23.jpg"
        alt="Badinages de bains de mer — 34"
        class="serie-mobile-img"
        data-index="33"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/une-dim-2.webp"
        alt="Badinages de bains de mer — 35"
        class="serie-mobile-img"
        data-index="34"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-19-1-scaled.webp"
        alt="Badinages de bains de mer — 36"
        class="serie-mobile-img"
        data-index="35"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-18-1-scaled.webp"
        alt="Badinages de bains de mer — 37"
        class="serie-mobile-img"
        data-index="36"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-17-1-scaled.webp"
        alt="Badinages de bains de mer — 38"
        class="serie-mobile-img"
        data-index="37"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-16.webp"
        alt="Badinages de bains de mer — 39"
        class="serie-mobile-img"
        data-index="38"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-14.webp"
        alt="Badinages de bains de mer — 40"
        class="serie-mobile-img"
        data-index="39"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-13.webp"
        alt="Badinages de bains de mer — 41"
        class="serie-mobile-img"
        data-index="40"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-12-web-1-scaled.webp"
        alt="Badinages de bains de mer — 42"
        class="serie-mobile-img"
        data-index="41"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-11-web-1-scaled.webp"
        alt="Badinages de bains de mer — 43"
        class="serie-mobile-img"
        data-index="42"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-10-web-1-scaled.webp"
        alt="Badinages de bains de mer — 44"
        class="serie-mobile-img"
        data-index="43"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-8-web-1-scaled.jpg"
        alt="Badinages de bains de mer — 45"
        class="serie-mobile-img"
        data-index="44"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-7-web-1-scaled.webp"
        alt="Badinages de bains de mer — 46"
        class="serie-mobile-img"
        data-index="45"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-6-web-1-scaled.webp"
        alt="Badinages de bains de mer — 47"
        class="serie-mobile-img"
        data-index="46"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-5-web-1-scaled.webp"
        alt="Badinages de bains de mer — 48"
        class="serie-mobile-img"
        data-index="47"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-4-web-1-scaled.webp"
        alt="Badinages de bains de mer — 49"
        class="serie-mobile-img"
        data-index="48"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-1-web-1.webp"
        alt="Badinages de bains de mer — 50"
        class="serie-mobile-img"
        data-index="49"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/12/serp-1-web-1.webp"
        alt="Badinages de bains de mer — 51"
        class="serie-mobile-img"
        data-index="50"
      >
      </div>

<!-- Lightbox mobile -->
<div id="badinages-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'badinages';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/03\/serp-45.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/03\/serp-44.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/03\/serp-43.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/03\/serp-42.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-41-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-40-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-39-2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/03\/serp-48-web.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/03\/serp-47-web.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-38-2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-36-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-41.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-40.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-39-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-38-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-37-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-39.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-38.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-37.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/02\/serp-36.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-35.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-34.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-32-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-31.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-30.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-29.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-25.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-25.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-26-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-21.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-1-web.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-22.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-24.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/serp-23.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/une-dim-2.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-19-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-18-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-17-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-16.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-14.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-13.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-12-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-11-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-10-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-8-web-1-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-7-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-6-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-5-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-4-web-1-scaled.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-1-web-1.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/12\/serp-1-web-1.webp"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Badinages de bains de mer — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Badinages de bains de mer — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Labyrinthe</title>
		<link>https://brianmura.fr/sculpture/labyrinthe/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 08:02:44 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=17579</guid>

					<description><![CDATA[Labyrinthe &#124; carton &#124; bois &#124; peinture &#124; 2004.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="17579" class="elementor elementor-17579">
				<div class="elementor-element elementor-element-a010d1b e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="a010d1b" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-67b5a9f elementor-widget elementor-widget-html" data-id="67b5a9f" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="labyrinthe-viewer" class="serie-viewer">

  <aside id="labyrinthe-caption" class="serie-caption">

    <div class="serie-title">Labyrinthe</div>

          <div class="serie-meta">
                  <span>- Carton</span>
                  <span>- Bois de plancher</span>
                  <span>- Peinture</span>
                  <span>- 2004</span>
              </div>
    
	      <div class="serie-description">

        			<p>J'ai d'abord cru à un gant retourné, mais au réveil, son corps était devenu cyclopéen et s'avançait vers moi.</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="labyrinthe-stage" class="serie-stage">

  
          <img decoding="async"
        id="labyrinthe-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2026/04/lab-2.webp"
        alt="Labyrinthe — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 4</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="labyrinthe-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/04/lab-2.webp"
        alt="Labyrinthe — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/04/lab-7.webp"
        alt="Labyrinthe — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/04/lab-4.webp"
        alt="Labyrinthe — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/04/lab-1.webp"
        alt="Labyrinthe — 4"
        class="serie-mobile-img"
        data-index="3"
      >
      </div>

<!-- Lightbox mobile -->
<div id="labyrinthe-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'labyrinthe';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/04\/lab-2.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/04\/lab-7.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/04\/lab-4.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/04\/lab-1.webp"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Labyrinthe — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Labyrinthe — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>La maison du pendu au Clipon</title>
		<link>https://brianmura.fr/video/la-maison-du-pendu/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 14:16:48 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=17236</guid>

					<description><![CDATA[La maison du pendu au Clipon &#124; 4.20 mn. &#124; 2006.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="17236" class="elementor elementor-17236">
				<div class="elementor-element elementor-element-5bd1b06 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="5bd1b06" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c33c425 elementor-widget elementor-widget-html" data-id="c33c425" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="maison-viewer" class="serie-viewer">

  <aside id="maison-caption" class="serie-caption">

    <div class="serie-title">La maison du pendu au Clipon</div>

          <div class="serie-meta">
                  <span>- 4.20 mn.</span>
                  <span>- 2006</span>
              </div>
    
	      <div class="serie-description">

        			<p>Inquiétant totem faisant sa vie loin de tout et de tous dans les dunes.</p>
		
		
                  <div class="serie-desc-images">
                                          <span class="serie-desc-thumb">
                  <img decoding="async" src="https://brianmura.fr/wp-content/uploads/2026/06/maison-pendu.webp" alt="la maison du pendu">
                </span>
                                    </div>
        		
					<div class="serie-desc-lightbox" aria-hidden="true">
			<button class="sdl-close" aria-label="Fermer">✕</button>
			<img decoding="async" class="sdl-img" src="" alt="">
			</div>
		
      </div>
	
    
  </aside>


<div id="maison-stage" class="serie-stage">

  
          <video
        id="maison-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2026/04/maison-pendu-ok.mp4#t=5"
        controls
        playsinline
				        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="maison-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2026/04/maison-pendu-ok.mp4#t=5"
        controls
        playsinline
				        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="maison-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'maison';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/04\/maison-pendu-ok.mp4#t=5"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'La maison du pendu au Clipon — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'La maison du pendu au Clipon — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le Vol arrêté</title>
		<link>https://brianmura.fr/video/le-vol-arrete/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 08 Apr 2026 12:57:32 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=15070</guid>

					<description><![CDATA[Le Vol arrêté &#124; oiseaux &#124; friture à la poêle &#124; boucle de 0.55 sec. &#124; 2026.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="15070" class="elementor elementor-15070">
				<div class="elementor-element elementor-element-acf8234 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="acf8234" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c6cd493 elementor-widget elementor-widget-html" data-id="c6cd493" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="vol-viewer" class="serie-viewer">

  <aside id="vol-caption" class="serie-caption">

    <div class="serie-title">Le vol arrêté (Ref Vladimir Vyssotski)</div>

          <div class="serie-meta">
                  <span>- Étourneaux</span>
                  <span>- Friture à la poêle</span>
                  <span>- Boucle de 0.54 s</span>
                  <span>- 2026</span>
              </div>
    
	      <div class="serie-description">

        			<p>Les étourneaux passent au-dessus de Marseille en novembre, lors de leur migration. Ils n'y sont pas toujours les bienvenus. Pourtant, ils sculptent le ciel.</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="vol-stage" class="serie-stage">

  
          <video
        id="vol-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2026/04/oiseaux-son-1.mp4"
        controls
        playsinline
		loop		        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="vol-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2026/04/oiseaux-son-1.mp4"
        controls
        playsinline
		loop		        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="vol-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'vol';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/04\/oiseaux-son-1.mp4","loop":true}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Le vol arrêté (Ref Vladimir Vyssotski) — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Le vol arrêté (Ref Vladimir Vyssotski) — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Longueur d&#8217;onde</title>
		<link>https://brianmura.fr/dessin-peinture/longueur-donde/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 12 Dec 2025 16:33:16 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Longueur d'onde]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=10464</guid>

					<description><![CDATA[Longueur d'onde &#124; papier A4 &#124; poudre de toner &#124;  2012.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="10464" class="elementor elementor-10464">
				<div class="elementor-element elementor-element-e32e6c8 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="e32e6c8" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-2b1508b elementor-widget elementor-widget-html" data-id="2b1508b" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="longueur-viewer" class="serie-viewer">

  <aside id="longueur-caption" class="serie-caption">

    <div class="serie-title">Longueur d&#039;onde</div>

          <div class="serie-meta">
                  <span>Papier A4</span>
                  <span>Poude de toner</span>
                  <span>2012</span>
              </div>
    
	
    
  </aside>


<div id="longueur-stage" class="serie-stage">

  
          <img decoding="async"
        id="longueur-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/onde-3.jpg"
        alt="Longueur d&#039;onde — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 3</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="longueur-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/onde-3.jpg"
        alt="Longueur d&#039;onde — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/onde-une.jpg"
        alt="Longueur d&#039;onde — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/onde-2.jpg"
        alt="Longueur d&#039;onde — 3"
        class="serie-mobile-img"
        data-index="2"
      >
      </div>

<!-- Lightbox mobile -->
<div id="longueur-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'longueur';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/onde-3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/onde-une.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/onde-2.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Longueur d\'onde — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Longueur d\'onde — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>La Bataille</title>
		<link>https://brianmura.fr/dessin-peinture/la-bataille/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sun, 30 Nov 2025 15:25:29 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[La Bataille]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=10162</guid>

					<description><![CDATA[La Bataille &#124; papier &#124; craies grasses &#124; 2021.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="10162" class="elementor elementor-10162">
				<div class="elementor-element elementor-element-f0aa26d e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="f0aa26d" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-4471454 elementor-widget elementor-widget-html" data-id="4471454" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="bataille-viewer" class="serie-viewer">

  <aside id="bataille-caption" class="serie-caption">

    <div class="serie-title">La Bataille</div>

          <div class="serie-meta">
                  <span>- Papier</span>
                  <span>- Craies grasses</span>
                  <span>- 2021</span>
              </div>
    
	      <div class="serie-description">

        			<p>Une fois la porte ouverte, un entêtant bruit confus s'échappa de la chambre.</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="bataille-stage" class="serie-stage">

  
          <img decoding="async"
        id="bataille-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-2.jpg"
        alt="La Bataille — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 18</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="bataille-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-2.jpg"
        alt="La Bataille — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-4.jpg"
        alt="La Bataille — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-5.jpg"
        alt="La Bataille — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-6-scaled.jpg"
        alt="La Bataille — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-7.jpg"
        alt="La Bataille — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-8.jpg"
        alt="La Bataille — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-8.jpg"
        alt="La Bataille — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-9.jpg"
        alt="La Bataille — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-10.jpg"
        alt="La Bataille — 9"
        class="serie-mobile-img"
        data-index="8"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-11.jpg"
        alt="La Bataille — 10"
        class="serie-mobile-img"
        data-index="9"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-12.jpg"
        alt="La Bataille — 11"
        class="serie-mobile-img"
        data-index="10"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-12.jpg"
        alt="La Bataille — 12"
        class="serie-mobile-img"
        data-index="11"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-13.jpg"
        alt="La Bataille — 13"
        class="serie-mobile-img"
        data-index="12"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-14.jpg"
        alt="La Bataille — 14"
        class="serie-mobile-img"
        data-index="13"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-15-scaled.jpg"
        alt="La Bataille — 15"
        class="serie-mobile-img"
        data-index="14"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-16.jpg"
        alt="La Bataille — 16"
        class="serie-mobile-img"
        data-index="15"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-17.jpg"
        alt="La Bataille — 17"
        class="serie-mobile-img"
        data-index="16"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/b-18.jpg"
        alt="La Bataille — 18"
        class="serie-mobile-img"
        data-index="17"
      >
      </div>

<!-- Lightbox mobile -->
<div id="bataille-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'bataille';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-4.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-5.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-6-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-7.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-8.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-8.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-9.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-10.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-11.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-12.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-12.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-13.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-14.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-15-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-16.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-17.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/b-18.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'La Bataille — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'La Bataille — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le Bourdon d&#8217;un fil infini</title>
		<link>https://brianmura.fr/video/le-bourdon-dun-fil-infini/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Mon, 17 Nov 2025 14:13:55 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Le Bourdon d'un fil infini]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=8849</guid>

					<description><![CDATA[Le Bourdon d'un fil infini &#124; relieuse &#124; mouche &#124; 21 sec. en boucle &#124; 2026.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8849" class="elementor elementor-8849" data-elementor-settings="{&quot;ekit_onepagescroll&quot;:&quot;block&quot;}">
				<div class="elementor-element elementor-element-6fb1ff7 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="6fb1ff7" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-8315ed9 elementor-widget elementor-widget-html" data-id="8315ed9" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="bourdon-viewer" class="serie-viewer">

  <aside id="bourdon-caption" class="serie-caption">

    <div class="serie-title">Le bourdon d&#039;un fil infini</div>

          <div class="serie-meta">
                  <span>- Fil à relier dimprimerie</span>
                  <span>Mouche</span>
                  <span>- Boucle de 0.21 s</span>
                  <span>- 2026</span>
              </div>
    
	
    
  </aside>


<div id="bourdon-stage" class="serie-stage">

  
          <video
        id="bourdon-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2025/11/couture-montage-cut-one.mp4"
        controls
        playsinline
		loop		        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="bourdon-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2025/11/couture-montage-cut-one.mp4"
        controls
        playsinline
		loop		        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="bourdon-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'bourdon';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/couture-montage-cut-one.mp4","loop":true}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Le bourdon d\'un fil infini — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Le bourdon d\'un fil infini — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Jusqu&#8217;au bout des ondes</title>
		<link>https://brianmura.fr/sculpture/jusqu-au-bout-des-ondes/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 14 Nov 2025 14:37:08 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<category><![CDATA[Jusqu'au bout des ondes]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=8764</guid>

					<description><![CDATA[Jusqu'au bout des ondes &#124; fils &#124; plâtre &#124; carton &#124; peinture &#124; textiles &#124; dimensions variables &#124; 2023 - [...].]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8764" class="elementor elementor-8764">
				<div class="elementor-element elementor-element-2d58240 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="2d58240" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-88392ed elementor-widget elementor-widget-html" data-id="88392ed" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="ondes-viewer" class="serie-viewer">

  <aside id="ondes-caption" class="serie-caption">

    <div class="serie-title">Jusqu&#039;au bout des ondes</div>

          <div class="serie-meta">
                  <span>- Carton à tissus</span>
                  <span>- Fils de stores vénitiens</span>
                  <span>- Plâtre</span>
                  <span>- Peinture</span>
                  <span>Agraffes</span>
                  <span>- Clous</span>
                  <span>- Punaises</span>
                  <span>- Dimensions variables</span>
                  <span>- 2023 - [...]</span>
              </div>
    
	
    
  </aside>


<div id="ondes-stage" class="serie-stage">

  
          <img decoding="async"
        id="ondes-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2026/01/12.jpg"
        alt="Jusqu&#039;au bout des ondes — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 18</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="ondes-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/12.jpg"
        alt="Jusqu&#039;au bout des ondes — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-2.webp"
        alt="Jusqu&#039;au bout des ondes — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-3.webp"
        alt="Jusqu&#039;au bout des ondes — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-4.webp"
        alt="Jusqu&#039;au bout des ondes — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-5.webp"
        alt="Jusqu&#039;au bout des ondes — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-6.webp"
        alt="Jusqu&#039;au bout des ondes — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-7.webp"
        alt="Jusqu&#039;au bout des ondes — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-8.webp"
        alt="Jusqu&#039;au bout des ondes — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/re-9.webp"
        alt="Jusqu&#039;au bout des ondes — 9"
        class="serie-mobile-img"
        data-index="8"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/16.webp"
        alt="Jusqu&#039;au bout des ondes — 10"
        class="serie-mobile-img"
        data-index="9"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/18.webp"
        alt="Jusqu&#039;au bout des ondes — 11"
        class="serie-mobile-img"
        data-index="10"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/19.webp"
        alt="Jusqu&#039;au bout des ondes — 12"
        class="serie-mobile-img"
        data-index="11"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/11.jpg"
        alt="Jusqu&#039;au bout des ondes — 13"
        class="serie-mobile-img"
        data-index="12"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/13.jpg"
        alt="Jusqu&#039;au bout des ondes — 14"
        class="serie-mobile-img"
        data-index="13"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/14.jpg"
        alt="Jusqu&#039;au bout des ondes — 15"
        class="serie-mobile-img"
        data-index="14"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/15.jpg"
        alt="Jusqu&#039;au bout des ondes — 16"
        class="serie-mobile-img"
        data-index="15"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/17.jpg"
        alt="Jusqu&#039;au bout des ondes — 17"
        class="serie-mobile-img"
        data-index="16"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2026/01/20.jpg"
        alt="Jusqu&#039;au bout des ondes — 18"
        class="serie-mobile-img"
        data-index="17"
      >
      </div>

<!-- Lightbox mobile -->
<div id="ondes-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'ondes';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/12.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-2.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-3.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-4.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-5.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-6.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-7.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-8.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/re-9.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/16.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/18.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/19.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/11.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/13.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/14.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/15.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/17.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2026\/01\/20.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Jusqu\'au bout des ondes — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Jusqu\'au bout des ondes — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Piments en marécage</title>
		<link>https://brianmura.fr/video/piments-en-marecage/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 14 Nov 2025 09:15:30 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Piments en marécage]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=8668</guid>

					<description><![CDATA[Piments en marécage &#124; tchoutchouka  &#124; grenouilles &#124; boucle de 30 sec. &#124; 2023.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8668" class="elementor elementor-8668">
				<div class="elementor-element elementor-element-cce8063 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="cce8063" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-59ce5e2 elementor-widget elementor-widget-html" data-id="59ce5e2" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="piments-viewer" class="serie-viewer">

  <aside id="piments-caption" class="serie-caption">

    <div class="serie-title">Piments en marécage</div>

          <div class="serie-meta">
                  <span>- Chakchouka</span>
                  <span>- Grenouilles</span>
                  <span>- Boucle de 33 s</span>
                  <span>- 2025</span>
              </div>
    
	
    
  </aside>


<div id="piments-stage" class="serie-stage">

  
          <video
        id="piments-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2025/08/piment-marecage.mp4"
        controls
        playsinline
		loop		        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="piments-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2025/08/piment-marecage.mp4"
        controls
        playsinline
		loop		        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="piments-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'piments';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/piment-marecage.mp4","loop":true}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Piments en marécage — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Piments en marécage — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le ressac des souvenirs</title>
		<link>https://brianmura.fr/video/le-ressac-des-souvenirs/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 07 Nov 2025 15:42:04 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Le ressac des souvenirs]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=8480</guid>

					<description><![CDATA[Le Ressac des souvenirs &#124; presse typographique &#124; cliquetis de bouteilles &#124; 4 sec. en boucle &#124; 2026.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8480" class="elementor elementor-8480">
				<div class="elementor-element elementor-element-b420231 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="b420231" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-78e6249 elementor-widget elementor-widget-html" data-id="78e6249" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="ressac-viewer" class="serie-viewer">

  <aside id="ressac-caption" class="serie-caption">

    <div class="serie-title">Le ressac des souvenirs</div>

          <div class="serie-meta">
                  <span>- Presse typhographique</span>
                  <span>- Cliquetis de bouteilles</span>
                  <span>- Boucle de 3 s</span>
                  <span>- 2026</span>
              </div>
    
	
    
  </aside>


<div id="ressac-stage" class="serie-stage">

  
          <video
        id="ressac-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2025/11/typo-son.mp4"
        controls
        playsinline
		loop		        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="ressac-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2025/11/typo-son.mp4"
        controls
        playsinline
		loop		        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="ressac-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'ressac';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/typo-son.mp4","loop":true}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Le ressac des souvenirs — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Le ressac des souvenirs — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Marseille à la volée</title>
		<link>https://brianmura.fr/video/marseille-a-la-volee/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Mon, 27 Oct 2025 09:04:24 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Marseille à la volée]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7992</guid>

					<description><![CDATA[Marseille à la volée &#124; instantanés &#124; 2024-2025.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7992" class="elementor elementor-7992">
				<div class="elementor-element elementor-element-423875f e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="423875f" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6bc3255 elementor-widget elementor-widget-html" data-id="6bc3255" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="marseille-viewer" class="serie-viewer">

  <aside id="marseille-caption" class="serie-caption">

    <div class="serie-title">Marseille à la volée</div>

          <div class="serie-meta">
                  <span>- Instantanés</span>
                  <span>- 2024 | 2025</span>
                  <span>- Marseille</span>
              </div>
    
	      <div class="serie-description">

        			<p>Parcourir à loisir ce jardin aux magnifiques formes, aux parfums parfois tordus, sans lesquels je ne serais pas là.</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="marseille-stage" class="serie-stage">

  
          <img decoding="async"
        id="marseille-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD.jpg"
        alt="Marseille à la volée — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 83</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="marseille-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD.jpg"
        alt="Marseille à la volée — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD2.jpg"
        alt="Marseille à la volée — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD3.jpg"
        alt="Marseille à la volée — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD4.jpg"
        alt="Marseille à la volée — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD5.jpg"
        alt="Marseille à la volée — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD6.jpg"
        alt="Marseille à la volée — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD9.jpg"
        alt="Marseille à la volée — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD41.jpg"
        alt="Marseille à la volée — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD40.jpg"
        alt="Marseille à la volée — 9"
        class="serie-mobile-img"
        data-index="8"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD39.jpg"
        alt="Marseille à la volée — 10"
        class="serie-mobile-img"
        data-index="9"
      >
                <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/themes/Brian/templates/sons/visages.mp4"
        controls
        playsinline
				        style="width:100%; height:auto; display:block;"
      ></video>
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD38.jpg"
        alt="Marseille à la volée — 12"
        class="serie-mobile-img"
        data-index="11"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD37.jpg"
        alt="Marseille à la volée — 13"
        class="serie-mobile-img"
        data-index="12"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD36.jpg"
        alt="Marseille à la volée — 14"
        class="serie-mobile-img"
        data-index="13"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD35.jpg"
        alt="Marseille à la volée — 15"
        class="serie-mobile-img"
        data-index="14"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD34.jpg"
        alt="Marseille à la volée — 16"
        class="serie-mobile-img"
        data-index="15"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD33.jpg"
        alt="Marseille à la volée — 17"
        class="serie-mobile-img"
        data-index="16"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD32.jpg"
        alt="Marseille à la volée — 18"
        class="serie-mobile-img"
        data-index="17"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD31.jpg"
        alt="Marseille à la volée — 19"
        class="serie-mobile-img"
        data-index="18"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD30.jpg"
        alt="Marseille à la volée — 20"
        class="serie-mobile-img"
        data-index="19"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD29.jpg"
        alt="Marseille à la volée — 21"
        class="serie-mobile-img"
        data-index="20"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD28.jpg"
        alt="Marseille à la volée — 22"
        class="serie-mobile-img"
        data-index="21"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD27.jpg"
        alt="Marseille à la volée — 23"
        class="serie-mobile-img"
        data-index="22"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD26.jpg"
        alt="Marseille à la volée — 24"
        class="serie-mobile-img"
        data-index="23"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD25.jpg"
        alt="Marseille à la volée — 25"
        class="serie-mobile-img"
        data-index="24"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD24.jpg"
        alt="Marseille à la volée — 26"
        class="serie-mobile-img"
        data-index="25"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD23.jpg"
        alt="Marseille à la volée — 27"
        class="serie-mobile-img"
        data-index="26"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD22.jpg"
        alt="Marseille à la volée — 28"
        class="serie-mobile-img"
        data-index="27"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD21.jpg"
        alt="Marseille à la volée — 29"
        class="serie-mobile-img"
        data-index="28"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD20.jpg"
        alt="Marseille à la volée — 30"
        class="serie-mobile-img"
        data-index="29"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD19.jpg"
        alt="Marseille à la volée — 31"
        class="serie-mobile-img"
        data-index="30"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD18.jpg"
        alt="Marseille à la volée — 32"
        class="serie-mobile-img"
        data-index="31"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD17.jpg"
        alt="Marseille à la volée — 33"
        class="serie-mobile-img"
        data-index="32"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD16.jpg"
        alt="Marseille à la volée — 34"
        class="serie-mobile-img"
        data-index="33"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD15.jpg"
        alt="Marseille à la volée — 35"
        class="serie-mobile-img"
        data-index="34"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD14.jpg"
        alt="Marseille à la volée — 36"
        class="serie-mobile-img"
        data-index="35"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD13.jpg"
        alt="Marseille à la volée — 37"
        class="serie-mobile-img"
        data-index="36"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD11.jpg"
        alt="Marseille à la volée — 38"
        class="serie-mobile-img"
        data-index="37"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD12.jpg"
        alt="Marseille à la volée — 39"
        class="serie-mobile-img"
        data-index="38"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD10.jpg"
        alt="Marseille à la volée — 40"
        class="serie-mobile-img"
        data-index="39"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD8.jpg"
        alt="Marseille à la volée — 41"
        class="serie-mobile-img"
        data-index="40"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD7.jpg"
        alt="Marseille à la volée — 42"
        class="serie-mobile-img"
        data-index="41"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD72.jpg"
        alt="Marseille à la volée — 43"
        class="serie-mobile-img"
        data-index="42"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD71.jpg"
        alt="Marseille à la volée — 44"
        class="serie-mobile-img"
        data-index="43"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/70.jpg"
        alt="Marseille à la volée — 45"
        class="serie-mobile-img"
        data-index="44"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD69.jpg"
        alt="Marseille à la volée — 46"
        class="serie-mobile-img"
        data-index="45"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD68.jpg"
        alt="Marseille à la volée — 47"
        class="serie-mobile-img"
        data-index="46"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD44.jpg"
        alt="Marseille à la volée — 48"
        class="serie-mobile-img"
        data-index="47"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD60.jpg"
        alt="Marseille à la volée — 49"
        class="serie-mobile-img"
        data-index="48"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/65.jpg"
        alt="Marseille à la volée — 50"
        class="serie-mobile-img"
        data-index="49"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/78-1.jpg"
        alt="Marseille à la volée — 51"
        class="serie-mobile-img"
        data-index="50"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/79-1.jpg"
        alt="Marseille à la volée — 52"
        class="serie-mobile-img"
        data-index="51"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD66.jpg"
        alt="Marseille à la volée — 53"
        class="serie-mobile-img"
        data-index="52"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD65.jpg"
        alt="Marseille à la volée — 54"
        class="serie-mobile-img"
        data-index="53"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD64.jpg"
        alt="Marseille à la volée — 55"
        class="serie-mobile-img"
        data-index="54"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD63.jpg"
        alt="Marseille à la volée — 56"
        class="serie-mobile-img"
        data-index="55"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD62.jpg"
        alt="Marseille à la volée — 57"
        class="serie-mobile-img"
        data-index="56"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD59.jpg"
        alt="Marseille à la volée — 58"
        class="serie-mobile-img"
        data-index="57"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD61.jpg"
        alt="Marseille à la volée — 59"
        class="serie-mobile-img"
        data-index="58"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD58.jpg"
        alt="Marseille à la volée — 60"
        class="serie-mobile-img"
        data-index="59"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD73.jpg"
        alt="Marseille à la volée — 61"
        class="serie-mobile-img"
        data-index="60"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD57.jpg"
        alt="Marseille à la volée — 62"
        class="serie-mobile-img"
        data-index="61"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD56.jpg"
        alt="Marseille à la volée — 63"
        class="serie-mobile-img"
        data-index="62"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD55.jpg"
        alt="Marseille à la volée — 64"
        class="serie-mobile-img"
        data-index="63"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD54.jpg"
        alt="Marseille à la volée — 65"
        class="serie-mobile-img"
        data-index="64"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD53.jpg"
        alt="Marseille à la volée — 66"
        class="serie-mobile-img"
        data-index="65"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD52.jpg"
        alt="Marseille à la volée — 67"
        class="serie-mobile-img"
        data-index="66"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD51.jpg"
        alt="Marseille à la volée — 68"
        class="serie-mobile-img"
        data-index="67"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD50.jpg"
        alt="Marseille à la volée — 69"
        class="serie-mobile-img"
        data-index="68"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD49.jpg"
        alt="Marseille à la volée — 70"
        class="serie-mobile-img"
        data-index="69"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/74-1.jpg"
        alt="Marseille à la volée — 71"
        class="serie-mobile-img"
        data-index="70"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD48.jpg"
        alt="Marseille à la volée — 72"
        class="serie-mobile-img"
        data-index="71"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD47.jpg"
        alt="Marseille à la volée — 73"
        class="serie-mobile-img"
        data-index="72"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD46.jpg"
        alt="Marseille à la volée — 74"
        class="serie-mobile-img"
        data-index="73"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD45.jpg"
        alt="Marseille à la volée — 75"
        class="serie-mobile-img"
        data-index="74"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/73-bis.jpg"
        alt="Marseille à la volée — 76"
        class="serie-mobile-img"
        data-index="75"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/74.webp"
        alt="Marseille à la volée — 77"
        class="serie-mobile-img"
        data-index="76"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD43.jpg"
        alt="Marseille à la volée — 78"
        class="serie-mobile-img"
        data-index="77"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/81.jpg"
        alt="Marseille à la volée — 79"
        class="serie-mobile-img"
        data-index="78"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD42.jpg"
        alt="Marseille à la volée — 80"
        class="serie-mobile-img"
        data-index="79"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/74.jpg"
        alt="Marseille à la volée — 81"
        class="serie-mobile-img"
        data-index="80"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/76.jpg"
        alt="Marseille à la volée — 82"
        class="serie-mobile-img"
        data-index="81"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/03-11-2025-BD74.jpg"
        alt="Marseille à la volée — 83"
        class="serie-mobile-img"
        data-index="82"
      >
      </div>

<!-- Lightbox mobile -->
<div id="marseille-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'marseille';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD4.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD5.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD6.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD9.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD41.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD40.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD39.jpg"},{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/themes\/Brian\/templates\/sons\/visages.mp4","loop":true},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD38.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD37.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD36.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD35.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD34.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD33.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD32.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD31.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD30.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD29.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD28.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD27.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD26.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD25.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD24.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD23.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD22.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD21.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD20.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD19.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD18.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD17.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD16.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD15.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD14.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD13.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD11.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD12.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD10.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD8.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD7.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD72.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD71.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/70.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD69.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD68.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD44.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD60.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/65.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/78-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/79-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD66.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD65.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD64.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD63.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD62.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD59.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD61.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD58.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD73.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD57.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD56.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD55.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD54.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD53.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD52.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD51.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD50.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD49.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/74-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD48.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD47.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD46.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD45.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/73-bis.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/74.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD43.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/81.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD42.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/74.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/76.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/03-11-2025-BD74.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Marseille à la volée — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Marseille à la volée — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Myosotis</title>
		<link>https://brianmura.fr/sculpture/myosotis/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Thu, 28 Aug 2025 12:29:12 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<category><![CDATA[Myosotis]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7946</guid>

					<description><![CDATA[Myosotis &#124; bâche en tissu &#124; cheveux synthétiques &#124; 450 x 70 cm. &#124; 2023 - [...].]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7946" class="elementor elementor-7946">
				<div class="elementor-element elementor-element-2246e06 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="2246e06" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-8e98ea3 elementor-widget elementor-widget-html" data-id="8e98ea3" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="myosotis-viewer" class="serie-viewer">

  <aside id="myosotis-caption" class="serie-caption">

    <div class="serie-title">Myosotis</div>

          <div class="serie-meta">
                  <span>- Bâche en tissu</span>
                  <span>- Cheveux synthétiques</span>
                  <span>- 450 x 70 cm.</span>
                  <span>- 2023 - [...]</span>
              </div>
    
	
    
  </aside>


<div id="myosotis-stage" class="serie-stage">

  
          <img decoding="async"
        id="myosotis-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/c-6-1.jpg"
        alt="Myosotis — 1"
      >
    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="myosotis-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/c-6-1.jpg"
        alt="Myosotis — 1"
        class="serie-mobile-img"
        data-index="0"
      >
      </div>

<!-- Lightbox mobile -->
<div id="myosotis-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'myosotis';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/c-6-1.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Myosotis — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Myosotis — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Surveillants</title>
		<link>https://brianmura.fr/sculpture/surveillants/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 27 Aug 2025 08:39:47 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<category><![CDATA[Surveillants]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7894</guid>

					<description><![CDATA[Surveillants &#124; disques de cuivre &#124; tissus &#124; ∅ 30 x H. 220 cm. variables &#124; 2013.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7894" class="elementor elementor-7894">
				<div class="elementor-element elementor-element-bc31605 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="bc31605" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-37708da elementor-widget elementor-widget-html" data-id="37708da" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="surveillants-viewer" class="serie-viewer">

  <aside id="surveillants-caption" class="serie-caption">

    <div class="serie-title">Surveillants</div>

          <div class="serie-meta">
                  <span>- Disques à fils de cuivre</span>
                  <span>- Tissus</span>
                  <span>- ⌀ 30 x H 220 cm. variables </span>
                  <span>- 2013</span>
              </div>
    
	      <div class="serie-description">

        			<p>Tels des gardiens asexués d’un temple disparu qui en protégeraient l’entrée.</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="surveillants-stage" class="serie-stage">

  
          <img decoding="async"
        id="surveillants-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/surveillant-1024x768.webp"
        alt="Surveillants — 1"
      >
    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="surveillants-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/surveillant-1024x768.webp"
        alt="Surveillants — 1"
        class="serie-mobile-img"
        data-index="0"
      >
      </div>

<!-- Lightbox mobile -->
<div id="surveillants-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'surveillants';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/surveillant-1024x768.webp"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Surveillants — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Surveillants — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A quoi sondez-vous ?</title>
		<link>https://brianmura.fr/sculpture/a-quoi-sondez-vous/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 27 Aug 2025 08:22:28 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<category><![CDATA[A Quoi sondez-vous ?]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7879</guid>

					<description><![CDATA[À quoi sondez-vous ? &#124; plateaux &#124; récolte de trottoirs &#124; dimensions variables &#124; 2012.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7879" class="elementor elementor-7879">
				<div class="elementor-element elementor-element-3299fa1 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="3299fa1" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6c3c84d elementor-widget elementor-widget-html" data-id="6c3c84d" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="quoi-viewer" class="serie-viewer svt-viewer">

  <!-- PANNEAU GAUCHE — titre + méta -->
  <aside id="quoi-caption" class="serie-caption svt-caption">

    <div class="serie-title">À quoi sondez-vous ?</div>

          <div class="serie-meta">
                  <span>- Entretien avec Hervé Castanet 
&amp; Jean-Luc Poivret</span>
                  <span>- 125 x 190 mm.</span>
                  <span>- 28 p.</span>
                  <span>- DCC</span>
                  <span>- Éd. Gilbert Bonnet (Alcor)</span>
                  <span>- 2012</span>
              </div>
    
    
  </aside>

  <!-- ZONE DROITE — texte deux colonnes -->
  <div class="svt-main">

<div class="svt-stage">
      <div class="svt-win-item">
              <img decoding="async" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-3-scaled.jpg" alt="À quoi sondez-vous ? — 1">
          </div>
      <div class="svt-win-item">
              <img decoding="async" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-4-scaled.jpg" alt="À quoi sondez-vous ? — 2">
          </div>
      <div class="svt-win-item">
              <img decoding="async" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-2-scaled.jpg" alt="À quoi sondez-vous ? — 3">
          </div>
  </div>

    <!-- DESCRIPTION DEUX COLONNES -->
        <div class="svt-text">
      <div class="svt-columns">
        <p><em>Sur une table rectangulaire, vous disposez à plat des objets usagés de petit format (une centaine). « Objets » n’est peut-être pas le meilleur terme. Comment, vous, nommez-vous ce qui est déposé là sur cette table ?</em></p>
<p>Nommer c’est étouffer ce qui peut être lu de cette table. Si d’abord le mot rassure, c’est ensuite pour mieux étrangler ce qui est à voir. Ni colles, ni adhésifs n’ont été utilisés et pourtant un mot aurait suffit à figer l’ensemble. Nommer, ce plaisir immédiat, a en contrepartie pour se satisfaire le besoin d’évincer toute empreinte qui, avec le temps, a permis à cette table de se constituer. Sur cette table le mot devient un poids d’un autre monde qui aurait définitivement frustré une parole que je souhaite libérer de tout sens technique et pratique. Cette table est mon jardin idéal et c’est avec soin que les espèces venues des trottoirs y sont ajoutées avec leurs particularités ; à nommer, par cette table, je me découvre « jardinier ».</p>
<p><em>Pourquoi faut-il que ce que vous déposez sur la table soit marqué par l’usage et l’usure ? Question subsidiaire : Ces usages et usures sont-ils les vôtres ? Sont-ils produits par des personnes que vous connaissez ? Des anonymes ?</em></p>
<p>Ce qui est imparfait sur les trottoirs, je le cueille à mains nues et, quand je tombe dessus, je vois dans l’usé le style du travail bien fait ; j’ai soudainement le sentiment d’avoir dans les mains une chose accomplie, entière et désirable. L’usure est une inconnue mais, en habile partenaire, c’est avec elle l’assurance de cueillir quelque chose de neuf, de suffisamment mûr pour être élevé du sol à la table. Faire usage de l’usure, c’est, en battant le pavé, favoriser l’équilibre, trouver la mesure, peser entre ce qui est détruit et ce qui est devenu d’une autre beauté.</p>
<p><em>Je décris ce que je vois : certaines des « pièces » – c’est mon mot pour ne pas dire « objets » – déposées sur la table rectangulaire sont complètes ; ainsi un badge, un cintre, une pince, des cendriers empilés, des peignes ; d’autres sont les parties d’un ensemble : une poulie, un virage pour circuit automobile, une poignée de porte, des ressorts, etc. Les matériaux sont divers : métal, plastique, pierre. Les couleurs : naturelle et artificielle.<br />
Je vous demande :<br />
— Où trouvez-vous ces pièces ?<br />
— Qu’est-ce qui vous fait les recueillir ?<br />
— Les gardez-vous à l’identique ou intervenez-vous sur elles ? Par exemple, démontez-vous un mécanisme? Dévissez-vous une vis ? Ouvrez-vous une boîte ?<br />
— À quel moment décidez-vous de déposer la pièce sur votre table ?<br />
— Les classez-vous et, si oui, selon quels critères ?</em></p>
<p>Nous nous sommes habitués pendant des siècles à lever la tête croyant que le salut, le beau et l’«inspiration » viendraient d’en haut, oubliant au passage qu’au sol il y a un univers mouvant à portée de main. Sur un trajet, en promenade de jour comme de nuit, en m’égarant, seul ou accompagné, me baisser et recueillir sont des gestes brefs et spontanés (une attraction instantanée, instinctive, chimique) mais il m’arrive de prendre le temps d’observer un bout de plastique jaune un peu fondu, continuer ma route, faire demi-tour et saisir ce jaune-là. J’évite la complexité mais un mouvement étrange, des couleurs, des matières fragiles, métalliques ou caoutchouteuses, des évocations lointaines caractérisent les choix de cette récolte. Un après-midi j’ai ouvert une boîte en métal et je le regrette ; c’est à cet instant que le mystère du contenu que j’ai cueilli a disparu. Depuis je ne touche à rien sinon, dès mon retour, laver, essuyer, avant d’accommoder ma récolte sur la table rectangulaire comme vous l’avez relevé ; et c’est essentiel, le rectangle a de l’étendue, même quand il est petit, il est immense. Assez vaste en tout cas pour accueillir la diversité de mes amours.</p>
<p><em>Beaucoup de pièces déposées là sont à plat. Qu’est-ce qui préside à ce parti pris faisant s’apparenter la table, au final, plus à un tableau qu’à une sculpture ?</em></p>
<p>Dans mon sac à dos, vous trouverez du plastique, du métal, du carton mais pas de « parti pris des choses » ; cependant il est courant à table de mettre « les choses à plat » afin d’y « voir clair». La police sait de quoi je parle mais ici, fût-il de chasse, je ne vois ni tableau ni sculpture car l’ensemble est momentanément figé. Ce qui lentement gravite autour de la table, s’incline, va et vient et crée le mouvement sans y songer ; ce sont nos corps ; le pas ralentit, seul il s’organise. Les mains sont sages quand la tête fléchit pour que dans un détail, tout à l’heure invisible, les yeux s’égarent.</p>
<p><em>Comment situez-vous cette accumulation dans votre travail récent ? Une question qui se poursuit ? Un amusement indépendant ? Une autre voie qui apparaît ?</em></p>
<p>Dans l’idéal, c’est un peu décalé du centre d’une pièce où je vis que je dresse, tourne et me penche sur ce paysage ; un panorama qui ne me quitte pas et, comme les livres sur d’autres étagères, je le lis, le consulte, l’annote et l’enrichit. Qu’importe si la distance nous éloigne, si le temps nous sépare car c’est bien assez tôt que je rencontrerai, à l’angle d’une rue, un sujet qui tournera mes pensées vers lui puis, en fidèle compagnon, je reviendrai avec mon butin fleurir avec malice ce qui est, dans ce qui m’entoure, un repère qui ne trompe pas ; sans cette table je ne serai pas là.</p>
<p><em>Que comptez-vous faire de cette table avec ses pièces ? Sera-t-elle unique ? Est-elle prétexte à une parole ? Cette table garnie est-elle destinée à être montrée ou à faire parler (sur) Brian Mura ?</em></p>
<p>Ce qui doit être montré est écrit ici. À des dizaines de photographies, un ennuyeux catalogue, un vernissage par semaine, à de longues heures de vidéos, j’ai privilégié le mot avec pour unique sujet cette table et ce qu’elle contient.<br />
Est à voir sans être vu, levé par quatre pieds à hauteur d’abdomen, l’instantané d’un paysage intérieur et extérieur sur lequel, avec cet entretien, j’ai ouvert plus grand les yeux.</p>
<p><em>Voilà une belle table bien dressée ; il ne manque que la nappe blanche et, avec tous ces objets ajustés dessus, se croirait-on au XVIIe hollandais ? Tout est à vendre n’est-ce pas ?</em></p>
<p>L’écho des marchands – comptoirs, vaisseaux, équipages, compas, longues-vues, peintures et cartes – me retient à Marseille quand, permanentes, les odeurs de savon, viande crue, grillée, grillée surtout, café, cardamome, coriandre, cumin, curry, égout, poisson, poubelle, anis, pisse et hasch se déchaînent. Ici la chair est en toute chose éclatante, excessive, passionnelle et me suggère ces gestes vifs dans une ville où l’air lui même est à pétrir.<br />
Cet esprit, qui évoque le XVIIe hollandais, dit commerce, et dans ce cas, cher Monsieur, on ne vend pas au détail, c’est l’ensemble ou rien, car c’est un ensemble.</p>
<p><em>Vous avez bon goût, dans une brocante vous avez un bel étalage... Derrière je vois un escabeau, un sac et une petite boîte jaune. Parlez-m’en.</em></p>
<p>Un Hollandais vous affirmera que le mot brocante vient du mot « brok » et veut dire « morceau » ; ce morceau qui patiemment sur un bout de trottoir, tandis que j’erre le goût pour rien, guette pour faire signe avec cette inexplicable impression qu’une fois à table, nous nous attendions.<br />
En coulisse, les choses s’entendent à l’image de cette table et le sac – l’escabeau, la boîte jaune comme les étagères – ont une raison d’être.</p>
<p><em>Vos objets sont arrachés du trottoir, du vulgus, vous les caressez du regard, seulement ?<br />
Le caoutchouc c’est doux, pourquoi cet attachement à cette matière réduite ?</em></p>
<p>À vous creuser de l’intérieur, amer, âpre, pâteux, légèrement pétrole, jusqu’à inquiéter vos plats avec son odeur écœurante mais, avec la langue c’est meilleur ; hier en transportant dix kilos de caoutchouc le chien de ma voisine m’a suivi.</p>
<p><em>Votre collection bien organisée et proprette serait-elle une</em> Summa <em>intuitive ?</em></p>
<p>Le livre est dans le ton de cette table et j’écris avec les moyens du bord.</p>
      </div>
    </div>
    
  </div>

</div>

<style>

/* =============================================
   VIEWER TEXTE — Layout
   ============================================= */

.svt-viewer{
  height: auto !important;
  min-height: calc(100vh - 94px);
  overflow: visible !important;
  align-items: flex-start;
}

.svt-caption{
  /* hérite du .serie-caption existant */
}

.svt-main{
  height: auto !important;
  overflow: visible !important;
  margin-top: 40px;
}



/* =============================================
   SLIDER
   ============================================= */

.svt-stage{
  display: flex;
  align-items: stretch;
  gap: 4px;
  position: relative;
}

.svt-win-item{
  flex: 1;
  min-width: 0;
  overflow: hidden;
}

.svt-win-item img,
.svt-win-item video{
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* =============================================
   TEXTE DEUX COLONNES
   ============================================= */

.svt-text{
  padding: 40px;
  padding-left: 0px !important;
  flex: 1;
  height: auto;
  overflow: visible;
}

.svt-columns{
  column-count: 2;
  column-gap: 48px;
  column-rule: 1px solid rgba(255,255,255,0.08);
  font-family: 'Numans', sans-serif;
  font-size: 14px;
  line-height: 1.8;
}

.svt-columns p{
  margin: 0 0 36px 0;
  break-inside: avoid;
  font-size: 13px;
  line-height: 1.75;
  color: #e0dbd2;
  text-align: justify !important;
  padding-left: 0 !important;

}

/* =============================================
   MOBILE
   ============================================= */

@media (max-width: 767px){

  .svt-viewer{
    flex-direction: column;
  }

  .svt-media{
    max-height: 45vh;
  }

  .svt-text{
    padding: 24px 16px;
  }

  .svt-columns{
    column-count: 1;
    column-rule: none;
  }
  
  .svt-stage{
    flex-direction: column;
  }
  
  .svt-win-item:nth-child(n+2){
    display: none;
  }

}

</style>
<script>
(function () {

  const viewerId = 'quoi';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/etabli-3-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/etabli-4-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/etabli-2-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/etabli-5-scaled.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/etablit_une.jpg"}];
  const total    = media.length;
  let   current  = 0; /* index de l'image de gauche de la fenêtre */

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;

  /* =============================================
     DÉTECTION MOBILE
  ============================================= */

  function isMobile() {
    return window.innerWidth <= 767;
  }

  function windowSize() {
    return isMobile() ? 1 : 3;
  }

  /* =============================================
     RENDU DE LA FENÊTRE
  ============================================= */

  function render() {
    const win = windowSize();
    const max = Math.max(0, total - win);
    current   = Math.min(Math.max(current, 0), max);

    /* Vide les items existants */
    stage.querySelectorAll('.svt-win-item').forEach(el => el.remove());

    /* Crée les éléments de la fenêtre */
    const fragment = document.createDocumentFragment();
    for (let i = current; i < current + win && i < total; i++) {
      const item = media[i];
      const wrap = document.createElement('div');
      wrap.className = 'svt-win-item';

      if (item.type === 'video') {
        const vid = document.createElement('video');
        vid.src      = item.src;
        vid.controls = true;
        vid.setAttribute('playsinline', '');
        vid.loop     = item.loop === true;
        wrap.appendChild(vid);
      } else {
        const img = document.createElement('img');
        img.src = item.src;
        img.alt = 'À quoi sondez-vous ? — ' + (i + 1);
        wrap.appendChild(img);
      }

      fragment.appendChild(wrap);
    }

    /* Insère avant les boutons */
    if (btnPrev) {
      stage.insertBefore(fragment, btnPrev);
    } else {
      stage.appendChild(fragment);
    }

    /* Compteur */
    if (counter) {
      const mid = isMobile() ? current + 1 : current + 2;
      counter.textContent = Math.min(mid, total) + ' / ' + total;
    }

    /* Boutons */
    if (btnPrev) btnPrev.style.display = current <= 0 ? 'none' : 'block';
    if (btnNext) btnNext.style.display = current >= total - win ? 'none' : 'block';
  }

  function go(dir) {
    current += dir;
    render();
  }

  /* =============================================
     INIT
  ============================================= */

  /* Supprime l'image initiale générée par PHP */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg) initImg.remove();

  render();

  if (btnPrev) btnPrev.addEventListener('click', () => go(-1));
  if (btnNext) btnNext.addEventListener('click', () => go(1));

  /* Clavier */
  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(-1);
    if (e.key === 'ArrowRight') go(1);
  });

  /* Swipe */
  let touchX = null;
  if (stage) {
    stage.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    stage.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(diff > 0 ? 1 : -1);
      touchX = null;
    }, { passive: true });
  }

  /* Resize — bascule 3→1 colonne */
  let resizeTimer;
  window.addEventListener('resize', () => {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(render, 150);
  });

  /* =============================================
     PLAYER AUDIO (optionnel)
  ============================================= */

  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }

}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Appareil permettant la génération et la réception de messages via des signaux électriques</title>
		<link>https://brianmura.fr/dessin-peinture/appareil-permettant-la-generation-et-la-reception-de-messages-via-des-signaux-electriques/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 13:56:34 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Appareil permettant la génération et la réception de messages via des signaux électriques]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7781</guid>

					<description><![CDATA[Appareil permettant la réception et l’émission de messages &#124; papier &#124; dimensions variables &#124; 2009. ]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7781" class="elementor elementor-7781">
				<div class="elementor-element elementor-element-a2c68bb e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="a2c68bb" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e7b0c02 elementor-widget elementor-widget-html" data-id="e7b0c02" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="appareil-viewer" class="serie-viewer">

  <aside id="appareil-caption" class="serie-caption">

    <div class="serie-title">Appareil permettant la réception et l&#039;emission de messages</div>

          <div class="serie-meta">
                  <span>- Couvertures ratées d&#039;un livre, puis découpées</span>
                  <span>- Dimensions variables selon les sols, murs et plafonds</span>
                  <span>- 2009</span>
              </div>
    
	
    
  </aside>


<div id="appareil-stage" class="serie-stage">

  
          <img decoding="async"
        id="appareil-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/060720091116-scaled.webp"
        alt="Appareil permettant la réception et l&#039;emission de messages — 1"
      >
    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="appareil-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/060720091116-scaled.webp"
        alt="Appareil permettant la réception et l&#039;emission de messages — 1"
        class="serie-mobile-img"
        data-index="0"
      >
      </div>

<!-- Lightbox mobile -->
<div id="appareil-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'appareil';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/060720091116-scaled.webp"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Appareil permettant la réception et l\'emission de messages — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Appareil permettant la réception et l\'emission de messages — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Éclat</title>
		<link>https://brianmura.fr/video/eclat/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sun, 24 Aug 2025 11:29:19 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Éclat]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7428</guid>

					<description><![CDATA[Éclat &#124; impression numérique contre collée sur support rigide &#124; 40 x 60 cm. &#124; 2021-2022.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7428" class="elementor elementor-7428">
				<div class="elementor-element elementor-element-e27f089 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="e27f089" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-4395bb7 elementor-widget elementor-widget-html" data-id="4395bb7" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="eclat-viewer" class="serie-viewer">

  <aside id="eclat-caption" class="serie-caption">

    <div class="serie-title">Éclat</div>

          <div class="serie-meta">
                  <span>- 55 portraits instantanés</span>
                  <span>- Marseille, Noailles</span>
                  <span>- Impression numérique contre collée sur support rigide</span>
                  <span>- 40 × 60 cm</span>
                  <span>- 2021–2022</span>
                  <span>- Avec le soutient de production de Gilbert Bonnet.</span>
              </div>
    
	
          <div class="serie-player" id="eclat-player">

        <div class="sp-controls">
          <button class="sp-btn sp-prev" aria-label="Précédent">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
              <polygon points="19 20 9 12 19 4 19 20"/><line x1="5" y1="19" x2="5" y2="5"/>
            </svg>
          </button>
          <button class="sp-btn sp-play" aria-label="Play/Pause">
            <svg class="sp-play-icon" width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
              <polygon points="5 3 19 12 5 21 5 3"/>
            </svg>
          </button>
          <button class="sp-btn sp-next" aria-label="Suivant">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
              <polygon points="5 4 15 12 5 20 5 4"/><line x1="19" y1="5" x2="19" y2="19"/>
            </svg>
          </button>
        </div>

        <ul class="sp-playlist">
                      <li class="sp-track active"
                data-src="https://brianmura.fr/wp-content/themes/Brian/templates/sons/marseille.mp3">
              <span class="sp-num">1</span>
              <span class="sp-dot"></span>
              <span class="sp-title">Colette Renard - Tais-toi Marseille</span>
            </li>
                  </ul>

        <div class="sp-times">
          <span class="sp-cur">0:00</span>
          <span class="sp-tot">0:00</span>
        </div>

      </div>

      <audio class="serie-audio" preload="none"></audio>
    
  </aside>


<div id="eclat-stage" class="serie-stage">

  
          <img decoding="async"
        id="eclat-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD2.jpg"
        alt="Éclat — 1"
      >
    
  
      <button class="serie-prev" aria-label="Précédent">&#8592;</button>
    <button class="serie-next" aria-label="Suivant">&#8594;</button>
    <div class="serie-counter">1 / 55</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="eclat-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD2.jpg"
        alt="Éclat — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD3.jpg"
        alt="Éclat — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD4.jpg"
        alt="Éclat — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD5.jpg"
        alt="Éclat — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD6.jpg"
        alt="Éclat — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD7.jpg"
        alt="Éclat — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD8.jpg"
        alt="Éclat — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD9.jpg"
        alt="Éclat — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD10.jpg"
        alt="Éclat — 9"
        class="serie-mobile-img"
        data-index="8"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD11.jpg"
        alt="Éclat — 10"
        class="serie-mobile-img"
        data-index="9"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD12.jpg"
        alt="Éclat — 11"
        class="serie-mobile-img"
        data-index="10"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD13.jpg"
        alt="Éclat — 12"
        class="serie-mobile-img"
        data-index="11"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD14.jpg"
        alt="Éclat — 13"
        class="serie-mobile-img"
        data-index="12"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD15.jpg"
        alt="Éclat — 14"
        class="serie-mobile-img"
        data-index="13"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD16.jpg"
        alt="Éclat — 15"
        class="serie-mobile-img"
        data-index="14"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD17.jpg"
        alt="Éclat — 16"
        class="serie-mobile-img"
        data-index="15"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD18.jpg"
        alt="Éclat — 17"
        class="serie-mobile-img"
        data-index="16"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD19.jpg"
        alt="Éclat — 18"
        class="serie-mobile-img"
        data-index="17"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD20.jpg"
        alt="Éclat — 19"
        class="serie-mobile-img"
        data-index="18"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD21.jpg"
        alt="Éclat — 20"
        class="serie-mobile-img"
        data-index="19"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD22.jpg"
        alt="Éclat — 21"
        class="serie-mobile-img"
        data-index="20"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD23.jpg"
        alt="Éclat — 22"
        class="serie-mobile-img"
        data-index="21"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD24.jpg"
        alt="Éclat — 23"
        class="serie-mobile-img"
        data-index="22"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD25.jpg"
        alt="Éclat — 24"
        class="serie-mobile-img"
        data-index="23"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD26.jpg"
        alt="Éclat — 25"
        class="serie-mobile-img"
        data-index="24"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD27.jpg"
        alt="Éclat — 26"
        class="serie-mobile-img"
        data-index="25"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD28.jpg"
        alt="Éclat — 27"
        class="serie-mobile-img"
        data-index="26"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD29.jpg"
        alt="Éclat — 28"
        class="serie-mobile-img"
        data-index="27"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD30.jpg"
        alt="Éclat — 29"
        class="serie-mobile-img"
        data-index="28"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD31.jpg"
        alt="Éclat — 30"
        class="serie-mobile-img"
        data-index="29"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD32.jpg"
        alt="Éclat — 31"
        class="serie-mobile-img"
        data-index="30"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD33.jpg"
        alt="Éclat — 32"
        class="serie-mobile-img"
        data-index="31"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD34.jpg"
        alt="Éclat — 33"
        class="serie-mobile-img"
        data-index="32"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD35.jpg"
        alt="Éclat — 34"
        class="serie-mobile-img"
        data-index="33"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD36.jpg"
        alt="Éclat — 35"
        class="serie-mobile-img"
        data-index="34"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD37.jpg"
        alt="Éclat — 36"
        class="serie-mobile-img"
        data-index="35"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD38.jpg"
        alt="Éclat — 37"
        class="serie-mobile-img"
        data-index="36"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD39.jpg"
        alt="Éclat — 38"
        class="serie-mobile-img"
        data-index="37"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD40.jpg"
        alt="Éclat — 39"
        class="serie-mobile-img"
        data-index="38"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD41.jpg"
        alt="Éclat — 40"
        class="serie-mobile-img"
        data-index="39"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD42.jpg"
        alt="Éclat — 41"
        class="serie-mobile-img"
        data-index="40"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD43.jpg"
        alt="Éclat — 42"
        class="serie-mobile-img"
        data-index="41"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD44.jpg"
        alt="Éclat — 43"
        class="serie-mobile-img"
        data-index="42"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD45.jpg"
        alt="Éclat — 44"
        class="serie-mobile-img"
        data-index="43"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD46.jpg"
        alt="Éclat — 45"
        class="serie-mobile-img"
        data-index="44"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD47.jpg"
        alt="Éclat — 46"
        class="serie-mobile-img"
        data-index="45"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD48.jpg"
        alt="Éclat — 47"
        class="serie-mobile-img"
        data-index="46"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD49.jpg"
        alt="Éclat — 48"
        class="serie-mobile-img"
        data-index="47"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD50.jpg"
        alt="Éclat — 49"
        class="serie-mobile-img"
        data-index="48"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD51.jpg"
        alt="Éclat — 50"
        class="serie-mobile-img"
        data-index="49"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD52.jpg"
        alt="Éclat — 51"
        class="serie-mobile-img"
        data-index="50"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD53.jpg"
        alt="Éclat — 52"
        class="serie-mobile-img"
        data-index="51"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD54.jpg"
        alt="Éclat — 53"
        class="serie-mobile-img"
        data-index="52"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD55.jpg"
        alt="Éclat — 54"
        class="serie-mobile-img"
        data-index="53"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/11/Portraits-40-60-BD56.jpg"
        alt="Éclat — 55"
        class="serie-mobile-img"
        data-index="54"
      >
      </div>

<!-- Lightbox mobile -->
<div id="eclat-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'eclat';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD4.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD5.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD6.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD7.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD8.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD9.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD10.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD11.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD12.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD13.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD14.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD15.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD16.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD17.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD18.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD19.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD20.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD21.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD22.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD23.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD24.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD25.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD26.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD27.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD28.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD29.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD30.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD31.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD32.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD33.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD34.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD35.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD36.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD37.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD38.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD39.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD40.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD41.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD42.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD43.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD44.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD45.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD46.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD47.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD48.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD49.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD50.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD51.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD52.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD53.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD54.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD55.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/11\/Portraits-40-60-BD56.jpg"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Éclat — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Éclat — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Chou-fleur en halluciné</title>
		<link>https://brianmura.fr/video/chou-fleur-en-hallucine/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 30 Jul 2025 11:31:02 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Chou-fleur en halluciné]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=6777</guid>

					<description><![CDATA[Demi chou-fleur en halluciné &#124; 5.51 mn. &#124; son &#124; 2007.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6777" class="elementor elementor-6777">
				<div class="elementor-element elementor-element-4eab2b3 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="4eab2b3" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-64e6033 elementor-widget elementor-widget-html" data-id="64e6033" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="choux-viewer" class="serie-viewer">

  <aside id="choux-caption" class="serie-caption">

    <div class="serie-title">Demi chou-fleur en halluciné</div>

          <div class="serie-meta">
                  <span>- Chou-fleur</span>
                  <span>- 5 min 51 s</span>
                  <span>- Image par image</span>
                  <span>- 2007</span>
              </div>
    
	
    
  </aside>


<div id="choux-stage" class="serie-stage">

  
          <video
        id="choux-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2024/12/lsd-1.mp4"
        controls
        playsinline
				        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="choux-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2024/12/lsd-1.mp4"
        controls
        playsinline
				        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="choux-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'choux';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/lsd-1.mp4"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Demi chou-fleur en halluciné — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Demi chou-fleur en halluciné — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>L&#8217;Éplucheur de pommes de terre inconnues</title>
		<link>https://brianmura.fr/video/leplucheur-de-pommes-de-terre/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sun, 04 May 2025 08:30:13 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[L'Éplucheur de pommes de terre inconnues]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=6840</guid>

					<description><![CDATA[L'Éplucheur de pommes de terre inconnues &#124; 0.27 sec. &#124; son &#124; 2023.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6840" class="elementor elementor-6840">
				<div class="elementor-element elementor-element-ad91a65 e-flex e-con-boxed wpr-particle-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="ad91a65" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-fad631a elementor-widget elementor-widget-html" data-id="fad631a" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="eplucheur-viewer" class="serie-viewer">

  <aside id="eplucheur-caption" class="serie-caption">

    <div class="serie-title">L&#039;Éplucheur de pommes de terre inconnu</div>

          <div class="serie-meta">
                  <span>- Éplucheur de pommes de terre</span>
                  <span>- Boucle 0.27 s</span>
                  <span>- 2023</span>
              </div>
    
	
    
  </aside>


<div id="eplucheur-stage" class="serie-stage">

  
          <video
        id="eplucheur-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2025/08/Eplucheur-2.mp4"
        controls
        playsinline
		loop		        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="eplucheur-mobile-grid" class="serie-mobile-grid">
            <video
        class="serie-mobile-video"
        src="https://brianmura.fr/wp-content/uploads/2025/08/Eplucheur-2.mp4"
        controls
        playsinline
		loop		        style="width:100%; height:auto; display:block;"
      ></video>
      </div>

<!-- Lightbox mobile -->
<div id="eplucheur-lightbox" class="serie-lightbox" aria-hidden="true">
  <button class="slb-close">✕</button>
  <button class="slb-prev">&#8592;</button>
  <img decoding="async" class="slb-img" src="" alt="">
  <button class="slb-next">&#8594;</button>
  <div class="slb-counter"></div>
</div>

</div><script>
(function () {

  const viewerId = 'eplucheur';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/Eplucheur-2.mp4","loop":true}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src      = item.src;
        existing.loop     = item.loop === true;
        existing.muted    = item.autoplay === true;
        existing.autoplay = item.autoplay === true;
        existing.load();
        existing.load();
		if (item.autoplay) {
		existing.addEventListener('loadedmetadata', () => {
		existing.play().catch(() => {});
		}, { once: true });
	}
      }
      const vid = document.createElement('video');
      vid.id        = viewerId + '-img';
      vid.className = 'serie-img serie-video';
      vid.src       = item.src;
      vid.controls  = true;
      vid.setAttribute('playsinline', '');
      vid.loop      = item.loop === true;
      vid.muted     = item.autoplay === true;
      vid.autoplay  = item.autoplay === true;
      vid.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
	  if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);
      if (item.autoplay) {
      vid.addEventListener('loadedmetadata', () => {
       vid.play().catch(() => {});
       }, { once: true });
}

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'L\'Éplucheur de pommes de terre inconnu — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'L\'Éplucheur de pommes de terre inconnu — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
