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

<channel>
	<title>Brian Mura</title>
	<atom:link href="https://brianmura.fr/feed/" rel="self" type="application/rss+xml" />
	<link>https://brianmura.fr</link>
	<description></description>
	<lastBuildDate>Fri, 12 Jun 2026 11:27:34 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://brianmura.fr/wp-content/uploads/2024/12/cropped-courtesy-logo-32x32.jpg</url>
	<title>Brian Mura</title>
	<link>https://brianmura.fr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Les Badinages de Bains de mer</title>
		<link>https://brianmura.fr/sculpture/les-badinages-de-bains-de-mer/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Tue, 26 May 2026 06:27:12 +0000</pubDate>
				<category><![CDATA[Sculpture]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=18605</guid>

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

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

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

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

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

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

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

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

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

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

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

					<description><![CDATA[À Quoi sondez-vous ? &#124; plateaux &#124; récolte de trottoirs &#124; dimensions variables &#124; 2012.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7879" class="elementor elementor-7879">
				<div class="elementor-element elementor-element-25e634e 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="25e634e" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-512fb47 elementor-widget elementor-widget-text-editor" data-id="512fb47" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<h5><span style="color: #000000;">À Quoi sondez-vous ?</span></h5>								</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0e283f8 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="0e283f8" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-9fe8266 elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="9fe8266" data-element_type="widget" data-e-type="widget" data-settings="{&quot;autoplay_speed&quot;:9800,&quot;speed&quot;:1500,&quot;image_spacing_custom&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;,&quot;image_spacing_custom_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
							<div class="elementor-image-carousel-wrapper swiper" role="region" aria-roledescription="carousel" aria-label="Carrousel d’images" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 sur 5"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-3-scaled.jpg" alt="etabli-3" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 sur 5"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-4-scaled.jpg" alt="etabli-4" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 sur 5"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-2-scaled.jpg" alt="etabli-2" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="4 sur 5"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://brianmura.fr/wp-content/uploads/2025/08/etabli-5-scaled.jpg" alt="etabli-5" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="5 sur 5"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://brianmura.fr/wp-content/uploads/2025/08/etablit_une.jpg" alt="etablit_une" /></figure></div>			</div>
												<div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0">
						<svg aria-hidden="true" class="e-font-icon-svg e-eicon-chevron-left" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg"><path d="M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z"></path></svg>					</div>
					<div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0">
						<svg aria-hidden="true" class="e-font-icon-svg e-eicon-chevron-right" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg"><path d="M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z"></path></svg>					</div>
				
									<div class="swiper-pagination"></div>
									</div>
						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-defb0d7 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="defb0d7" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-03cfdea elementor-widget elementor-widget-text-editor" data-id="03cfdea" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Plateaux | récolte de trottoirs | dimensions variables | 2012.</p>								</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-da075c8 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="da075c8" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6690768 elementor-widget elementor-widget-text-editor" data-id="6690768" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p><strong><em>À Quoi sondez-vous ?</em> Entretien avec Hervé Castanet &amp; Jean-Luc Poivret | 125 x 190 mm. | 28 pages | Éditions Gilbert Bonnet | 2012.</strong></p><p><em>Sur une table rectangulaire, vous disposez à plat des objets usagés de petit format (une centaine). « Objets » n’est peut-être pas le meilleur terme. Comment, vous, nommez-vous ce qui est déposé là sur cette table ?</em></p><p>Nommer c’est étouffer ce qui peut être lu de cette table. Si d’abord le mot rassure, c’est ensuite pour mieux étrangler ce qui est à voir. Ni colles, ni adhésifs n’ont été utilisés et pourtant un mot aurait suffit à figer l’ensemble. Nommer, ce plaisir immédiat, a en contrepartie pour se satisfaire le besoin d’évincer toute empreinte qui, avec le temps, a permis à cette table de se constituer. Sur cette table le mot devient un poids d’un autre monde qui aurait définitivement frustré une parole que je souhaite libérer de tout sens technique et pratique. Cette table est mon jardin idéal et c’est avec soin que les espèces venues des trottoirs y sont ajoutées avec leurs particularités ; à nommer, par cette table, je me découvre « jardinier ».</p><p><em>Pourquoi faut-il que ce que vous déposez sur la table soit marqué par l’usage et l’usure ? Question subsidiaire : Ces usages et usures sont-ils les vôtres ? Sont-ils produits par des personnes que vous connaissez ? Des anonymes ?</em></p><p>Ce qui est imparfait sur les trottoirs, je le cueille à mains nues et, quand je tombe dessus, je vois dans l’usé le style du travail bien fait ; j’ai soudainement le sentiment d’avoir dans les mains une chose accomplie, entière et désirable. L’usure est une inconnue mais, en habile partenaire, c’est avec elle l’assurance de cueillir quelque chose de neuf, de suffisamment mûr pour être élevé du sol à la table. Faire usage de l’usure, c’est, en battant le pavé, favoriser l’équilibre, trouver la mesure, peser entre ce qui est détruit et ce qui est devenu d’une autre beauté.</p><p><em>Je décris ce que je vois : certaines des « pièces » – c’est mon mot pour ne pas dire « objets » – déposées sur la table rectangulaire sont complètes ; ainsi un badge, un cintre, une pince, des cendriers empilés, des peignes ; d’autres sont les parties d’un ensemble : une poulie, un virage pour circuit automobile, une poignée de porte, des ressorts, etc. Les matériaux sont divers : métal, plastique, pierre. Les couleurs : naturelle et artificielle. </em><br /><em>Je vous demande :</em><br /><em>— Où trouvez-vous ces pièces ?</em><br /><em>— Qu’est-ce qui vous fait les recueillir ?</em><br /><em>— Les gardez-vous à l’identique ou intervenez-vous sur elles ? Par exemple, démontez-vous un mécanisme? Dévissez-vous une vis ? Ouvrez-vous une boîte ?</em><br /><em>— À quel moment décidez-vous de déposer la pièce sur votre table ?</em><br /><em>— Les classez-vous et, si oui, selon quels critères ?</em></p><p>Nous nous sommes habitués pendant des siècles à lever la tête croyant que le salut, le beau et l’«inspiration » viendraient d’en haut, oubliant au passage qu’au sol il y a un univers mouvant à portée de main. Sur un trajet, en promenade de jour comme de nuit, en m’égarant, seul ou accompagné, me baisser et recueillir sont des gestes brefs et spontanés (une attraction instantanée, instinctive, chimique) mais il m’arrive de prendre le temps d’observer un bout de plastique jaune un peu fondu, continuer ma route, faire demi-tour et saisir ce jaune-là. J’évite la complexité mais un mouvement étrange, des couleurs, des matières fragiles, métalliques ou caoutchouteuses, des évocations lointaines caractérisent les choix de cette récolte. Un après-midi j’ai ouvert une boîte en métal et je le regrette ; c’est à cet instant que le mystère du contenu que j’ai cueilli a disparu. Depuis je ne touche à rien sinon, dès mon retour, laver, essuyer, avant d’accommoder ma récolte sur la table rectangulaire comme vous l’avez relevé ; et c’est essentiel, le rectangle a de l’étendue, même quand il est petit, il est immense. Assez vaste en tout cas pour accueillir la diversité de mes amours.</p><p><em>Beaucoup de pièces déposées là sont à plat. Qu’est-ce qui préside à ce parti pris faisant s’apparenter la table, au final, plus à un tableau qu’à une sculpture ?</em></p><p>Dans mon sac à dos, vous trouverez du plastique, du métal, du carton mais pas de « parti pris des choses » ; cependant il est courant à table de mettre « les choses à plat » afin d’y « voir clair». La police sait de quoi je parle mais ici, fût-il de chasse, je ne vois ni tableau ni sculpture car l’ensemble est momentanément figé. Ce qui lentement gravite autour de la table, s’incline, va et vient et crée le mouvement sans y songer ; ce sont nos corps ; le pas ralentit, seul il s’organise. Les mains sont sages quand la tête fléchit pour que dans un détail, tout à l’heure invisible, les yeux s’égarent.</p><p><em>Comment situez-vous cette accumulation dans votre travail récent ? Une question qui se poursuit ? Un amusement indépendant ? Une autre voie qui apparaît ?</em></p><p>Dans l’idéal, c’est un peu décalé du centre d’une pièce où je vis que je dresse, tourne et me penche sur ce paysage ; un panorama qui ne me quitte pas et, comme les livres sur d’autres étagères, je le lis, le consulte, l’annote et l’enrichit. Qu’importe si la distance nous éloigne, si le temps nous sépare car c’est bien assez tôt que je rencontrerai, à l’angle d’une rue, un sujet qui tournera mes pensées vers lui puis, en fidèle compagnon, je reviendrai avec mon butin fleurir avec malice ce qui est, dans ce qui m’entoure, un repère qui ne trompe pas ; sans cette table je ne serai pas là.</p><p><em>Que comptez-vous faire de cette table avec ses pièces ? Sera-t-elle unique ? Est-elle prétexte à une parole ? Cette table garnie est-elle destinée à être montrée ou à faire parler (sur) Brian Mura ?</em></p><p>Ce qui doit être montré est écrit ici. À des dizaines de photographies, un ennuyeux catalogue, un vernissage par semaine, à de longues heures de vidéos, j’ai privilégié le mot avec pour unique sujet cette table et ce qu’elle contient.<br />Est à voir sans être vu, levé par quatre pieds à hauteur d’abdomen, l’instantané d’un paysage intérieur et extérieur sur lequel, avec cet entretien, j’ai ouvert plus grand les yeux.</p><p><em>Voilà une belle table bien dressée ; il ne manque que la nappe blanche et, avec tous ces objets ajustés dessus, se croirait-on au XVIIe hollandais ? Tout est à vendre n’est-ce pas ?</em></p><p>L’écho des marchands – comptoirs, vaisseaux, équipages, compas, longues-vues, peintures et cartes – me retient à Marseille quand, permanentes, les odeurs de savon, viande crue, grillée, grillée surtout, café, cardamome, coriandre, cumin, curry, égout, poisson, poubelle, anis, pisse et hasch se déchaînent. Ici la chair est en toute chose éclatante, excessive, passionnelle et me suggère ces gestes vifs dans une ville où l’air lui même est à pétrir.<br />Cet esprit, qui évoque le XVIIe hollandais, dit commerce, et dans ce cas, cher Monsieur, on ne vend pas au détail, c’est l’ensemble ou rien, car c’est un ensemble.</p><p><em>Vous avez bon goût, dans une brocante vous avez un bel étalage&#8230; Derrière je vois un escabeau, un sac et une petite boîte jaune. Parlez-m’en.</em></p><p>Un Hollandais vous affirmera que le mot brocante vient du mot « brok » et veut dire « morceau » ; ce morceau qui patiemment sur un bout de trottoir, tandis que j’erre le goût pour rien, guette pour faire signe avec cette inexplicable impression qu’une fois à table, nous nous attendions.<br />En coulisse, les choses s’entendent à l’image de cette table et le sac – l’escabeau, la boîte jaune comme les étagères – ont une raison d’être.</p><p><em>Vos objets sont arrachés du trottoir, du vulgus, vous les caressez du regard, seulement ?</em><br /><em>Le caoutchouc c’est doux, pourquoi cet attachement à cette matière réduite ?</em></p><p>À vous creuser de l’intérieur, amer, âpre, pâteux, légèrement pétrole, jusqu’à inquiéter vos plats avec son odeur écœurante mais, avec la langue c’est meilleur ; hier en transportant dix kilos de caoutchouc le chien de ma voisine m’a suivi.</p><p><em>Votre collection bien organisée et proprette serait-elle une &lsquo;Summa&rsquo; intuitive ?</em></p><p>Le livre est dans le ton de cette table et j’écris avec les moyens du bord.</p>								</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-47490f8 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="47490f8" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-4d38a0c elementor-widget elementor-widget-text-editor" data-id="4d38a0c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Prises de vue : Atelier.</p>								</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 message &#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 lemission de message</div>

          <div class="serie-meta">
                  <span>Chutes de papier découpé</span>
                  <span>Dimensions variables</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 lemission de message — 1"
      >
    
  
  
</div>

<!-- Grille mobile — images 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 lemission de message — 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.load();
        existing.play();
        return;
      }
      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.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
      if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Appareil permettant la réception et lemission de message — ' + (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 lemission de message — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Éclat</title>
		<link>https://brianmura.fr/video/eclat/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sun, 24 Aug 2025 11:29:19 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Éclat]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=7428</guid>

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

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

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

					<description><![CDATA[Homards Gloutons &#124; papier &#124; ~ 40 cm. x 4 cm.  &#124; 2018 - [...].]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6533" class="elementor elementor-6533">
				<div class="elementor-element elementor-element-6b84dbb 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="6b84dbb" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-d1d5112 elementor-widget elementor-widget-html" data-id="d1d5112" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="homards-viewer" class="serie-viewer">

  <aside id="homards-caption" class="serie-caption">

    <div class="serie-title">Homards gloutons</div>

          <div class="serie-meta">
                  <span>Chutes de dos de livres</span>
                  <span>~40 x 4 cm.</span>
                  <span>2018 - [...]</span>
              </div>
    
    
    
  </aside>


<div id="homards-stage" class="serie-stage">

  
          <img decoding="async"
        id="homards-img"
        class="serie-img"
        src="https://brianmura.fr/wp-content/uploads/2025/04/homard-1.jpg"
        alt="Homards gloutons — 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 -->
<div id="homards-mobile-grid" class="serie-mobile-grid">
      <img decoding="async"
      src="https://brianmura.fr/wp-content/uploads/2025/04/homard-1.jpg"
      alt="Homards gloutons — 1"
      class="serie-mobile-img"
      data-index="0"
    >
      <img decoding="async"
      src="https://brianmura.fr/wp-content/uploads/2025/04/homard-3.jpg"
      alt="Homards gloutons — 2"
      class="serie-mobile-img"
      data-index="1"
    >
      <img decoding="async"
      src="https://brianmura.fr/wp-content/uploads/2025/08/homard-7-e1754648192660.webp"
      alt="Homards gloutons — 3"
      class="serie-mobile-img"
      data-index="2"
    >
  </div>

<!-- Lightbox mobile -->
<div id="homards-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 = 'homards';
  const media    = [{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/04\/homard-1.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/04\/homard-3.jpg"},{"type":"image","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2025\/08\/homard-7-e1754648192660.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.load();
        existing.play();
        return;
      }
      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.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
      if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Homards gloutons — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Homards gloutons — ' + (current + 1);
      img.style.cursor = 'pointer';
      img.addEventListener('click', () => go(current + 1));
      if (existing) existing.replaceWith(img);
      else stage.prepend(img);
    }
  }

  function go(n) {
    current = (n + total) % total;
    getOrCreateMedia(media[current]);
    if (counter) counter.textContent = (current + 1) + ' / ' + total;
  }

  /* Clic sur l'image initiale = suivant */
  const initImg = document.getElementById(viewerId + '-img');
  if (initImg && initImg.tagName === 'IMG') {
    initImg.style.cursor = 'pointer';
    initImg.addEventListener('click', () => go(current + 1));
  }

  if (btnPrev) btnPrev.addEventListener('click', () => go(current - 1));
  if (btnNext) btnNext.addEventListener('click', () => go(current + 1));

  document.addEventListener('keydown', e => {
    if (e.key === 'ArrowLeft')  go(current - 1);
    if (e.key === 'ArrowRight') go(current + 1);
  });

  /* Swipe */
  let touchX = null;
  if (viewer) {
    viewer.addEventListener('touchstart', e => {
      touchX = e.touches[0].clientX;
    }, { passive: true });
    viewer.addEventListener('touchend', e => {
      if (touchX === null) return;
      const diff = touchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) go(current + (diff > 0 ? 1 : -1));
      touchX = null;
    }, { passive: true });
  }

  /* Player audio */
  const playerEl = document.getElementById(viewerId + '-player');
  if (playerEl) {
    const audioEl  = document.querySelector('#' + viewerId + '-viewer .serie-audio');
    const playBtn  = playerEl.querySelector('.sp-play');
    const playIcon = playerEl.querySelector('.sp-play-icon');
    const prevBtn  = playerEl.querySelector('.sp-prev');
    const nextBtn  = playerEl.querySelector('.sp-next');
    const tracks   = [...playerEl.querySelectorAll('.sp-track')];
    const timeCur  = playerEl.querySelector('.sp-cur');
    const timeTot  = playerEl.querySelector('.sp-tot');
    let   trackIdx = 0;

    function fmt(s) {
      if (isNaN(s) || !isFinite(s)) return '0:00';
      return Math.floor(s / 60) + ':' + String(Math.floor(s % 60)).padStart(2, '0');
    }

    function setIcon(playing) {
      playIcon.innerHTML = playing
        ? '<rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/>'
        : '<polygon points="5 3 19 12 5 21 5 3"/>';
    }

    function loadTrack(i) {
      trackIdx = i;
      audioEl.src = tracks[i].dataset.src;
      timeCur.textContent = '0:00';
      timeTot.textContent = '0:00';
      tracks.forEach((t, j) => t.classList.toggle('active', j === i));
    }

    playBtn.addEventListener('click',  () => { audioEl.paused ? audioEl.play() : audioEl.pause(); });
    audioEl.addEventListener('play',   () => setIcon(true));
    audioEl.addEventListener('pause',  () => setIcon(false));
    audioEl.addEventListener('timeupdate', () => {
      timeCur.textContent = fmt(audioEl.currentTime);
      timeTot.textContent = fmt(audioEl.duration);
    });
    audioEl.addEventListener('ended', () => {
      if (tracks.length < 2) return;
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    prevBtn.addEventListener('click', () => {
      loadTrack((trackIdx - 1 + tracks.length) % tracks.length);
      audioEl.play();
    });
    nextBtn.addEventListener('click', () => {
      loadTrack((trackIdx + 1) % tracks.length);
      audioEl.play();
    });
    tracks.forEach((t, i) => {
      t.addEventListener('click', () => { loadTrack(i); audioEl.play(); });
    });
    loadTrack(0);
  }
  
  
  /* ========================
     LIGHTBOX MOBILE
  ======================== */

  const mobileGrid = document.getElementById(viewerId + '-mobile-grid');
  const lightbox   = document.getElementById(viewerId + '-lightbox');

  if (mobileGrid && lightbox) {

    const lbImg     = lightbox.querySelector('.slb-img');
    const lbPrev    = lightbox.querySelector('.slb-prev');
    const lbNext    = lightbox.querySelector('.slb-next');
    const lbClose   = lightbox.querySelector('.slb-close');
    const lbCounter = lightbox.querySelector('.slb-counter');

    /* Uniquement les images — pas les vidéos */
    const imgItems = media.filter(m => m.type === 'image');
    let   lbCurrent = 0;

    function lbGo(n) {
      lbCurrent = (n + imgItems.length) % imgItems.length;
      lbImg.src = imgItems[lbCurrent].src;
      lbCounter.textContent = (lbCurrent + 1) + ' / ' + imgItems.length;
    }

    function openLightbox(index) {
      lbCurrent = index;
      lbImg.src = imgItems[index].src;
      lbCounter.textContent = (index + 1) + ' / ' + imgItems.length;
      lightbox.classList.add('open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.style.overflow = 'hidden';
    }

    function closeLightbox() {
      lightbox.classList.remove('open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.style.overflow = '';
    }

    /* Tap sur image → lightbox */
    mobileGrid.querySelectorAll('.serie-mobile-img').forEach((img, i) => {
      img.addEventListener('click', () => openLightbox(i));
    });

    lbClose.addEventListener('click', closeLightbox);
    lbPrev.addEventListener('click',  () => lbGo(lbCurrent - 1));
    lbNext.addEventListener('click',  () => lbGo(lbCurrent + 1));

    /* Swipe dans la lightbox */
    let lbTouchX = null;
    lightbox.addEventListener('touchstart', e => {
      lbTouchX = e.touches[0].clientX;
    }, { passive: true });
    lightbox.addEventListener('touchend', e => {
      if (lbTouchX === null) return;
      const diff = lbTouchX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 40) lbGo(lbCurrent + (diff > 0 ? 1 : -1));
      lbTouchX = null;
    }, { passive: true });

    /* Escape */
    document.addEventListener('keydown', e => {
      if (e.key === 'Escape' && lightbox.classList.contains('open')) closeLightbox();
    });

    /* Ferme au clic sur le fond */
    lightbox.addEventListener('click', e => {
      if (e.target === lightbox) closeLightbox();
    });
  }
  
}());
</script>				</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les Langues bleues de la Digue</title>
		<link>https://brianmura.fr/video/langues-bleues-de-la-digue/</link>
		
		<dc:creator><![CDATA[Brian Mura]]></dc:creator>
		<pubDate>Sun, 09 Feb 2025 08:55:45 +0000</pubDate>
				<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Les langues bleues de la digue]]></category>
		<guid isPermaLink="false">https://brianmura.fr/?p=416</guid>

					<description><![CDATA[Les Langues bleues de la digue &#124; tourné-monté &#124; son &#124; 2.23 min. &#124; 2005.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="416" class="elementor elementor-416">
				<div class="elementor-element elementor-element-a395f5b 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="a395f5b" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-31846c8 elementor-widget elementor-widget-html" data-id="31846c8" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					
<div id="langues-viewer" class="serie-viewer">

  <aside id="langues-caption" class="serie-caption">

    <div class="serie-title">Les langues bleues de la digue</div>

          <div class="serie-meta">
                  <span>Digue du Braek</span>
                  <span>2 mn 23 s</span>
                  <span>2005</span>
              </div>
    
    
    
  </aside>


<div id="langues-stage" class="serie-stage">

  
          <video
        id="langues-img"
        class="serie-img serie-video"
        src="https://brianmura.fr/wp-content/uploads/2024/12/vlc-record-2024-12-04-11h15m53s-flamme-online-video-cutter.com_.mp4"
        controls
        playsinline
        style="max-width:100%; max-height:100%; object-fit:contain;"
      ></video>

    
  
  
</div>

<!-- Grille mobile — images empilées -->
<div id="langues-mobile-grid" class="serie-mobile-grid">
  </div>

<!-- Lightbox mobile -->
<div id="langues-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 = 'langues';
  const media    = [{"type":"video","src":"https:\/\/brianmura.fr\/wp-content\/uploads\/2024\/12\/vlc-record-2024-12-04-11h15m53s-flamme-online-video-cutter.com_.mp4"}];
  const total    = media.length;
  let   current  = 0;

  const stage   = document.getElementById(viewerId + '-stage');
  const counter = stage ? stage.querySelector('.serie-counter') : null;
  const btnPrev = stage ? stage.querySelector('.serie-prev') : null;
  const btnNext = stage ? stage.querySelector('.serie-next') : null;
  const viewer  = document.getElementById(viewerId + '-viewer');

  function getOrCreateMedia(item) {
    const existing = document.getElementById(viewerId + '-img');

    if (item.type === 'video') {
      if (existing && existing.tagName === 'VIDEO') {
        existing.src = item.src;
        existing.load();
        existing.play();
        return;
      }
      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.style.cssText = 'max-width:100%; max-height:100%; object-fit:contain;';
      if (existing) existing.replaceWith(vid);
      else stage.prepend(vid);

    } else {
      if (existing && existing.tagName === 'IMG') {
        existing.src = item.src;
        existing.alt = 'Les langues bleues de la digue — ' + (current + 1);
        return;
      }
      const img = document.createElement('img');
      img.id        = viewerId + '-img';
      img.className = 'serie-img';
      img.src       = item.src;
      img.alt       = 'Les langues bleues de la digue — ' + (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>
