{"id":689,"date":"2025-11-09T20:47:19","date_gmt":"2025-11-09T19:47:19","guid":{"rendered":"https:\/\/fribourg360.ch\/?page_id=689"},"modified":"2026-02-21T17:50:36","modified_gmt":"2026-02-21T16:50:36","slug":"evenements","status":"publish","type":"page","link":"https:\/\/fribourg360.ch\/de\/evenements\/","title":{"rendered":"Events"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"689\" class=\"elementor elementor-689\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f63e49e e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"f63e49e\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c2179e7 elementor-hidden-widescreen elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-html\" data-id=\"c2179e7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n\n<div id=\"map-wrap\" style=\"z-index:10; width:100%; position:relative; margin-top:-90px; margin-bottom: 40px;\">\n  <div id=\"map\" style=\"font-family:'Raleway', sans-serif; width:100%; height:500px; background:#f6f6f6; border-bottom:1px solid #eaeaea; box-shadow: 0 10px 30px rgba(0,0,0,0.08);\"><\/div>\n  <div id=\"map-error\" style=\"color:#fff; background:#b71c1c; padding:15px; display:none; text-align:center; font-weight:bold;\"><\/div>\n<\/div>\n\n<style>\n  .custom-map-popup .leaflet-popup-content-wrapper { padding: 0; border-radius: 12px; overflow: hidden; box-shadow: 0 10px 25px rgba(0,0,0,0.2); }\n  .custom-map-popup .leaflet-popup-content { margin: 0; width: 280px !important; }\n  .popup-image { width: 100%; height: 140px; object-fit: cover; display: block; }\n  .popup-body { padding: 15px; font-family: 'Raleway', sans-serif; }\n  .popup-title { font-size: 1.15em; font-weight: 800; color: #1a1a1a; margin: 0 0 10px 0; text-transform: uppercase; }\n  .popup-info { font-size: 0.9em; color: #666; margin: 0 0 5px 0; }\n  .popup-btn { display: block; text-align: center; background: #FF3200; color: #fff !important; text-decoration: none; padding: 10px; border-radius: 6px; font-weight: bold; margin-top: 15px; }\n  .leaflet-popup { margin-bottom: 40px; }\n<\/style>\n\n<script>\n(function() {\n  const TOKEN = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NjM2NDgzNzYsImV4cCI6MTg5MzQ1MjM0MCwicm9sZXMiOlsiUk9MRV9CUk9BRENBU1RfUEFSVE5FUiJdLCJ1dWlkIjoiZjE5MzJkYzEtN2UyNS00MzNhLTg1OTEtMzE2NmZiMTgxZTk1IiwidXNlcm5hbWUiOiJpbmZvQGZyaWJvdXJnMzYwLmNoIn0.Ut_O7esbB6Po78jlVpugEHERFUMIcwNt8syUoFG6vRNiyBfgORO4iRgMVZd2-0IOd-zuX9yciJZXbNU4SA0qd6SyyTe_EojaLQDlDmg_A-emiakHI0VOANz-4-d8sFjaSHgHskx-uevmRiB3nnObgHoRppNc3utd5wmRWN567BeHLpgGhBr1hTwN91UdJYUxa7gGPjpidS9fq3ZMuOabbCGXFxlKsXrjMZxk79TllnwlLm8UWrE2lAEmDpzgswK7yV96qp8n_ONJmSVkTYTu229zLtcIAUXvFLcMbD74W3zJBgB49y1kRwhMYyAwf1SFAHKuEBxX9dKvtHtxPkdsIw';\n  \n  function init() {\n    \/\/ On v\u00e9rifie si Leaflet est bien charg\u00e9\n    if (typeof L === 'undefined') {\n      setTimeout(init, 200);\n      return;\n    }\n\n    const map = L.map('map', { scrollWheelZoom: false }).setView([46.8064, 7.1619], 11);\n    \n    L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n      attribution: '&copy; OpenStreetMap'\n    }).addTo(map);\n\n    const pinIcon = L.icon({\n      iconUrl: 'https:\/\/fribourg360.ch\/wp-content\/uploads\/2026\/02\/pin.png',\n      iconSize: [45, 50],\n      iconAnchor: [22, 50],\n      popupAnchor: [0, -45]\n    });\n\n    fetch('https:\/\/admin.insitu.live\/api\/v2\/events\/agenda?page=1&itemsPerPage=80', {\n      headers: { 'Accept': 'application\/ld+json', 'Authorization': TOKEN }\n    })\n    .then(res => res.json())\n    .then(data => {\n      const markers = [];\n      const fallback = 'https:\/\/placehold.co\/280x140\/eeeeee\/999999?text=Evenement';\n\n      data.member.forEach(ev => {\n        if (!ev.place || !ev.place.latitude) return;\n\n        let img = fallback;\n        if (ev.images && ev.images.length > 0) {\n          let raw = ev.images[0].url_webp_size_512_q_65 || ev.images[0].url_webp || ev.images[0].url || '';\n          if (raw) img = raw.startsWith('http') ? raw : 'https:\/\/admin.insitu.live' + (raw.startsWith('\/') ? '' : '\/') + raw;\n        }\n\n        const m = L.marker([ev.place.latitude, ev.place.longitude], { icon: pinIcon }).addTo(map);\n        m.bindPopup(`\n          <div class=\"custom-map-popup\">\n            <img decoding=\"async\" src=\"${img}\" class=\"popup-image\" onerror=\"this.onerror=null; this.src='${fallback}';\">\n            <div class=\"popup-body\">\n              <h4 class=\"popup-title\">${ev.name}<\/h4>\n              <p class=\"popup-info\">\ud83d\udccd ${ev.place.name}<\/p>\n              <a href=\"https:\/\/insitu.live\/fr\/evenement\/${ev.slug}\" target=\"_blank\" class=\"popup-btn\">D\u00c9COUVRIR<\/a>\n            <\/div>\n          <\/div>`, { minWidth: 280, closeButton: false });\n        markers.push(m);\n      });\n\n      if (markers.length > 0) {\n        const group = L.featureGroup(markers);\n        map.fitBounds(group.getBounds().pad(0.1));\n      }\n      \/\/ Force le rafra\u00eechissement\n      setTimeout(() => map.invalidateSize(), 500);\n    })\n    .catch(err => console.error(\"Erreur API Map:\", err));\n  }\n\n  \/\/ Lance au chargement\n  window.addEventListener('DOMContentLoaded', init);\n  \/\/ Securit\u00e9 si DOMContentLoaded est d\u00e9j\u00e0 pass\u00e9\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\") { init(); }\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3bac2b2 elementor-widget elementor-widget-html\" data-id=\"3bac2b2\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"hero-section\">\n    <div class=\"hero-content\">\n        <h1>Events <span><\/span><\/h1>\n        <p>\n            In Situ : L'agenda culturel et \u00e9v\u00e9nementiel complet.<br>\n            Concerts, expos, festivals... \n        <\/p>\n        \n        <div class=\"hero-btns\">\n            <a href=\"#events\" class=\"hero-btn-primary\">Voir l'agenda<\/a>\n            <a href=\"https:\/\/insitu.live\" target=\"_blank\" class=\"hero-btn-secondary\" rel=\"noopener\">\u2728 Proposer un \u00e9v\u00e9nement<\/a>\n        <\/div>\n    <\/div>\n\n    <div class=\"hero-wave\">\n        <svg viewbox=\"0 0 1440 0\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n            <path d=\"M0 120H1440V0C1440 0 1193.5 120 720 120C246.5 120 0 0 0 0V120Z\" fill=\"white\"\/>\n        <\/svg>\n    <\/div>\n<\/div>\n\n<style>\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=Raleway:wght@300;700;900&display=swap');\n\n    body { margin: 0; overflow-x: hidden; }\n\n    #hero-section {\n        position: relative; \n        height: 400px; \n        width: 100vw; \n        left: 50%;\n        right: 50%;\n        margin-left: -50vw;\n        margin-right: -50vw;\n        margin-top: -90px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        text-align: center;\n        color: white;\n        font-family: 'Raleway', sans-serif;\n        z-index: 1;\n        overflow: hidden;\n        background-color: #1a1a1a; \n        \/* NOUVELLE IMAGE : Ambiance concert \/ event dynamique *\/\n        background-image: linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.7)), \n                          url('https:\/\/images.unsplash.com\/photo-1470229722913-7c0e2dbbafd3?auto=format&fit=crop&w=1920&q=80'); \n        background-size: cover; \n        background-position: center;\n        background-attachment: fixed;\n    }\n\n    .hero-content {\n        z-index: 2;\n        padding-bottom: 80px;\n        animation: heroFadeIn 1.2s ease-out forwards;\n    }\n\n    #hero-section h1 {\n        font-size: clamp(3em, 12vw, 5.5em);\n        font-weight: 700;\n        margin: 0;\n        margin-top: 47px;\n        text-shadow: 0 10px 30px rgba(0,0,0,0.5);\n        letter-spacing: -2px;\n        color: white;\n    }\n\n    #hero-section h1 span {\n        color: #FF3200; \/* Retour du orange pour le contraste *\/\n        text-shadow: 0 0 20px rgba(255, 50, 0, 0.4);\n    }\n\n    #hero-section p {\n        font-size: clamp(1.1em, 3vw, 1.5em);\n        max-width: 700px;\n        margin: 20px auto 40px auto;\n        line-height: 1.5;\n        font-weight: 300;\n        text-shadow: 0 2px 10px rgba(0,0,0,0.8);\n        color: white;\n    }\n\n    .hero-btns {\n        display: flex;\n        gap: 15px;\n        flex-wrap: wrap;\n        justify-content: center;\n    }\n\n    .hero-btn-primary, .hero-btn-secondary {\n        padding: 18px 35px;\n        border-radius: 50px;\n        text-decoration: none;\n        font-weight: 700;\n        font-size: 1.1em;\n        transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n    }\n\n    .hero-btn-primary {\n        background: #FF3200;\n        color: white;\n        border: 2px solid #FF3200;\n    }\n\n    .hero-btn-primary:hover {\n        transform: scale(1.08) translateY(-5px);\n    }\n\n    .hero-btn-secondary {\n        background: rgba(255,255,255,0.15);\n        color: white;\n        backdrop-filter: blur(8px);\n        border: 2px solid white;\n    }\n\n    .hero-btn-secondary:hover {\n        background: white;\n        color: #FF3200;\n        transform: scale(1.08) translateY(-5px);\n    }\n\n    .hero-wave {\n        position: absolute;\n        bottom: -1px;\n        left: 0;\n        width: 100%;\n        line-height: 0;\n    }\n\n    @keyframes heroFadeIn {\n        from { opacity: 0; transform: translateY(40px); }\n        to { opacity: 1; transform: translateY(0); }\n    }\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5ad91c3 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"5ad91c3\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-d8a33d0 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"d8a33d0\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-353d50a elementor-widget elementor-widget-html\" data-id=\"353d50a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  \/* --- BOUTONS DE S\u00c9LECTION DE VUE --- *\/\n  .view-controls {\n    display: flex;\n    justify-content: flex-end;\n    width: 100%;\n    max-width: 1100px;\n    margin: 0 auto 20px auto;\n    gap: 10px;\n  }\n  .view-btn {\n    background: #f5f5f5;\n    border: 1px solid #ddd;\n    border-radius: 6px;\n    padding: 8px;\n    cursor: pointer;\n    color: #888;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: all 0.2s ease;\n  }\n  .view-btn:hover { background: #e9e9e9; }\n  .view-btn.active {\n    background: #FF3200; \/* Ta couleur ! *\/\n    border-color: #FF3200;\n    color: white;\n  }\n\n  \/* --- STYLES DE BASE DES CARTES --- *\/\n  .insitu-card-link {\n    text-decoration: none;\n    color: inherit;\n    display: flex;\n    transition: transform 0.3s ease, box-shadow 0.3s ease;\n  }\n  .insitu-card-link:hover {\n    transform: translateY(-6px); \n  }\n  .insitu-card {\n    display: flex;\n    width: 100%;\n    background: #ffffff;\n    border: 1px solid #eaeaea;\n    border-radius: 12px; \n    overflow: hidden;\n    box-shadow: 0 4px 10px rgba(0,0,0,0.03); \n    transition: box-shadow 0.3s ease;\n  }\n  .insitu-card-link:hover .insitu-card {\n    box-shadow: 0 12px 25px rgba(0,0,0,0.12);\n  }\n  .insitu-card-img {\n    object-fit: cover;\n    flex-shrink: 0;\n  }\n  .insitu-card-content {\n    padding: 20px;\n    display: flex;\n    flex-direction: column;\n    flex-grow: 1;\n  }\n\n  \/* --- MODE GRILLE (Par d\u00e9faut) --- *\/\n  #events.grid-mode {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: stretch;\n    justify-content: center;\n    gap: 25px;\n  }\n  #events.grid-mode .insitu-card-link {\n    flex: 1 1 350px;\n    max-width: 350px;\n  }\n  #events.grid-mode .insitu-card {\n    flex-direction: column;\n  }\n  #events.grid-mode .insitu-card-img {\n    width: 100%;\n    height: 200px;\n    border-bottom: 1px solid #eee;\n  }\n\n  \/* --- MODE LISTE (Nouvel affichage) --- *\/\n  #events.list-mode {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 20px;\n  }\n  #events.list-mode .insitu-card-link {\n    width: 100%;\n    max-width: 900px; \/* Largeur max de la ligne *\/\n  }\n  #events.list-mode .insitu-card {\n    flex-direction: row-reverse; \/* Met l'image \u00e0 droite et le texte \u00e0 gauche *\/\n  }\n  #events.list-mode .insitu-card-img {\n    width: 350px; \/* L'image garde une belle taille fixe \u00e0 droite *\/\n    height: 100%;\n    min-height: 220px;\n    border-left: 1px solid #eee;\n  }\n  #events.list-mode .insitu-card-content {\n    justify-content: center; \/* Centre le texte verticalement *\/\n  }\n\n  \/* S\u00e9curit\u00e9 Mobile : Sur petit \u00e9cran, la liste redevient une grille verticale *\/\n  @media (max-width: 768px) {\n    #events.list-mode .insitu-card { flex-direction: column; }\n    #events.list-mode .insitu-card-img { width: 100%; height: 200px; border-left: none; border-bottom: 1px solid #eee; }\n  }\n\n  \/* --- DETAILS --- *\/\n  .insitu-badge {\n    display: inline-block;\n    padding: 5px 12px;\n    border-radius: 7px; \n    font-size: 0.85em;\n    font-weight: bold;\n    color: white;\n    margin-top: auto;\n    align-self: flex-start; \n  }\n  .insitu-info-line {\n    display: flex;\n    align-items: flex-start;\n    gap: 8px;\n    margin: 0 0 8px 0;\n  }\n<\/style>\n\n<div class=\"view-controls\">\n  <button id=\"btn-grid\" class=\"view-btn active\" title=\"Vue Grille\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"><\/rect><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"><\/rect><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"><\/rect><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"><\/rect><\/svg>\n  <\/button>\n  <button id=\"btn-list\" class=\"view-btn\" title=\"Vue Liste\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"><\/line><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"><\/line><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"><\/line><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"><\/line><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"><\/line><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"><\/line><\/svg>\n  <\/button>\n<\/div>\n\n<div id=\"events\" class=\"grid-mode\" style=\"margin:0 auto; width:100%;\"><\/div>\n\n<script>\n\/\/ Logique des boutons de vue\nconst btnGrid = document.getElementById('btn-grid');\nconst btnList = document.getElementById('btn-list');\nconst eventsContainer = document.getElementById('events');\n\nbtnGrid.addEventListener('click', () => {\n  eventsContainer.className = 'grid-mode';\n  btnGrid.classList.add('active');\n  btnList.classList.remove('active');\n});\n\nbtnList.addEventListener('click', () => {\n  eventsContainer.className = 'list-mode';\n  btnList.classList.add('active');\n  btnGrid.classList.remove('active');\n});\n\n\/\/ Appel API (j'ai mis 12 \u00e9v\u00e9nements pour que la liste soit sympa \u00e0 scroller)\nfetch('https:\/\/admin.insitu.live\/api\/v2\/events\/agenda?page=1&itemsPerPage=30', {\n  headers: { \n    'Accept': 'application\/ld+json',\n    'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NjM2NDgzNzYsImV4cCI6MTg5MzQ1MjM0MCwicm9sZXMiOlsiUk9MRV9CUk9BRENBU1RfUEFSVE5FUiJdLCJ1dWlkIjoiZjE5MzJkYzEtN2UyNS00MzNhLTg1OTEtMzE2NmZiMTgxZTk1IiwidXNlcm5hbWUiOiJpbmZvQGZyaWJvdXJnMzYwLmNoIn0.Ut_O7esbB6Po78jlVpugEHERFUMIcwNt8syUoFG6vRNiyBfgORO4iRgMVZd2-0IOd-zuX9yciJZXbNU4SA0qd6SyyTe_EojaLQDlDmg_A-emiakHI0VOANz-4-d8sFjaSHgHskx-uevmRiB3nnObgHoRppNc3utd5wmRWN567BeHLpgGhBr1hTwN91UdJYUxa7gGPjpidS9fq3ZMuOabbCGXFxlKsXrjMZxk79TllnwlLm8UWrE2lAEmDpzgswK7yV96qp8n_ONJmSVkTYTu229zLtcIAUXvFLcMbD74W3zJBgB49y1kRwhMYyAwf1SFAHKuEBxX9dKvtHtxPkdsIw' \n  }\n})\n.then(res => res.json())\n.then(data => {\n  if (!data.member || data.member.length === 0) {\n    eventsContainer.innerHTML = '<p>Aucun \u00e9v\u00e9nement trouv\u00e9<\/p>';\n    return;\n  }\n\n  let html = '';\n  data.member.forEach(event => {\n    let categoryName = '\u2014';\n    let categoryColor = '#333333';\n    \n    if (event.categories && event.categories.length > 0) {\n      const firstCat = event.categories[0];\n      categoryName = firstCat.label?.fr || '\u2014';\n      if (firstCat.tag_color) {\n        categoryColor = firstCat.tag_color;\n      }\n    }\n\n    const encodedName = encodeURIComponent(event.name || '\u00c9v\u00e9nement');\n    const dynamicFallbackImage = `https:\/\/placehold.co\/350x200\/eeeeee\/999999?text=${encodedName}`;\n\n    let rawImg = '';\n    if (event.images && event.images.length > 0) {\n      const mediaItem = event.images[0];\n      if (typeof mediaItem === 'object') {\n        rawImg = mediaItem.url_webp_size_512_q_65 || mediaItem.url_webp || mediaItem.url || '';\n      }\n    }\n    if (rawImg && !rawImg.startsWith('http')) {\n      rawImg = 'https:\/\/admin.insitu.live' + (rawImg.startsWith('\/') ? '' : '\/') + rawImg;\n    }\n\n    const imageUrl = rawImg ? rawImg : dynamicFallbackImage;\n    const eventUrl = `https:\/\/insitu.live\/fr\/evenement\/${event.slug}`; \n\n    const iconLocation = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#FF3200\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"flex-shrink:0; margin-top:2px;\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"><\/path><circle cx=\"12\" cy=\"10\" r=\"3\"><\/circle><\/svg>`;\n    const iconCalendar = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#FF3200\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"flex-shrink:0; margin-top:2px;\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"><\/line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"><\/line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"><\/line><\/svg>`;\n\n    \/\/ Les styles \"inline\" ont \u00e9t\u00e9 remplac\u00e9s par les classes CSS !\n    html += `\n      <a href=\"${eventUrl}\" target=\"_blank\" class=\"insitu-card-link\">\n        <div class=\"insitu-card\">\n          <img decoding=\"async\" \n            src=\"${imageUrl}\" \n            alt=\"${event.name}\" \n            onerror=\"this.onerror=null; this.src='${dynamicFallbackImage}';\" \n            class=\"insitu-card-img\"\n          >\n          <div class=\"insitu-card-content\">\n            <h3 style=\"margin:0 0 14px 0; font-size:1.3em; color:#1a1a1a; line-height:1.3;\">${event.name}<\/h3>\n            \n            <div style=\"color:#555; font-size:0.95em; margin-bottom:18px;\">\n              <div class=\"insitu-info-line\">\n                ${iconLocation}\n                <span>${event.place ? event.place.name : '\u2014'}${event.place && event.place.city ? ', ' + event.place.city : ''}<\/span>\n              <\/div>\n              <div class=\"insitu-info-line\">\n                ${iconCalendar}\n                <span>${event.date_from ? new Date(event.date_from).toLocaleDateString('fr-FR') : ''}<\/span>\n              <\/div>\n            <\/div>\n\n            <span class=\"insitu-badge\" style=\"background-color: ${categoryColor};\">\n              ${categoryName}\n            <\/span>\n          <\/div>\n        <\/div>\n      <\/a>\n    `;\n  });\n\n  eventsContainer.innerHTML = html;\n})\n.catch(error => console.error(\"Erreur de fetch :\", error));\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ed34339 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"ed34339\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf7c8a5 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"cf7c8a5\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/insitu.live\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Voir tous les \u00e9v\u00e9nements<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>\u00c9v\u00e9nements In Situ : L&rsquo;agenda culturel et \u00e9v\u00e9nementiel complet. Concerts, expos, festivals&#8230; Voir l&rsquo;agenda \u2728 Proposer un \u00e9v\u00e9nement Voir tous les \u00e9v\u00e9nements<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-689","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/pages\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":449,"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/pages\/689\/revisions"}],"predecessor-version":[{"id":6510,"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/pages\/689\/revisions\/6510"}],"wp:attachment":[{"href":"https:\/\/fribourg360.ch\/de\/wp-json\/wp\/v2\/media?parent=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}