{"id":2,"date":"2026-07-28T15:31:36","date_gmt":"2026-07-28T15:31:36","guid":{"rendered":"http:\/\/demo.digicomvision.com\/?page_id=2"},"modified":"2026-07-28T20:34:50","modified_gmt":"2026-07-28T20:34:50","slug":"sample-page","status":"publish","type":"page","link":"https:\/\/demo.digicomvision.com\/","title":{"rendered":"Accueil"},"content":{"rendered":"\n<style>\n  #digi-carousel {\n    position: relative;\n    width: 100%;\n    max-width: 1100px;\n    min-height: 520px;\n    margin: 0 auto;\n    overflow: hidden;\n    border-radius: 12px;\n    background: #e5e5e5;\n  }\n\n  #digi-carousel * {\n    box-sizing: border-box;\n  }\n\n  .digi-carousel-track {\n    display: flex;\n    min-height: 520px;\n    transition: transform 0.7s ease;\n  }\n\n  .digi-carousel-slide {\n    position: relative;\n    flex: 0 0 100%;\n    min-width: 100%;\n    min-height: 520px;\n  }\n\n  .digi-carousel-image {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n  }\n\n  .digi-carousel-overlay {\n    position: absolute;\n    inset: 0;\n    background: linear-gradient(\n      90deg,\n      rgba(0, 0, 0, 0.82) 0%,\n      rgba(0, 0, 0, 0.48) 55%,\n      rgba(0, 0, 0, 0.08) 100%\n    );\n  }\n\n  .digi-carousel-content {\n    position: relative;\n    z-index: 2;\n    display: flex;\n    min-height: 520px;\n    max-width: 680px;\n    flex-direction: column;\n    justify-content: center;\n    align-items: flex-start;\n    padding: 55px 70px;\n    color: white;\n  }\n\n  .digi-carousel-label {\n    margin: 0 0 12px;\n    color: white;\n    font-size: 14px;\n    font-weight: 700;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n  }\n\n  .digi-carousel-title {\n    margin: 0 0 20px;\n    color: white !important;\n    font-size: clamp(36px, 6vw, 68px);\n    line-height: 1.05;\n  }\n\n  .digi-carousel-excerpt {\n    margin: 0 0 28px;\n    color: white;\n    font-size: 18px;\n    line-height: 1.6;\n  }\n\n  .digi-carousel-link {\n    display: inline-block;\n    padding: 12px 22px;\n    border: 2px solid white;\n    color: white !important;\n    font-weight: 700;\n    text-decoration: none;\n  }\n\n  .digi-carousel-link:hover {\n    background: white;\n    color: #222 !important;\n  }\n\n  .digi-carousel-arrow {\n    position: absolute;\n    z-index: 5;\n    top: 50%;\n    width: 46px;\n    height: 46px;\n    padding: 0;\n    border: 0;\n    border-radius: 50%;\n    background: rgba(255, 255, 255, 0.9);\n    color: #222;\n    font-size: 26px;\n    cursor: pointer;\n    transform: translateY(-50%);\n  }\n\n  .digi-carousel-prev {\n    left: 18px;\n  }\n\n  .digi-carousel-next {\n    right: 18px;\n  }\n\n  .digi-carousel-dots {\n    position: absolute;\n    z-index: 5;\n    right: 0;\n    bottom: 20px;\n    left: 0;\n    display: flex;\n    justify-content: center;\n    gap: 9px;\n  }\n\n  .digi-carousel-dot {\n    width: 10px;\n    height: 10px;\n    padding: 0;\n    border: 0;\n    border-radius: 50%;\n    background: rgba(255, 255, 255, 0.5);\n    cursor: pointer;\n  }\n\n  .digi-carousel-dot.active {\n    width: 28px;\n    border-radius: 10px;\n    background: white;\n  }\n\n  .digi-carousel-message {\n    display: grid;\n    min-height: 520px;\n    place-items: center;\n    padding: 30px;\n    text-align: center;\n  }\n\n  @media (max-width: 700px) {\n    #digi-carousel,\n    .digi-carousel-track,\n    .digi-carousel-slide,\n    .digi-carousel-content {\n      min-height: 440px;\n    }\n\n    .digi-carousel-overlay {\n      background: rgba(0, 0, 0, 0.62);\n    }\n\n    .digi-carousel-content {\n      justify-content: flex-end;\n      max-width: none;\n      padding: 35px 25px 65px;\n    }\n\n    .digi-carousel-title {\n      font-size: 34px;\n    }\n\n    .digi-carousel-excerpt {\n      font-size: 16px;\n    }\n\n    .digi-carousel-arrow {\n      display: none;\n    }\n  }\n<\/style>\n\n<section id=\"digi-carousel\" aria-label=\"Carrousel des actualit\u00e9s\">\n  <div class=\"digi-carousel-track\"><\/div>\n\n  <button class=\"digi-carousel-arrow digi-carousel-prev\" type=\"button\" aria-label=\"Actualit\u00e9 pr\u00e9c\u00e9dente\">\n    \u2039\n  <\/button>\n\n  <button class=\"digi-carousel-arrow digi-carousel-next\" type=\"button\" aria-label=\"Actualit\u00e9 suivante\">\n    \u203a\n  <\/button>\n\n  <div class=\"digi-carousel-dots\"><\/div>\n<\/section>\n\n<script>\n(function () {\n  const ACTUALITES_URL = \"\/index.php\/actualites\/\";\n  const carousel = document.querySelector(\"#digi-carousel\");\n\n  if (!carousel) {\n    return;\n  }\n\n  if (carousel.dataset.loaded === \"true\") {\n    return;\n  }\n\n  carousel.dataset.loaded = \"true\";\n\n  const track = carousel.querySelector(\".digi-carousel-track\");\n  const dotsContainer = carousel.querySelector(\".digi-carousel-dots\");\n  const previousButton = carousel.querySelector(\".digi-carousel-prev\");\n  const nextButton = carousel.querySelector(\".digi-carousel-next\");\n\n  let currentSlide = 0;\n  let realSlideCount = 0;\n  let autoplay = null;\n  let animationRunning = false;\n\n  function cleanText(text) {\n    return String(text || \"\")\n      .replace(\/\\s+\/g, \" \")\n      .trim();\n  }\n\n  function absoluteUrl(url, baseUrl) {\n    try {\n      const base = baseUrl\n        ? new URL(baseUrl, window.location.origin).href\n        : window.location.origin;\n\n      return new URL(url, base).href;\n    } catch (error) {\n      return \"\";\n    }\n  }\n\n  function isUsableLink(url) {\n    if (!url) {\n      return false;\n    }\n\n    if (url.startsWith(\"#\")) {\n      return false;\n    }\n\n    if (url.startsWith(\"mailto:\")) {\n      return false;\n    }\n\n    if (url.startsWith(\"tel:\")) {\n      return false;\n    }\n\n    if (url.startsWith(\"javascript:\")) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function bestImageSource(image, pageUrl) {\n    if (!image) {\n      return \"\";\n    }\n\n    const srcset = image.getAttribute(\"srcset\");\n\n    if (srcset) {\n      const candidates = srcset\n        .split(\",\")\n        .map(function (candidate) {\n          const parts = candidate.trim().split(\/\\s+\/);\n          const source = parts[0] || \"\";\n          const descriptor = parts[1] || \"0w\";\n          const width = parseInt(descriptor, 10) || 0;\n\n          return {\n            source: source,\n            width: width\n          };\n        })\n        .filter(function (candidate) {\n          return Boolean(candidate.source);\n        })\n        .sort(function (first, second) {\n          return second.width - first.width;\n        });\n\n      if (candidates.length) {\n        return absoluteUrl(candidates[0].source, pageUrl);\n      }\n    }\n\n    const source =\n      image.getAttribute(\"data-lazy-src\") ||\n      image.getAttribute(\"data-src\") ||\n      image.getAttribute(\"src\");\n\n    return absoluteUrl(source, pageUrl);\n  }\n\n  function extractDateSuffix(articleTitle) {\n    const separator = \" \u2013 \";\n\n    if (articleTitle.indexOf(separator) === -1) {\n      return \"\";\n    }\n\n    const parts = articleTitle.split(separator);\n    const suffix = cleanText(parts[parts.length - 1]);\n\n    if (!suffix) {\n      return \"\";\n    }\n\n    if (!\/\\d{4}\/.test(suffix)) {\n      return \"\";\n    }\n\n    return suffix;\n  }\n\n  function makeSlideTitle(\n    articleTitle,\n    targetTitle,\n    linkText,\n    linkCount\n  ) {\n    if (linkCount === 1) {\n      return articleTitle || targetTitle || linkText;\n    }\n\n    let title = targetTitle || linkText || articleTitle;\n    const dateSuffix = extractDateSuffix(articleTitle);\n\n    if (!dateSuffix) {\n      return title;\n    }\n\n    if (title.indexOf(dateSuffix) !== -1) {\n      return title;\n    }\n\n    return title + \" \u2013 \" + dateSuffix;\n  }\n\n  function pageTitle(page, fallbackTitle) {\n    const titleElement =\n      page.querySelector(\"h1.entry-title\") ||\n      page.querySelector(\".entry-title\") ||\n      page.querySelector(\"main h1\") ||\n      page.querySelector(\"h1\");\n\n    if (!titleElement) {\n      return fallbackTitle;\n    }\n\n    return cleanText(titleElement.textContent) || fallbackTitle;\n  }\n\n  function pageSummary(page, fallbackSummary) {\n    const paragraphs = Array.from(\n      page.querySelectorAll(\".entry-content p, main p\")\n    );\n\n    const usefulParagraph = paragraphs.find(function (paragraph) {\n      const text = cleanText(paragraph.textContent);\n      return text.length >= 25;\n    });\n\n    if (usefulParagraph) {\n      return cleanText(usefulParagraph.textContent);\n    }\n\n    return fallbackSummary;\n  }\n\n  function pageImage(page, pageUrl) {\n    const image =\n      page.querySelector(\".entry-content img\") ||\n      page.querySelector(\"article .entry-content img\") ||\n      page.querySelector(\"main article img\") ||\n      page.querySelector(\"main img\");\n\n    return bestImageSource(image, pageUrl);\n  }\n\n  function updateDots() {\n    const visibleIndex =\n      currentSlide === realSlideCount ? 0 : currentSlide;\n\n    dotsContainer\n      .querySelectorAll(\".digi-carousel-dot\")\n      .forEach(function (dot, index) {\n        dot.classList.toggle(\n          \"active\",\n          index === visibleIndex\n        );\n      });\n  }\n\n  function goToNextSlide() {\n    if (animationRunning) {\n      return;\n    }\n\n    if (realSlideCount < 2) {\n      return;\n    }\n\n    animationRunning = true;\n    currentSlide += 1;\n\n    track.style.transition = \"transform 0.7s ease\";\n    track.style.transform =\n      \"translateX(-\" + currentSlide * 100 + \"%)\";\n\n    updateDots();\n  }\n\n  function goToPreviousSlide() {\n    if (animationRunning) {\n      return;\n    }\n\n    if (realSlideCount < 2) {\n      return;\n    }\n\n    animationRunning = true;\n\n    if (currentSlide === 0) {\n      track.style.transition = \"none\";\n      currentSlide = realSlideCount;\n      track.style.transform =\n        \"translateX(-\" + currentSlide * 100 + \"%)\";\n\n      void track.offsetWidth;\n    }\n\n    currentSlide -= 1;\n\n    track.style.transition = \"transform 0.7s ease\";\n    track.style.transform =\n      \"translateX(-\" + currentSlide * 100 + \"%)\";\n\n    updateDots();\n  }\n\n  function stopAutoplay() {\n    if (!autoplay) {\n      return;\n    }\n\n    window.clearInterval(autoplay);\n    autoplay = null;\n  }\n\n  function startAutoplay() {\n    stopAutoplay();\n\n    if (realSlideCount < 2) {\n      return;\n    }\n\n    autoplay = window.setInterval(function () {\n      goToNextSlide();\n    }, 5000);\n  }\n\n  function createSlide(item, index) {\n    const slide = document.createElement(\"article\");\n    slide.className = \"digi-carousel-slide\";\n\n    const image = document.createElement(\"img\");\n    image.className = \"digi-carousel-image\";\n    image.src = item.image;\n    image.alt = item.title;\n    image.loading = index === 0 ? \"eager\" : \"lazy\";\n\n    const overlay = document.createElement(\"div\");\n    overlay.className = \"digi-carousel-overlay\";\n\n    const content = document.createElement(\"div\");\n    content.className = \"digi-carousel-content\";\n\n    const label = document.createElement(\"p\");\n    label.className = \"digi-carousel-label\";\n    label.textContent = \"Actualit\u00e9\";\n\n    const title = document.createElement(\"h2\");\n    title.className = \"digi-carousel-title\";\n    title.textContent = item.title;\n\n    const link = document.createElement(\"a\");\n    link.className = \"digi-carousel-link\";\n    link.href = item.link;\n    link.textContent = \"Plus de d\u00e9tails\";\n    link.setAttribute(\n      \"aria-label\",\n      \"Plus de d\u00e9tails sur \" + item.title\n    );\n\n    content.appendChild(label);\n    content.appendChild(title);\n\n    if (item.excerpt) {\n      const excerpt = document.createElement(\"p\");\n      excerpt.className = \"digi-carousel-excerpt\";\n      excerpt.textContent = item.excerpt;\n      content.appendChild(excerpt);\n    }\n\n    content.appendChild(link);\n    slide.appendChild(image);\n    slide.appendChild(overlay);\n    slide.appendChild(content);\n\n    return slide;\n  }\n\n  function showError(message) {\n    track.innerHTML =\n      '<div class=\"digi-carousel-message\">' +\n      message +\n      \"<\/div>\";\n\n    previousButton.hidden = true;\n    nextButton.hidden = true;\n    dotsContainer.hidden = true;\n  }\n\n  function uniqueLinks(links) {\n    const seen = new Set();\n\n    return links.filter(function (link) {\n      if (seen.has(link.url)) {\n        return false;\n      }\n\n      seen.add(link.url);\n      return true;\n    });\n  }\n\n  function linksFromArticle(article, postUrl) {\n    const content =\n      article.querySelector(\n        \".wp-block-latest-posts__post-full-content\"\n      ) ||\n      article.querySelector(\n        \".wp-block-latest-posts__post-excerpt\"\n      ) ||\n      article;\n\n    const links = Array.from(\n      content.querySelectorAll(\"a[href]\")\n    )\n      .map(function (anchor) {\n        const rawUrl = anchor.getAttribute(\"href\");\n\n        if (!isUsableLink(rawUrl)) {\n          return null;\n        }\n\n        const url = absoluteUrl(rawUrl, ACTUALITES_URL);\n\n        if (!url) {\n          return null;\n        }\n\n        if (url === postUrl) {\n          return null;\n        }\n\n        try {\n          if (new URL(url).origin !== window.location.origin) {\n            return null;\n          }\n        } catch (error) {\n          return null;\n        }\n\n        return {\n          url: url,\n          text: cleanText(anchor.textContent)\n        };\n      })\n      .filter(Boolean);\n\n    return uniqueLinks(links);\n  }\n\n  function loadTargetSlide(\n    target,\n    articleTitle,\n    fallbackSummary,\n    fallbackImage,\n    linkCount\n  ) {\n    return fetch(target.url, {\n      credentials: \"same-origin\"\n    })\n      .then(function (response) {\n        if (!response.ok) {\n          return null;\n        }\n\n        return response.text();\n      })\n      .then(function (html) {\n        if (!html) {\n          return null;\n        }\n\n        const page = new DOMParser().parseFromString(\n          html,\n          \"text\/html\"\n        );\n\n        const targetTitle = pageTitle(page, target.text);\n        const title = makeSlideTitle(\n          articleTitle,\n          targetTitle,\n          target.text,\n          linkCount\n        );\n\n        const image =\n          pageImage(page, target.url) || fallbackImage;\n\n        if (!image) {\n          return null;\n        }\n\n        return {\n          title: title,\n          excerpt: pageSummary(\n            page,\n            linkCount > 1 ? \"\" : fallbackSummary\n          ),\n          image: image,\n          link: target.url\n        };\n      })\n      .catch(function () {\n        return null;\n      });\n  }\n\n  track.addEventListener(\"transitionend\", function () {\n    animationRunning = false;\n\n    if (currentSlide !== realSlideCount) {\n      return;\n    }\n\n    track.style.transition = \"none\";\n    currentSlide = 0;\n    track.style.transform = \"translateX(0)\";\n\n    void track.offsetWidth;\n\n    track.style.transition = \"transform 0.7s ease\";\n    updateDots();\n  });\n\n  fetch(ACTUALITES_URL, {\n    credentials: \"same-origin\"\n  })\n    .then(function (response) {\n      if (!response.ok) {\n        throw new Error(\"Page Actualit\u00e9s inaccessible\");\n      }\n\n      return response.text();\n    })\n    .then(function (html) {\n      const page = new DOMParser().parseFromString(\n        html,\n        \"text\/html\"\n      );\n\n      const articleElements = Array.from(\n        page.querySelectorAll(\n          \".wp-block-latest-posts__list li\"\n        )\n      );\n\n      if (!articleElements.length) {\n        throw new Error(\"Aucune actualit\u00e9 trouv\u00e9e\");\n      }\n\n      const articleJobs = articleElements.map(function (article) {\n        const titleLink = article.querySelector(\n          \".wp-block-latest-posts__post-title\"\n        );\n\n        if (!titleLink) {\n          return Promise.resolve([]);\n        }\n\n        const articleTitle = cleanText(\n          titleLink.textContent\n        );\n\n        const postUrl = absoluteUrl(\n          titleLink.getAttribute(\"href\"),\n          ACTUALITES_URL\n        );\n\n        const articleImage = bestImageSource(\n          article.querySelector(\n            \".wp-block-latest-posts__featured-image img\"\n          ),\n          ACTUALITES_URL\n        );\n\n        const contentElement =\n          article.querySelector(\n            \".wp-block-latest-posts__post-full-content\"\n          ) ||\n          article.querySelector(\n            \".wp-block-latest-posts__post-excerpt\"\n          );\n\n        const articleSummary = contentElement\n          ? cleanText(contentElement.textContent)\n          : \"\";\n\n        const targets = linksFromArticle(\n          article,\n          postUrl\n        );\n\n        if (!targets.length) {\n          if (!articleImage) {\n            return Promise.resolve([]);\n          }\n\n          return Promise.resolve([\n            {\n              title: articleTitle,\n              excerpt: articleSummary,\n              image: articleImage,\n              link: postUrl\n            }\n          ]);\n        }\n\n        const targetJobs = targets.map(function (target) {\n          return loadTargetSlide(\n            target,\n            articleTitle,\n            articleSummary,\n            articleImage,\n            targets.length\n          );\n        });\n\n        return Promise.all(targetJobs).then(function (slides) {\n          return slides.filter(Boolean);\n        });\n      });\n\n      return Promise.all(articleJobs);\n    })\n    .then(function (articleSlideGroups) {\n      const items = articleSlideGroups\n        .reduce(function (allSlides, slides) {\n          return allSlides.concat(slides);\n        }, [])\n        .slice(0, 12);\n\n      if (!items.length) {\n        showError(\n          \"Impossible de charger les images des actualit\u00e9s.\"\n        );\n        return;\n      }\n\n      realSlideCount = items.length;\n\n      items.forEach(function (item, index) {\n        track.appendChild(createSlide(item, index));\n\n        const dot = document.createElement(\"span\");\n        dot.className = \"digi-carousel-dot\";\n        dot.setAttribute(\"aria-hidden\", \"true\");\n        dotsContainer.appendChild(dot);\n      });\n\n      if (realSlideCount > 1) {\n        const firstSlideClone =\n          track.firstElementChild.cloneNode(true);\n\n        firstSlideClone.setAttribute(\n          \"aria-hidden\",\n          \"true\"\n        );\n\n        track.appendChild(firstSlideClone);\n      } else {\n        previousButton.hidden = true;\n        nextButton.hidden = true;\n        dotsContainer.hidden = true;\n      }\n\n      previousButton.addEventListener(\n        \"click\",\n        function () {\n          goToPreviousSlide();\n          startAutoplay();\n        }\n      );\n\n      nextButton.addEventListener(\n        \"click\",\n        function () {\n          goToNextSlide();\n          startAutoplay();\n        }\n      );\n\n      carousel.addEventListener(\n        \"mouseenter\",\n        stopAutoplay\n      );\n\n      carousel.addEventListener(\n        \"mouseleave\",\n        startAutoplay\n      );\n\n      carousel.addEventListener(\n        \"touchstart\",\n        stopAutoplay,\n        { passive: true }\n      );\n\n      carousel.addEventListener(\n        \"touchend\",\n        startAutoplay,\n        { passive: true }\n      );\n\n      track.style.transform = \"translateX(0)\";\n      updateDots();\n      startAutoplay();\n    })\n    .catch(function (error) {\n      console.error(\"Erreur du carrousel :\", error);\n      showError(\"Impossible de charger les actualit\u00e9s.\");\n    });\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u2039 \u203a<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-2","page","type-page","status-publish"],"_links":{"self":[{"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/pages\/2","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/comments?post=2"}],"version-history":[{"count":14,"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/pages\/2\/revisions"}],"predecessor-version":[{"id":84,"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/pages\/2\/revisions\/84"}],"wp:attachment":[{"href":"https:\/\/demo.digicomvision.com\/index.php\/wp-json\/wp\/v2\/media?parent=2"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}