const TICKER_STYLE_ID="news-ticker-inline-styles",TICKER_ROOT_SELECTOR="[data-news-ticker]",TICKER_TRACK_SELECTOR="[data-news-track]",TICKER_CSS="\n.news-ticker {\n --ticker-surface: #ffffff;\n --ticker-text: #121217;\n --ticker-muted: rgba(63, 62, 80, 0.66);\n --ticker-border: rgba(63, 62, 80, 0.1);\n position: relative;\n display: block;\n width: 100%;\n margin: 0 auto;\n overflow: hidden;\n border: 1px solid var(--ticker-border);\n border-radius: 1em;\n background: var(--ticker-surface);\n color: var(--ticker-text);\n font-family: 'Untitled Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\n.news-ticker,\n.news-ticker * {\n box-sizing: border-box;\n}\n\n.news-ticker::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n}\n\n.news-ticker__shell {\n position: relative;\n display: flex;\n align-items: center;\n min-height: 54px;\n}\n\n.news-ticker__brand {\n flex: 0 0 126px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 16px 8px 12px;\n border-right: 1px solid rgba(18, 18, 18, 0.08);\n background: transparent;\n}\n\n.news-ticker__label {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n box-shadow: none;\n color: #111111;\n font-family: 'PP Editorial New', Baskerville, 'Times New Roman', serif;\n font-size: 0.95rem;\n font-weight: 700;\n letter-spacing: 0.01em;\n line-height: 1;\n white-space: nowrap;\n}\n\n.news-ticker__content {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n align-items: center;\n padding: 7px 12px;\n}\n\n.news-ticker__viewport {\n width: 100%;\n min-width: 0;\n overflow: hidden;\n}\n\n.news-ticker__track {\n display: flex;\n align-items: center;\n gap: 6px;\n width: max-content;\n}\n\n.news-ticker__track.is-ready {\n animation: ticker-scroll var(--ticker-duration, 28s) linear infinite;\n}\n\n.news-ticker__sequence {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.news-ticker__group {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.news-ticker__item {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n min-width: 0;\n white-space: nowrap;\n}\n\n.news-ticker__source {\n color: var(--ticker-text);\n font-family: 'Untitled Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-size: 0.74rem;\n font-weight: 600;\n line-height: 1.05;\n letter-spacing: 0.02em;\n padding-left: 0.65rem;\n text-transform: uppercase;\n transform: translateY(0.05em);\n}\n\n.news-ticker__date {\n color: var(--ticker-muted);\n font-family: 'Untitled Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-size: 0.82rem;\n font-weight: 500;\n letter-spacing: 0.02em;\n line-height: 1.05;\n padding-left: 0.4rem;\n transform: translateY(0.05em);\n}\n\n.news-ticker__separator {\n color: rgba(127, 121, 201, 0.58);\n font-size: 0.82rem;\n line-height: 1;\n flex-shrink: 0;\n user-select: none;\n align-self: center;\n}\n\n.news-ticker__title {\n color: var(--ticker-text);\n font-family: 'Untitled Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-size: clamp(0.9rem, 0.95vw, 1.02rem);\n line-height: 1.15;\n font-weight: 400;\n letter-spacing: -0.02em;\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.news-ticker__status {\n color: rgba(127, 121, 201, 0.76);\n font-family: 'Untitled Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-size: 0.88rem;\n white-space: nowrap;\n line-height: 1;\n}\n\n@keyframes ticker-scroll {\n from {\n transform: translateX(0);\n }\n\n to {\n transform: translateX(calc(-1 * var(--ticker-loop-distance, 0px)));\n }\n}\n\n@media (max-width: 720px) {\n .news-ticker__shell {\n flex-direction: row;\n }\n\n .news-ticker__brand {\n flex-basis: 112px;\n justify-content: center;\n padding: 7px 14px 7px 10px;\n }\n\n .news-ticker__label {\n align-self: center;\n text-align: center;\n padding: 0;\n font-size: 0.88rem;\n color: #111111;\n }\n\n .news-ticker__content {\n padding: 7px 9px;\n }\n\n .news-ticker__track,\n .news-ticker__sequence,\n .news-ticker__group {\n gap: 6px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .news-ticker__track {\n width: 100%;\n overflow-x: auto;\n scrollbar-width: thin;\n }\n\n .news-ticker__track.is-ready {\n animation: none;\n }\n}\n";function isRecord(e){return Boolean(e)&&"object"==typeof e&&!Array.isArray(e)}function normalizeLocale(e){return String(e||"fr").trim().toLowerCase().slice(0,2)}function getTickerLocale(e){return normalizeLocale(document.documentElement.lang||"fr")}const MOJIBAKE_PATTERN=/[ÃÂâ€]/,SUSPICIOUS_TEXT_PATTERN=/[ÃÂâ€\uFFFD]/g;function repairMojibakeText(e){if("string"!=typeof e)return"";const n=e.trim();if(!n||!MOJIBAKE_PATTERN.test(n))return n;try{const e=Uint8Array.from(n,e=>255&e.charCodeAt(0)),t=new TextDecoder("utf-8").decode(e).trim();return t&&t!==n?MOJIBAKE_PATTERN.test(t)?n:t:n}catch{return n}}function sanitizeTickerText(e){if("string"!=typeof e)return"";const n=e.trim();if(!n)return"";const t=[n,repairMojibakeText(n)],r=Uint8Array.from(n,e=>255&e.charCodeAt(0)),i=["utf-8","windows-1252","iso-8859-1"];for(const e of i)try{t.push(new TextDecoder(e).decode(r).trim())}catch{continue}let a=n,s=scoreTickerText(n);for(const e of t){if("string"!=typeof e||!e)continue;const n=scoreTickerText(e);n{const t=e[e.length-1];return t&&t.date===n.date?(t.items.push(n),e):(e.push({date:n.date,items:[n]}),e)},[])}function getLocalizedTitle(e,n){if(!isRecord(e))return"";const t=e[n]&&"string"==typeof e[n].title?e[n].title:"";return sanitizeTickerText(t||("string"==typeof e.title?e.title:""))}function normalizeNewsItem(e,n){if(!isRecord(e))return null;const t="string"==typeof e.id?e.id.trim():"",r=sanitizeTickerText(e.source),i=getLocalizedTitle(e,n),a=parseNewsDate(e.date);return t&&r&&i&&a?{id:t,source:r,title:i,date:a.key}:null}function normalizeNewsItems(e,n){return Array.isArray(e)?e.reduce((e,t)=>{const r=normalizeNewsItem(t,n);return r&&e.push(r),e},[]):[]}function normalizeNewsBlock(e,n){return Array.isArray(e)?{updated_at:n||null,items:normalizeNewsItems(e,"fr")}:isRecord(e)?{updated_at:"string"==typeof e.updated_at?e.updated_at:n||null,items:normalizeNewsItems(e.items,"fr")}:{updated_at:n||null,items:[]}}function unwrapNewsPayload(e){return Array.isArray(e)?unwrapNewsPayload(e[0]):isRecord(e)?isRecord(e.news)?unwrapNewsPayload(e.news):e:null}function normalizeNewsData(e){const n=unwrapNewsPayload(e);return n?Array.isArray(n.items)?{fr:{updated_at:"string"==typeof n.updated_at?n.updated_at:null,items:normalizeNewsItems(n.items,"fr")},en:{updated_at:"string"==typeof n.updated_at?n.updated_at:null,items:normalizeNewsItems(n.items,"en")}}:Array.isArray(n.fr)||Array.isArray(n.en)?{fr:{updated_at:"string"==typeof n.updated_at?n.updated_at:null,items:normalizeNewsItems(n.fr,"fr")},en:{updated_at:"string"==typeof n.updated_at?n.updated_at:null,items:normalizeNewsItems(n.en,"en")}}:{fr:normalizeNewsBlock(n.fr,n.updated_at),en:normalizeNewsBlock(n.en,n.updated_at)}:{fr:{updated_at:null,items:[]},en:{updated_at:null,items:[]}}}function createSeparator(){const e=document.createElement("span");return e.className="news-ticker__separator",e.setAttribute("aria-hidden","true"),e.textContent="|",e}function buildNewsEntry(e,n){const t=document.createElement("div");t.className="news-ticker__item",t.setAttribute("aria-label","en"===n?"News item":"Nouvelle");const r=document.createElement("span");r.className="news-ticker__source",r.textContent=e.source||"Source";const i=document.createElement("span");return i.className="news-ticker__title",i.textContent=e.title,t.append(r,createSeparator(),i),t}function buildNewsGroup(e,n){const t=document.createElement("div");t.className="news-ticker__group",t.setAttribute("aria-label","en"===n?`News from ${formatNewsDate(e.date,n)}`:`Nouvelles du ${formatNewsDate(e.date,n)}`);const r=document.createElement("span");return r.className="news-ticker__date",r.textContent=formatNewsDate(e.date,n),t.append(r,createSeparator()),e.items.forEach((r,i)=>{t.append(buildNewsEntry(r,n)),i{e.isConnected&&(updateTickerMotion(e,n),e.classList.add("is-ready"),document.fonts&&"function"==typeof document.fonts.ready?.then&&document.fonts.ready.then(()=>{e.isConnected&&updateTickerMotion(e,n)}).catch(()=>{}))})}async function loadNewsData(e){if(!e)throw new Error("Missing news source.");const n=await fetch(e);if(!n.ok)throw new Error("Unable to load the news JSON.");return normalizeNewsData(await readJsonResponse(n))}function getResponseCharset(e){const n=e.headers.get("content-type")||"",t=/charset=([^;]+)/i.exec(n);return t?t[1].trim().toLowerCase():""}function decodeResponseText(e,n){return new TextDecoder(n||"utf-8").decode(e)}async function readJsonResponse(e){const n=await e.arrayBuffer(),t=getResponseCharset(e),r=[];t&&r.push(t),r.push("utf-8","windows-1252","iso-8859-1");const i=[...new Set(r)];let a=null,s=null;for(const e of i)try{const t=decodeResponseText(n,e),r=JSON.parse(t);if(!t.includes("�"))return r;s=r}catch(e){a=e}if(s)return s;if(a)throw new Error(`Unable to parse news JSON: ${a.message}`);throw new Error("Unable to parse news JSON.")}function injectTickerStyles(){if(document.getElementById(TICKER_STYLE_ID))return;const e=document.createElement("style");e.id=TICKER_STYLE_ID,e.textContent=TICKER_CSS,document.head.append(e)}function buildTickerShell(e){e.classList.add("news-ticker"),e.innerHTML='\n
\n
\n
\n
\n
\n
\n
\n
Chargement des actualites...
\n
\n
\n
\n
\n '}function ensureTickerMarkup(e){e.classList.add("news-ticker"),e.querySelector("[data-news-track]")||buildTickerShell(e)}function renderStatus(e,n){e.replaceChildren();const t=document.createElement("div");t.className="news-ticker__status",t.setAttribute("role","status"),t.textContent=n,e.append(t)}function renderTicker(e,n,t){const r=n&&"object"==typeof n?n[t]||n.fr:null,i=(Array.isArray(r&&r.items)?r.items:[]).filter(e=>e&&e.title&&e.date&&e.source).sort((e,n)=>n.date.localeCompare(e.date));if(e.classList.remove("is-ready"),e.replaceChildren(),!i.length)return void renderStatus(e,"en"===t?"No news available right now.":"Aucune actualite pour le moment.");const a=document.createElement("div");a.className="news-ticker__sequence",groupNewsByDate(i).forEach(e=>{a.append(createSeparator()),a.append(buildNewsGroup(e,t))}),e.append(a,cloneTrack(a)),scheduleTickerMotion(e,a)}function updateTickerLabel(e,n){const t=e.querySelector(".news-ticker__label");t&&(t.textContent="en"===n?"AI News":"Actualités IA")}function updateLoadingStatus(e,n){const t=e.querySelector(".news-ticker__status");t&&(t.textContent="en"===n?"Loading news...":"Chargement des actualites...")}async function initNewsTicker(e){ensureTickerMarkup(e);const n=getTickerLocale(e),t=e.querySelector("[data-news-track]");if(t){updateTickerLabel(e,n),updateLoadingStatus(e,n);try{const r=e.dataset.source;renderTicker(t,await loadNewsData(r),n)}catch(e){console.warn("News ticker load failed:",e),renderStatus(t,"en"===n?"Unable to load news right now.":"Impossible de charger les actualites.")}}}function bootNewsTicker(){injectTickerStyles();document.querySelectorAll("[data-news-ticker]").forEach(e=>{initNewsTicker(e)})}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",bootNewsTicker,{once:!0}):bootNewsTicker();