<?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>Dessin | Peinture &#8211; Brian Mura</title>
	<atom:link href="https://brianmura.fr/category/dessin-peinture/feed/" rel="self" type="application/rss+xml" />
	<link>https://brianmura.fr</link>
	<description></description>
	<lastBuildDate>Mon, 13 Jul 2026 08:50:39 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://brianmura.fr/wp-content/uploads/2024/12/cropped-courtesy-logo-32x32.jpg</url>
	<title>Dessin | Peinture &#8211; Brian Mura</title>
	<link>https://brianmura.fr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>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>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>Étendues caoutchouteuses</title>
		<link>https://brianmura.fr/dessin-peinture/ecrans/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Mon, 20 Jan 2025 17:56:41 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Étendues caoutchouteuses]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=6410</guid>

					<description><![CDATA[Étendues caoutchouteuses &#124; blanchets &#124; peinture &#124; 105 x 83 cm. &#124; 2018 [...].]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6410" class="elementor elementor-6410">
				<div class="elementor-element elementor-element-e8a9fd8 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="e8a9fd8" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c6c922c elementor-widget elementor-widget-html" data-id="c6c922c" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="etendues-viewer" class="serie-viewer">

  <aside id="etendues-caption" class="serie-caption">

    <div class="serie-title">Étendues caoutchouteuses</div>

          <div class="serie-meta">
                  <span>- Blanchets</span>
                  <span>- Peintures</span>
                  <span>- 105 x 83 cm.</span>
                  <span>- 2018 - [...]</span>
              </div>
    
	
    
  </aside>


<div id="etendues-stage" class="serie-stage">

  
          <img decoding="async"
        id="etendues-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/03/ecran-1.jpg"
        alt="Étendues caoutchouteuses — 1"
      >
    
  
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="etendues-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/03/ecran-1.jpg"
        alt="Étendues caoutchouteuses — 1"
        class="serie-mobile-img"
        data-index="0"
      >
      </div>

<!-- Lightbox mobile -->
<div id="etendues-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 = 'etendues';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/03\/ecran-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 = 'Étendues caoutchouteuses — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Étendues caoutchouteuses — ' + (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>Acidulés de Crocodiles</title>
		<link>https://brianmura.fr/dessin-peinture/crocodiles/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 20 Dec 2024 18:17:06 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Acidulés de Crocodiles]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=6428</guid>

					<description><![CDATA[Acidulés de crocodiles &#124; impressions numérique sur bâche &#124; 1.60 x 1.60 m. &#124; 2016.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6428" class="elementor elementor-6428">
				<div class="elementor-element elementor-element-ae9eb27 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="ae9eb27" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-78801b6 elementor-widget elementor-widget-html" data-id="78801b6" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="Crocodiles-viewer" class="serie-viewer">

  <aside id="Crocodiles-caption" class="serie-caption">

    <div class="serie-title">Acidulés de crocodiles</div>

          <div class="serie-meta">
                  <span>- Matelas abandonnés</span>
                  <span>- Impressions numériques sur bâche</span>
                  <span>- 1.60 x 1.60 cm.</span>
                  <span>- 2016</span>
              </div>
    
	      <div class="serie-description">

        			<p>« Venir à toi provoque un léger vertige, une sensation de basculement vers l'avant, comme lorsqu'on s'engage sur un escalator en panne. »</p>
		
		
        		
		
      </div>
	
    
  </aside>


<div id="Crocodiles-stage" class="serie-stage">

  
          <img decoding="async"
        id="Crocodiles-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-cuivre-7.jpg"
        alt="Acidulés de crocodiles — 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 / 9</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="Crocodiles-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-cuivre-7.jpg"
        alt="Acidulés de crocodiles — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-cuivre-5.jpg"
        alt="Acidulés de crocodiles — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-violet.jpg"
        alt="Acidulés de crocodiles — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-vert.jpg"
        alt="Acidulés de crocodiles — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-noir.jpg"
        alt="Acidulés de crocodiles — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/soir-reve-cuivre-5bis.jpg"
        alt="Acidulés de crocodiles — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/03/crocodile-1-1.jpg"
        alt="Acidulés de crocodiles — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/03/crocodile-3.jpg"
        alt="Acidulés de crocodiles — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/03/crocodile-2.jpg"
        alt="Acidulés de crocodiles — 9"
        class="serie-mobile-img"
        data-index="8"
      >
      </div>

<!-- Lightbox mobile -->
<div id="Crocodiles-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 = 'Crocodiles';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/soir-reve-cuivre-7.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/soir-reve-cuivre-5.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/soir-reve-violet.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/soir-reve-vert.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/soir-reve-noir.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/soir-reve-cuivre-5bis.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/03\/crocodile-1-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/03\/crocodile-3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/03\/crocodile-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 = 'Acidulés de crocodiles — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Acidulés de crocodiles — ' + (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>Grill</title>
		<link>https://brianmura.fr/dessin-peinture/grill/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sat, 14 Dec 2024 15:26:25 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Grill]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=1785</guid>

					<description><![CDATA[Grill &#124; peinture à l'huile &#124; feutre &#124; 16 x 16 cm. &#124; 2009.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1785" class="elementor elementor-1785">
				<div class="elementor-element elementor-element-8ac1d14 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="8ac1d14" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-296e361 elementor-widget elementor-widget-html" data-id="296e361" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="grill-viewer" class="serie-viewer">

  <aside id="grill-caption" class="serie-caption">

    <div class="serie-title">Grill</div>

          <div class="serie-meta">
                  <span>- Papier</span>
                  <span>- Peinture à lhuile</span>
                  <span>- Feutre</span>
                  <span>- 16 x 16 cm</span>
                  <span>- 2009</span>
              </div>
    
	
    
  </aside>


<div id="grill-stage" class="serie-stage">

  
          <img decoding="async"
        id="grill-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2024/12/grill.webp"
        alt="Grill — 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="grill-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/grill.webp"
        alt="Grill — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/grill-2.webp"
        alt="Grill — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/grill-3.webp"
        alt="Grill — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/grill-4.webp"
        alt="Grill — 4"
        class="serie-mobile-img"
        data-index="3"
      >
      </div>

<!-- Lightbox mobile -->
<div id="grill-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 = 'grill';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/grill.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/grill-2.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/grill-3.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/grill-4.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 = 'Grill — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Grill — ' + (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>Exercices d&#8217;Écume</title>
		<link>https://brianmura.fr/dessin-peinture/exercices-decume/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sat, 14 Dec 2024 14:55:53 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Exercices d'Écume]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=1767</guid>

					<description><![CDATA[Exercices d'écume &#124; Assiettes &#124; latex &#124; acrylique &#124; dimensions variables &#124; 2022 - [...].]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1767" class="elementor elementor-1767">
				<div class="elementor-element elementor-element-c20c786 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="c20c786" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-ff0b107 elementor-widget elementor-widget-html" data-id="ff0b107" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="exercices-viewer" class="serie-viewer">

  <aside id="exercices-caption" class="serie-caption">

    <div class="serie-title">Exercices d&#039;écume</div>

          <div class="serie-meta">
                  <span>- Assiettes</span>
                  <span>- Latex</span>
                  <span>- Acrylique</span>
                  <span>- Dimensions variables</span>
                  <span>- 2022 - [...]</span>
              </div>
    
	      <div class="serie-description">

        			<p>Un matin ensoleillé, un peu frais, je me suis perdu dans les détails oniriques d'un crachat à l'arrêt de bus.</p>
<p>À partir de la série de dessins du même nom.<br />- Papier<br />- Latex<br />- Acrylique<br />- 64 x 50 cm.<br />- 2018.</p>
		
		
                  <div class="serie-desc-images">
                                          <span class="serie-desc-thumb">
                  <img decoding="async" src="https://brianmura.fr/wp-content/uploads/2024/12/exercie-une.webp" alt="Latex, acrylique">
                </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="exercices-stage" class="serie-stage">

  
          <img decoding="async"
        id="exercices-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/A-Exe4.jpg"
        alt="Exercices d&#039;écume — 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 / 5</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="exercices-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/A-Exe4.jpg"
        alt="Exercices d&#039;écume — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/A-Exe3.jpg"
        alt="Exercices d&#039;écume — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/A-Exe5.jpg"
        alt="Exercices d&#039;écume — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/A-Exe2.jpg"
        alt="Exercices d&#039;écume — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/A-Exe.jpg"
        alt="Exercices d&#039;écume — 5"
        class="serie-mobile-img"
        data-index="4"
      >
      </div>

<!-- Lightbox mobile -->
<div id="exercices-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 = 'exercices';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/A-Exe4.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/A-Exe3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/A-Exe5.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/A-Exe2.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/A-Exe.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 = 'Exercices d\'écume — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Exercices d\'écume — ' + (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>Encornets de souche douteuse</title>
		<link>https://brianmura.fr/dessin-peinture/encornets-de-souche-douteuse/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Fri, 13 Dec 2024 13:41:27 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Encornets de souche douteuse]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=1623</guid>

					<description><![CDATA[Encornets de souche douteuse &#124; papier cartonné &#124; peintures à l'huile &#038; acrylique &#124; 2021.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1623" class="elementor elementor-1623">
				<div class="elementor-element elementor-element-cfc236f 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="cfc236f" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-63e6d26 elementor-widget elementor-widget-html" data-id="63e6d26" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="encornets-viewer" class="serie-viewer">

  <aside id="encornets-caption" class="serie-caption">

    <div class="serie-title">Encornets de souche douteuse</div>

          <div class="serie-meta">
                  <span>- Papier cartonné et étagères en métal</span>
                  <span>- Peinture acrylique</span>
                  <span>- 2021 - [...]</span>
              </div>
    
	
    
  </aside>


<div id="encornets-stage" class="serie-stage">

  
          <img decoding="async"
        id="encornets-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2024/12/avertisseur-3.jpg"
        alt="Encornets de souche douteuse — 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 / 6</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="encornets-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/avertisseur-3.jpg"
        alt="Encornets de souche douteuse — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/avertisseur.jpg"
        alt="Encornets de souche douteuse — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/coque-12.jpg"
        alt="Encornets de souche douteuse — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/coque-11.jpg"
        alt="Encornets de souche douteuse — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/coque-10.jpg"
        alt="Encornets de souche douteuse — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/coque-8-dessin-2.jpg"
        alt="Encornets de souche douteuse — 6"
        class="serie-mobile-img"
        data-index="5"
      >
      </div>

<!-- Lightbox mobile -->
<div id="encornets-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 = 'encornets';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/avertisseur-3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/avertisseur.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/coque-12.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/coque-11.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/coque-10.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/coque-8-dessin-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 = 'Encornets de souche douteuse — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Encornets de souche douteuse — ' + (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>Glyphes</title>
		<link>https://brianmura.fr/dessin-peinture/glyphes/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Wed, 11 Dec 2024 14:14:59 +0000</pubDate>
				<category><![CDATA[Dessin | Peinture]]></category>
		<category><![CDATA[Glyphes]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=1279</guid>

					<description><![CDATA[Glyphes (Cosmic dancers ref Marc Bolan) &#124; serflex &#124; ~ 20 x 10 cm. &#124; 2009-2010.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1279" class="elementor elementor-1279">
				<div class="elementor-element elementor-element-fdd1ade 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="fdd1ade" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-9fa9010 elementor-widget elementor-widget-html" data-id="9fa9010" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="glyphes-viewer" class="serie-viewer">

  <aside id="glyphes-caption" class="serie-caption">

    <div class="serie-title">Glyphes (Ref Marc Bolan)</div>

          <div class="serie-meta">
                  <span>- Serfex</span>
                  <span>- Marqueurs</span>
                  <span>~ 20 x 10 cm.</span>
                  <span>- 2009 - 2010</span>
              </div>
    
	
          <div class="serie-player" id="glyphes-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/rex.mp3">
              <span class="sp-num">1</span>
              <span class="sp-dot"></span>
              <span class="sp-title">T.Rex - Cosmic Dancer</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="glyphes-stage" class="serie-stage">

  
          <img decoding="async"
        id="glyphes-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/08/gl-nuage.webp"
        alt="Glyphes (Ref Marc Bolan) — 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 / 30</div>
  
</div>

<!-- Grille mobile — images empilées -->
<!-- Grille mobile — images et vidéos empilées -->
<div id="glyphes-mobile-grid" class="serie-mobile-grid">
            <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2025/08/gl-nuage.webp"
        alt="Glyphes (Ref Marc Bolan) — 1"
        class="serie-mobile-img"
        data-index="0"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-36.jpg"
        alt="Glyphes (Ref Marc Bolan) — 2"
        class="serie-mobile-img"
        data-index="1"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-35.jpg"
        alt="Glyphes (Ref Marc Bolan) — 3"
        class="serie-mobile-img"
        data-index="2"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-33.jpg"
        alt="Glyphes (Ref Marc Bolan) — 4"
        class="serie-mobile-img"
        data-index="3"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-32.jpg"
        alt="Glyphes (Ref Marc Bolan) — 5"
        class="serie-mobile-img"
        data-index="4"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-30.jpg"
        alt="Glyphes (Ref Marc Bolan) — 6"
        class="serie-mobile-img"
        data-index="5"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-29.jpg"
        alt="Glyphes (Ref Marc Bolan) — 7"
        class="serie-mobile-img"
        data-index="6"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-28.jpg"
        alt="Glyphes (Ref Marc Bolan) — 8"
        class="serie-mobile-img"
        data-index="7"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-27.jpg"
        alt="Glyphes (Ref Marc Bolan) — 9"
        class="serie-mobile-img"
        data-index="8"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-38.jpg"
        alt="Glyphes (Ref Marc Bolan) — 10"
        class="serie-mobile-img"
        data-index="9"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-39.jpg"
        alt="Glyphes (Ref Marc Bolan) — 11"
        class="serie-mobile-img"
        data-index="10"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-26.jpg"
        alt="Glyphes (Ref Marc Bolan) — 12"
        class="serie-mobile-img"
        data-index="11"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-6.jpg"
        alt="Glyphes (Ref Marc Bolan) — 13"
        class="serie-mobile-img"
        data-index="12"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-25.jpg"
        alt="Glyphes (Ref Marc Bolan) — 14"
        class="serie-mobile-img"
        data-index="13"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-24.jpg"
        alt="Glyphes (Ref Marc Bolan) — 15"
        class="serie-mobile-img"
        data-index="14"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-23.jpg"
        alt="Glyphes (Ref Marc Bolan) — 16"
        class="serie-mobile-img"
        data-index="15"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-22.jpg"
        alt="Glyphes (Ref Marc Bolan) — 17"
        class="serie-mobile-img"
        data-index="16"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-21.jpg"
        alt="Glyphes (Ref Marc Bolan) — 18"
        class="serie-mobile-img"
        data-index="17"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-20.jpg"
        alt="Glyphes (Ref Marc Bolan) — 19"
        class="serie-mobile-img"
        data-index="18"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-19.jpg"
        alt="Glyphes (Ref Marc Bolan) — 20"
        class="serie-mobile-img"
        data-index="19"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-18.jpg"
        alt="Glyphes (Ref Marc Bolan) — 21"
        class="serie-mobile-img"
        data-index="20"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-4.jpg"
        alt="Glyphes (Ref Marc Bolan) — 22"
        class="serie-mobile-img"
        data-index="21"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-17.jpg"
        alt="Glyphes (Ref Marc Bolan) — 23"
        class="serie-mobile-img"
        data-index="22"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-16.jpg"
        alt="Glyphes (Ref Marc Bolan) — 24"
        class="serie-mobile-img"
        data-index="23"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-15.jpg"
        alt="Glyphes (Ref Marc Bolan) — 25"
        class="serie-mobile-img"
        data-index="24"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-14.jpg"
        alt="Glyphes (Ref Marc Bolan) — 26"
        class="serie-mobile-img"
        data-index="25"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-13.jpg"
        alt="Glyphes (Ref Marc Bolan) — 27"
        class="serie-mobile-img"
        data-index="26"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-3.jpg"
        alt="Glyphes (Ref Marc Bolan) — 28"
        class="serie-mobile-img"
        data-index="27"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-11.jpg"
        alt="Glyphes (Ref Marc Bolan) — 29"
        class="serie-mobile-img"
        data-index="28"
      >
                <img decoding="async"
        src="https://brianmura.fr/wp-content/uploads/2024/12/gl-9.jpg"
        alt="Glyphes (Ref Marc Bolan) — 30"
        class="serie-mobile-img"
        data-index="29"
      >
      </div>

<!-- Lightbox mobile -->
<div id="glyphes-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 = 'glyphes';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/gl-nuage.webp"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-36.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-35.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-33.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-32.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-30.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-29.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-28.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-27.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-38.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-39.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-26.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-6.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-25.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-24.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-23.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-22.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-21.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-20.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-19.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-18.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-4.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-17.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-16.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-15.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-14.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-13.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-11.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/gl-9.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 = 'Glyphes (Ref Marc Bolan) — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Glyphes (Ref Marc Bolan) — ' + (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>
