{
    "id": 342,
    "date": "2026-09-30T16:20:16",
    "date_gmt": "2026-09-30T14:20:16",
    "guid": {
        "rendered": "https:\/\/mesparticipacio.org\/?page_id=342"
    },
    "modified": "2026-10-01T21:23:18",
    "modified_gmt": "2026-10-01T19:23:18",
    "slug": "actualitat-nova",
    "status": "publish",
    "type": "page",
    "link": "https:\/\/mesparticipacio.org\/es_es\/actualitat-nova\/",
    "title": {
        "rendered": "Actualitat NOVA"
    },
    "content": {
        "rendered": "<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_0 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><div class=\"mp-actualitat-hero\">\n\n  <div class=\"mp-hero-top\">\n\n    <div class=\"mp-brand\">\n      +Participaci\u00f3 <span>+Futur<\/span>\n    <\/div>\n\n    <div class=\"mp-campanya\">\n      <span class=\"mp-live-dot\"><\/span>\n      Campanya 2026\n    <\/div>\n\n  <\/div>\n\n\n  <div class=\"mp-hero-grid\">\n\n    <!-- COLUMNA ESQUERRA -->\n\n    <div\n      id=\"mp-left-stack\"\n      class=\"mp-left-stack\"\n    >\n\n\n      <!-- PR\u00d2XIMA APARICI\u00d3 ALS MITJANS -->\n\n      <a\n        id=\"mp-next-media\"\n        class=\"mp-media-banner\"\n        href=\"#\"\n        style=\"display:none;\"\n      >\n\n        <div class=\"mp-media-status-wrap\">\n\n          <div class=\"mp-media-status\">\n            Pr\u00f2ximament\n          <\/div>\n\n          <div\n            id=\"mp-media-type\"\n            class=\"mp-media-type\"\n          >\n            R\u00c0DIO\n          <\/div>\n\n        <\/div>\n\n\n        <div class=\"mp-media-content\">\n\n          <div\n            id=\"mp-media-dates\"\n            class=\"mp-media-dates\"\n          ><\/div>\n\n          <h3 id=\"mp-media-title\">\n            Pr\u00f2xima aparici\u00f3 als mitjans\n          <\/h3>\n\n        <\/div>\n\n\n        <div\n          id=\"mp-media-action\"\n          class=\"mp-media-cta\"\n        >\n          Escoltar\n\n          <span>\n            \u2197\n          <\/span>\n        <\/div>\n\n      <\/a>\n\n\n      <!-- HERO PRINCIPAL -->\n\n      <div\n        id=\"mp-hero-main\"\n        class=\"mp-hero-main\"\n      >\n\n        <div class=\"mp-hero-plus\">\n          +\n        <\/div>\n\n        <div class=\"mp-kicker\">\n          ACTUALITAT \u00b7 FSMCV 2026\n        <\/div>\n\n        <h1>\n          Tot el que<br>\n          est\u00e0 passant.\n        <\/h1>\n\n        <p>\n          Not\u00edcies, comunicats, propostes, pres\u00e8ncia als mitjans\n          i pr\u00f2ximes cites de campanya en un \u00fanic espai,\n          clar i f\u00e0cil de seguir.\n        <\/p>\n\n      <\/div>\n\n    <\/div>\n\n\n    <!-- COLUMNA DRETA -->\n\n    <div class=\"mp-hero-side\">\n\n\n      <!-- PR\u00d2XIMA CITA -->\n\n      <a\n        id=\"mp-next-event\"\n        class=\"mp-side-card mp-red\"\n        href=\"#agenda\"\n      >\n\n        <div class=\"mp-side-label\">\n          Pr\u00f2xima cita\n        <\/div>\n\n        <div class=\"mp-date\">\n\n          <span id=\"mp-event-day\">\n            --\n          <\/span>\n\n          <small id=\"mp-event-month\">\n            ---\n          <\/small>\n\n        <\/div>\n\n        <h3 id=\"mp-event-title\">\n          Carregant pr\u00f2xima cita...\n        <\/h3>\n\n        <p id=\"mp-event-place\">\n          Agenda de campanya\n        <\/p>\n\n        <div class=\"mp-arrow\">\n          \u2193\n        <\/div>\n\n      <\/a>\n\n\n      <!-- ACTUALITAT -->\n\n      <a\n        class=\"mp-side-card\"\n        href=\"#ultima-hora\"\n      >\n\n        <div class=\"mp-side-label\">\n          Actualitat\n        <\/div>\n\n        <div class=\"mp-date mp-date-small\">\n          +\n        <\/div>\n\n        <h3>\n          Segueix la campanya dia a dia\n        <\/h3>\n\n        <p>\n          Not\u00edcies, propostes, comunicats i agenda.\n        <\/p>\n\n        <div class=\"mp-arrow\">\n          \u2193\n        <\/div>\n\n      <\/a>\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n\n<style>\n\nhtml{\n  scroll-behavior:smooth;\n}\n\n\n\/* =========================\n   HERO GENERAL\n========================= *\/\n\n.mp-actualitat-hero{\n\n  --mp-red:#D71920;\n  --mp-red-light:#FF4751;\n  --mp-black:#0B0B0C;\n\n  max-width:1240px;\n  margin:0 auto;\n  padding:25px 30px 35px;\n\n  color:#fff;\n\n  font-family:\n    Arial,\n    Helvetica,\n    sans-serif;\n\n}\n\n\n\/* =========================\n   CAP\u00c7ALERA\n========================= *\/\n\n.mp-hero-top{\n\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n\n  gap:20px;\n\n  margin-bottom:26px;\n\n}\n\n\n.mp-brand{\n\n  font-size:18px;\n  font-weight:900;\n\n  letter-spacing:-0.03em;\n\n}\n\n\n.mp-brand span{\n\n  color:var(--mp-red-light);\n\n}\n\n\n.mp-campanya{\n\n  display:flex;\n  align-items:center;\n\n  gap:9px;\n\n  border:\n    1px solid\n    rgba(255,255,255,.12);\n\n  background:\n    rgba(255,255,255,.07);\n\n  border-radius:50px;\n\n  padding:10px 15px;\n\n  font-size:11px;\n  font-weight:800;\n\n  letter-spacing:.1em;\n\n  text-transform:uppercase;\n\n}\n\n\n.mp-live-dot{\n\n  width:8px;\n  height:8px;\n\n  display:block;\n\n  background:\n    var(--mp-red-light);\n\n  border-radius:50%;\n\n  box-shadow:\n    0 0 0 6px\n    rgba(255,71,81,.13);\n\n}\n\n\n\/* =========================\n   ESTRUCTURA\n========================= *\/\n\n.mp-hero-grid{\n\n  display:grid;\n\n  grid-template-columns:\n    1.45fr .55fr;\n\n  gap:18px;\n\n  align-items:stretch;\n\n}\n\n\n\/* =========================\n   COLUMNA ESQUERRA\n========================= *\/\n\n.mp-left-stack{\n\n  display:grid;\n\n  grid-template-rows:\n    132px 1fr;\n\n  gap:16px;\n\n  min-height:490px;\n\n}\n\n\n.mp-left-stack.mp-no-media{\n\n  grid-template-rows:\n    1fr;\n\n}\n\n\n\/* =========================\n   PR\u00d2XIMAMENT\n========================= *\/\n\n.mp-media-banner{\n\n  position:relative;\n\n  display:grid;\n\n  grid-template-columns:\n    auto 1fr auto;\n\n  align-items:center;\n\n  gap:18px;\n\n  padding:20px 24px;\n\n  border:\n    1px solid\n    rgba(255,255,255,.09);\n\n  border-radius:25px;\n\n  background:\n\n    radial-gradient(\n      circle at 100% 0%,\n      rgba(215,25,32,.32),\n      transparent 36%\n    ),\n\n    linear-gradient(\n      145deg,\n      #18181A,\n      #060607\n    );\n\n  overflow:hidden;\n\n  text-decoration:none;\n\n  color:#fff;\n\n  transition:\n    transform .25s ease,\n    box-shadow .25s ease;\n\n}\n\n\n.mp-media-banner:hover{\n\n  transform:\n    translateY(-3px);\n\n  box-shadow:\n    0 18px 45px\n    rgba(0,0,0,.22);\n\n}\n\n\n.mp-media-banner:before{\n\n  content:\"\";\n\n  position:absolute;\n\n  left:0;\n  top:0;\n  bottom:0;\n\n  width:5px;\n\n  background:\n    var(--mp-red);\n\n}\n\n\n.mp-media-status-wrap{\n\n  display:flex;\n  flex-direction:column;\n\n  align-items:flex-start;\n\n  gap:8px;\n\n}\n\n\n.mp-media-status{\n\n  display:inline-flex;\n\n  align-items:center;\n\n  gap:7px;\n\n  padding:7px 10px;\n\n  border-radius:999px;\n\n  background:\n    var(--mp-red);\n\n  color:#fff;\n\n  font-size:8px;\n  line-height:1;\n\n  font-weight:900;\n\n  letter-spacing:.14em;\n\n  text-transform:uppercase;\n\n  white-space:nowrap;\n\n}\n\n\n.mp-media-status:before{\n\n  content:\"\";\n\n  width:6px;\n  height:6px;\n\n  border-radius:50%;\n\n  background:#fff;\n\n  box-shadow:\n    0 0 0 4px\n    rgba(255,255,255,.12);\n\n}\n\n\n.mp-media-type{\n\n  color:#FF777D;\n\n  font-size:9px;\n  font-weight:900;\n\n  letter-spacing:.13em;\n\n  text-transform:uppercase;\n\n}\n\n\n.mp-media-content{\n\n  min-width:0;\n\n}\n\n\n.mp-media-dates{\n\n  display:flex;\n\n  flex-wrap:wrap;\n\n  gap:\n    7px 12px;\n\n  margin-bottom:7px;\n\n}\n\n\n.mp-media-date{\n\n  font-size:10px;\n\n  font-weight:900;\n\n  letter-spacing:.08em;\n\n  text-transform:uppercase;\n\n  color:\n    rgba(\n      255,\n      255,\n      255,\n      .65\n    );\n\n}\n\n\n.mp-media-content h3{\n\n  margin:0;\n\n  font-size:20px;\n  line-height:1.08;\n\n  letter-spacing:-.03em;\n\n  color:#fff;\n\n}\n\n\n.mp-media-cta{\n\n  display:flex;\n\n  align-items:center;\n\n  gap:10px;\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.1em;\n\n  text-transform:uppercase;\n\n  white-space:nowrap;\n\n}\n\n\n.mp-media-cta span{\n\n  width:36px;\n  height:36px;\n\n  display:grid;\n\n  place-items:center;\n\n  border-radius:50%;\n\n  background:\n    rgba(255,255,255,.12);\n\n  font-size:16px;\n\n}\n\n\n\/* =========================\n   HERO ROIG\n========================= *\/\n\n.mp-hero-main{\n\n  min-height:0;\n\n  border-radius:32px;\n\n  position:relative;\n\n  overflow:hidden;\n\n  display:flex;\n\n  flex-direction:column;\n\n  justify-content:flex-end;\n\n  padding:\n    34px 38px;\n\n  background:\n\n    radial-gradient(\n      circle at 80% 15%,\n      rgba(255,255,255,.12),\n      transparent 22%\n    ),\n\n    linear-gradient(\n      135deg,\n      #5D090D 0%,\n      #D71920 55%,\n      #260507 100%\n    );\n\n}\n\n\n.mp-left-stack.mp-no-media\n.mp-hero-main{\n\n  min-height:490px;\n\n}\n\n\n.mp-hero-main:after{\n\n  content:\"\";\n\n  position:absolute;\n\n  inset:0;\n\n  background:\n\n    linear-gradient(\n      0deg,\n      rgba(0,0,0,.52),\n      transparent 60%\n    );\n\n  pointer-events:none;\n\n}\n\n\n.mp-hero-plus{\n\n  position:absolute;\n\n  right:15px;\n  top:-92px;\n\n  font-size:270px;\n\n  line-height:1;\n\n  font-weight:900;\n\n  color:\n    rgba(255,255,255,.075);\n\n}\n\n\n.mp-kicker{\n\n  position:relative;\n\n  z-index:2;\n\n  margin-bottom:12px;\n\n  font-size:10px;\n\n  font-weight:900;\n\n  letter-spacing:.15em;\n\n  color:#FFD4D6;\n\n}\n\n\n.mp-hero-main h1{\n\n  position:relative;\n\n  z-index:2;\n\n  margin:0;\n\n  font-size:\n    clamp(\n      46px,\n      5.8vw,\n      72px\n    );\n\n  line-height:.89;\n\n  letter-spacing:-.06em;\n\n  color:#fff;\n\n}\n\n\n.mp-hero-main p{\n\n  position:relative;\n\n  z-index:2;\n\n  max-width:650px;\n\n  margin:\n    18px 0 0;\n\n  font-size:15px;\n\n  line-height:1.48;\n\n  color:\n    rgba(\n      255,\n      255,\n      255,\n      .82\n    );\n\n}\n\n\n\/* =========================\n   COLUMNA DRETA\n========================= *\/\n\n.mp-hero-side{\n\n  display:grid;\n\n  grid-template-rows:\n    1fr 1fr;\n\n  gap:16px;\n\n  min-height:490px;\n\n}\n\n\n\/* =========================\n   TARGETES DRETA\n========================= *\/\n\n.mp-side-card{\n\n  min-height:235px;\n\n  position:relative;\n\n  display:block;\n\n  border-radius:27px;\n\n  padding:26px;\n\n  background:#fff;\n\n  color:#111;\n\n  overflow:hidden;\n\n  text-decoration:none;\n\n  transition:\n    transform .25s ease,\n    box-shadow .25s ease;\n\n}\n\n\n.mp-side-card:hover{\n\n  transform:\n    translateY(-5px);\n\n  box-shadow:\n    0 18px 45px\n    rgba(0,0,0,.22);\n\n}\n\n\n.mp-side-card.mp-red{\n\n  background:\n\n    linear-gradient(\n      135deg,\n      #DF1B23,\n      #A4090E\n    );\n\n  color:#fff;\n\n}\n\n\n.mp-side-label{\n\n  font-size:10px;\n\n  font-weight:900;\n\n  letter-spacing:.14em;\n\n  text-transform:uppercase;\n\n  opacity:.7;\n\n}\n\n\n.mp-date{\n\n  margin:\n    20px 0 12px;\n\n  display:flex;\n\n  align-items:flex-end;\n\n  gap:10px;\n\n  font-size:55px;\n\n  line-height:.8;\n\n  font-weight:900;\n\n  letter-spacing:-.07em;\n\n}\n\n\n.mp-date small{\n\n  font-size:15px;\n\n  line-height:1;\n\n  font-weight:900;\n\n  letter-spacing:.12em;\n\n}\n\n\n.mp-date-small{\n\n  font-size:62px;\n\n  color:\n    var(--mp-red);\n\n}\n\n\n.mp-side-card h3{\n\n  margin:0;\n\n  padding-right:30px;\n\n  font-size:20px;\n\n  line-height:1.18;\n\n  letter-spacing:-.025em;\n\n  color:inherit;\n\n}\n\n\n.mp-side-card p{\n\n  margin:\n    9px 0 0;\n\n  max-width:220px;\n\n  font-size:12px;\n\n  line-height:1.45;\n\n  color:inherit;\n\n  opacity:.7;\n\n}\n\n\n.mp-arrow{\n\n  width:42px;\n  height:42px;\n\n  position:absolute;\n\n  right:19px;\n  bottom:18px;\n\n  display:grid;\n\n  place-items:center;\n\n  border-radius:50%;\n\n  background:\n    rgba(0,0,0,.06);\n\n  font-size:20px;\n\n}\n\n\n.mp-red .mp-arrow{\n\n  background:\n    rgba(255,255,255,.14);\n\n}\n\n\n\/* =========================\n   TABLET\n========================= *\/\n\n@media(max-width:980px){\n\n  .mp-hero-grid{\n\n    grid-template-columns:\n      1fr;\n\n  }\n\n\n  .mp-left-stack{\n\n    min-height:0;\n\n    grid-template-rows:\n      auto auto;\n\n  }\n\n\n  .mp-left-stack.mp-no-media{\n\n    grid-template-rows:\n      auto;\n\n  }\n\n\n  .mp-media-banner{\n\n    min-height:120px;\n\n  }\n\n\n  .mp-hero-main{\n\n    min-height:380px;\n\n  }\n\n\n  .mp-left-stack.mp-no-media\n  .mp-hero-main{\n\n    min-height:420px;\n\n  }\n\n\n  .mp-hero-side{\n\n    min-height:0;\n\n    grid-template-columns:\n      1fr 1fr;\n\n    grid-template-rows:\n      auto;\n\n  }\n\n\n  .mp-side-card{\n\n    min-height:220px;\n\n  }\n\n}\n\n\n\/* =========================\n   M\u00d2BIL\n========================= *\/\n\n@media(max-width:650px){\n\n  .mp-actualitat-hero{\n\n    padding:\n      15px 15px 25px;\n\n  }\n\n\n  .mp-hero-top{\n\n    margin-bottom:18px;\n\n  }\n\n\n  .mp-brand{\n\n    font-size:15px;\n\n  }\n\n\n  .mp-campanya{\n\n    font-size:9px;\n\n    padding:\n      8px 11px;\n\n  }\n\n\n  .mp-media-banner{\n\n    display:flex;\n\n    flex-direction:column;\n\n    align-items:flex-start;\n\n    gap:9px;\n\n    padding:18px;\n\n    border-radius:22px;\n\n  }\n\n\n  .mp-media-status-wrap{\n\n    flex-direction:row;\n\n    align-items:center;\n\n  }\n\n\n  .mp-media-content h3{\n\n    font-size:18px;\n\n  }\n\n\n  .mp-media-cta{\n\n    width:100%;\n\n    justify-content:space-between;\n\n    padding-top:4px;\n\n  }\n\n\n  .mp-hero-main{\n\n    min-height:350px;\n\n    padding:25px;\n\n    border-radius:25px;\n\n  }\n\n\n  .mp-left-stack.mp-no-media\n  .mp-hero-main{\n\n    min-height:420px;\n\n  }\n\n\n  .mp-hero-main h1{\n\n    font-size:48px;\n\n  }\n\n\n  .mp-hero-main p{\n\n    font-size:14px;\n\n  }\n\n\n  .mp-hero-side{\n\n    grid-template-columns:\n      1fr;\n\n  }\n\n\n  .mp-side-card{\n\n    min-height:210px;\n\n  }\n\n}\n\n<\/style>\n\n\n<script>\n\n(function(){\n\n\n\/* =================================================\n   UTILITATS\n================================================= *\/\n\n  function cleanHTML(html){\n\n    const div =\n      document.createElement('div');\n\n    div.innerHTML =\n      html || '';\n\n    return (\n      div.textContent ||\n      div.innerText ||\n      ''\n    ).trim();\n\n  }\n\n\n\n  function normalise(text){\n\n    return (\n      text || ''\n    )\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(\n      \/[\\u0300-\\u036f]\/g,\n      ''\n    )\n    .trim();\n\n  }\n\n\n\n  function getCategories(post){\n\n    try{\n\n      return (\n        post._embedded['wp:term'][0] ||\n        []\n      );\n\n    }\n\n    catch(e){\n\n      return [];\n\n    }\n\n  }\n\n\n\n  function hasCategory(\n    post,\n    wanted\n  ){\n\n    const categories =\n      getCategories(post);\n\n    const wantedNormalised =\n      normalise(wanted);\n\n\n    return categories.some(\n      function(cat){\n\n        return (\n          normalise(cat.slug) ===\n          wantedNormalised ||\n\n          normalise(cat.name) ===\n          wantedNormalised\n        );\n\n      }\n    );\n\n  }\n\n\n\n\/* =================================================\n   PR\u00d2XIMA CITA\n   GOOGLE CALENDAR\n================================================= *\/\n\n  function carregarProximEvent(){\n\n    const card =\n      document.getElementById(\n        'mp-next-event'\n      );\n\n    const dayElement =\n      document.getElementById(\n        'mp-event-day'\n      );\n\n    const monthElement =\n      document.getElementById(\n        'mp-event-month'\n      );\n\n    const titleElement =\n      document.getElementById(\n        'mp-event-title'\n      );\n\n    const placeElement =\n      document.getElementById(\n        'mp-event-place'\n      );\n\n\n    if(\n      !card ||\n      !dayElement ||\n      !monthElement ||\n      !titleElement\n    ){\n\n      return;\n\n    }\n\n\n    const API =\n      window.location.origin +\n      '\/wp-json\/mp\/v1\/agenda';\n\n\n    fetch(\n      API,\n      {\n        method:'GET',\n        credentials:'same-origin'\n      }\n    )\n\n    .then(\n      function(response){\n\n        if(!response.ok){\n\n          throw new Error(\n            'Agenda Google'\n          );\n\n        }\n\n        return response.json();\n\n      }\n    )\n\n    .then(\n      function(events){\n\n        if(\n          !Array.isArray(events)\n        ){\n\n          throw new Error(\n            'Format agenda incorrecte'\n          );\n\n        }\n\n\n        const now =\n          new Date();\n\n\n        \/*\n        Acceptem:\n        - events futurs\n        - events que ja han comen\u00e7at\n          per\u00f2 encara no han acabat\n        *\/\n\n        const futureEvents =\n          events\n\n          .filter(\n            function(event){\n\n              const start =\n                new Date(\n                  event.start\n                );\n\n\n              const end =\n                event.end\n                ?\n                new Date(\n                  event.end\n                )\n                :\n                start;\n\n\n              return (\n                end >= now\n              );\n\n            }\n          )\n\n          .sort(\n            function(a,b){\n\n              return (\n                new Date(a.start) -\n                new Date(b.start)\n              );\n\n            }\n          );\n\n\n        if(\n          !futureEvents.length\n        ){\n\n          dayElement.textContent =\n            '--';\n\n          monthElement.textContent =\n            '---';\n\n          titleElement.textContent =\n            'Consulta la pr\u00f2xima cita';\n\n          placeElement.textContent =\n            'Agenda de campanya';\n\n          card.href =\n            '#agenda';\n\n          return;\n\n        }\n\n\n        const event =\n          futureEvents[0];\n\n\n        const start =\n          new Date(\n            event.start\n          );\n\n\n        const months = [\n\n          'GEN',\n          'FEB',\n          'MAR',\n          'ABR',\n          'MAI',\n          'JUN',\n          'JUL',\n          'AGO',\n          'SET',\n          'OCT',\n          'NOV',\n          'DES'\n\n        ];\n\n\n        dayElement.textContent =\n          String(\n            start.getDate()\n          ).padStart(\n            2,\n            '0'\n          );\n\n\n        monthElement.textContent =\n          months[\n            start.getMonth()\n          ];\n\n\n        titleElement.textContent =\n          event.title ||\n          'Pr\u00f2xima cita';\n\n\n        \/*\n        LLOC\n        *\/\n\n        placeElement.textContent =\n          event.location ||\n          (\n            event.all_day\n            ?\n            'Tot el dia'\n            :\n            formatEventTime(start)\n          );\n\n\n        \/*\n        De moment la targeta baixa\n        fins a l'agenda setmanal.\n        *\/\n\n        card.href =\n          '#agenda';\n\n      }\n    )\n\n    .catch(\n      function(error){\n\n        console.error(\n          'Error pr\u00f2xima cita Google:',\n          error\n        );\n\n\n        dayElement.textContent =\n          '--';\n\n        monthElement.textContent =\n          '---';\n\n        titleElement.textContent =\n          'Consulta la pr\u00f2xima cita';\n\n        placeElement.textContent =\n          'Agenda de campanya';\n\n      }\n    );\n\n  }\n\n\n\n  function formatEventTime(date){\n\n    return (\n      String(\n        date.getHours()\n      ).padStart(\n        2,\n        '0'\n      ) +\n\n      ':' +\n\n      String(\n        date.getMinutes()\n      ).padStart(\n        2,\n        '0'\n      ) +\n\n      ' H'\n    );\n\n  }\n\n\n\n\/* =================================================\n   PR\u00d2XIMA APARICI\u00d3 ALS MITJANS\n================================================= *\/\n\n  function carregarProximMitja(){\n\n    const card =\n      document.getElementById(\n        'mp-next-media'\n      );\n\n\n    const leftStack =\n      document.getElementById(\n        'mp-left-stack'\n      );\n\n\n    const typeElement =\n      document.getElementById(\n        'mp-media-type'\n      );\n\n\n    const datesElement =\n      document.getElementById(\n        'mp-media-dates'\n      );\n\n\n    const titleElement =\n      document.getElementById(\n        'mp-media-title'\n      );\n\n\n    const actionElement =\n      document.getElementById(\n        'mp-media-action'\n      );\n\n\n    if(\n      !card ||\n      !leftStack ||\n      !datesElement\n    ){\n\n      return;\n\n    }\n\n\n    const origin =\n      window.location.origin;\n\n\n    const endpoints = [\n\n      origin +\n      '\/ca\/wp-json\/wp\/v2\/posts' +\n      '?_embed' +\n      '&per_page=50' +\n      '&orderby=date' +\n      '&order=desc',\n\n      origin +\n      '\/wp-json\/wp\/v2\/posts' +\n      '?_embed' +\n      '&per_page=50' +\n      '&orderby=date' +\n      '&order=desc'\n\n    ];\n\n\n\n    function intentarEndpoint(index){\n\n      if(\n        index >=\n        endpoints.length\n      ){\n\n        throw new Error(\n          'No s\u2019han pogut carregar els mitjans'\n        );\n\n      }\n\n\n      return fetch(\n        endpoints[index],\n        {\n          method:'GET',\n          credentials:'same-origin'\n        }\n      )\n\n      .then(\n        function(response){\n\n          if(!response.ok){\n\n            return intentarEndpoint(\n              index + 1\n            );\n\n          }\n\n          return response.json();\n\n        }\n      )\n\n      .then(\n        function(data){\n\n          if(\n            !Array.isArray(data)\n          ){\n\n            if(\n              index <\n              endpoints.length - 1\n            ){\n\n              return intentarEndpoint(\n                index + 1\n              );\n\n            }\n\n          }\n\n          return data;\n\n        }\n      );\n\n    }\n\n\n\n    function parseDateTime(text){\n\n      const parts =\n        text\n        .trim()\n        .split(\/\\s+\/);\n\n\n      if(\n        parts.length !== 2\n      ){\n\n        return null;\n\n      }\n\n\n      const dateParts =\n        parts[0]\n        .split('\/');\n\n\n      const timeParts =\n        parts[1]\n        .split(':');\n\n\n      if(\n        dateParts.length !== 3 ||\n        timeParts.length !== 2\n      ){\n\n        return null;\n\n      }\n\n\n      const day =\n        parseInt(\n          dateParts[0],\n          10\n        );\n\n\n      const month =\n        parseInt(\n          dateParts[1],\n          10\n        );\n\n\n      const year =\n        parseInt(\n          dateParts[2],\n          10\n        );\n\n\n      const hour =\n        parseInt(\n          timeParts[0],\n          10\n        );\n\n\n      const minute =\n        parseInt(\n          timeParts[1],\n          10\n        );\n\n\n      if(\n        Number.isNaN(day) ||\n        Number.isNaN(month) ||\n        Number.isNaN(year) ||\n        Number.isNaN(hour) ||\n        Number.isNaN(minute)\n      ){\n\n        return null;\n\n      }\n\n\n      const datetime =\n        new Date(\n          year,\n          month - 1,\n          day,\n          hour,\n          minute,\n          0,\n          0\n        );\n\n\n      return {\n\n        datetime:\n          datetime,\n\n        day:\n          day,\n\n        month:\n          month,\n\n        year:\n          year,\n\n        hour:\n          hour,\n\n        minute:\n          minute\n\n      };\n\n    }\n\n\n\n    function parseMediaData(post){\n\n      if(\n        !post.excerpt ||\n        !post.excerpt.rendered\n      ){\n\n        return null;\n\n      }\n\n\n      const excerpt =\n        cleanHTML(\n          post.excerpt.rendered\n        );\n\n\n      const mainParts =\n        excerpt\n        .split('|')\n        .map(\n          function(part){\n\n            return part.trim();\n\n          }\n        );\n\n\n      if(\n        !mainParts[0]\n      ){\n\n        return null;\n\n      }\n\n\n      const rawDates =\n        mainParts[0]\n        .split(';')\n        .map(\n          function(item){\n\n            return item.trim();\n\n          }\n        )\n        .filter(Boolean);\n\n\n      const dates =\n        rawDates\n        .map(\n          function(item){\n\n            return parseDateTime(\n              item\n            );\n\n          }\n        )\n        .filter(Boolean);\n\n\n      if(\n        !dates.length\n      ){\n\n        return null;\n\n      }\n\n\n      dates.sort(\n        function(a,b){\n\n          return (\n            a.datetime -\n            b.datetime\n          );\n\n        }\n      );\n\n\n      return {\n\n        dates:\n          dates,\n\n        url:\n          mainParts[1] ||\n          post.link\n\n      };\n\n    }\n\n\n\n    function getMediaType(post){\n\n      const categories =\n        getCategories(post);\n\n\n      const text =\n        categories\n        .map(\n          function(cat){\n\n            return normalise(\n              cat.slug +\n              ' ' +\n              cat.name\n            );\n\n          }\n        )\n        .join(' ');\n\n\n      if(\n        text.includes(\n          'televisio'\n        ) ||\n        text.includes(\n          'television'\n        ) ||\n        text.includes(\n          'tv'\n        )\n      ){\n\n        return 'televisio';\n\n      }\n\n\n      return 'radio';\n\n    }\n\n\n\n    intentarEndpoint(0)\n\n    .then(\n      function(posts){\n\n        const now =\n          new Date();\n\n\n        const candidates =\n          posts\n\n          .filter(\n            function(post){\n\n              return (\n                hasCategory(\n                  post,\n                  'proximament'\n                ) ||\n                hasCategory(\n                  post,\n                  'pr\u00f2ximament'\n                )\n              );\n\n            }\n          )\n\n          .map(\n            function(post){\n\n              const media =\n                parseMediaData(\n                  post\n                );\n\n\n              if(!media){\n\n                return null;\n\n              }\n\n\n              const futureDates =\n                media.dates\n                .filter(\n                  function(date){\n\n                    return (\n                      date.datetime >\n                      now\n                    );\n\n                  }\n                );\n\n\n              if(\n                !futureDates.length\n              ){\n\n                return null;\n\n              }\n\n\n              return {\n\n                post:\n                  post,\n\n                media:{\n                  dates:\n                    futureDates,\n\n                  url:\n                    media.url\n                },\n\n                nextDate:\n                  futureDates[0]\n                  .datetime\n\n              };\n\n            }\n          )\n\n          .filter(Boolean)\n\n          .sort(\n            function(a,b){\n\n              return (\n                a.nextDate -\n                b.nextDate\n              );\n\n            }\n          );\n\n\n        if(\n          !candidates.length\n        ){\n\n          card.style.display =\n            'none';\n\n\n          leftStack.classList.add(\n            'mp-no-media'\n          );\n\n\n          return;\n\n        }\n\n\n        const next =\n          candidates[0];\n\n\n        const post =\n          next.post;\n\n\n        const media =\n          next.media;\n\n\n        const type =\n          getMediaType(\n            post\n          );\n\n\n        const months = [\n\n          'GEN',\n          'FEB',\n          'MAR',\n          'ABR',\n          'MAI',\n          'JUN',\n          'JUL',\n          'AGO',\n          'SET',\n          'OCT',\n          'NOV',\n          'DES'\n\n        ];\n\n\n        datesElement.innerHTML =\n          '';\n\n\n        media.dates\n        .forEach(\n          function(date){\n\n            const row =\n              document.createElement(\n                'span'\n              );\n\n\n            row.className =\n              'mp-media-date';\n\n\n            row.textContent =\n\n              String(\n                date.day\n              ).padStart(\n                2,\n                '0'\n              ) +\n\n              ' ' +\n\n              months[\n                date.month - 1\n              ] +\n\n              ' \u00b7 ' +\n\n              String(\n                date.hour\n              ).padStart(\n                2,\n                '0'\n              ) +\n\n              ':' +\n\n              String(\n                date.minute\n              ).padStart(\n                2,\n                '0'\n              ) +\n\n              ' H';\n\n\n            datesElement.appendChild(\n              row\n            );\n\n          }\n        );\n\n\n        titleElement.textContent =\n          cleanHTML(\n            post.title.rendered\n          );\n\n\n        card.href =\n          media.url ||\n          post.link;\n\n\n        if(\n          type ===\n          'televisio'\n        ){\n\n          typeElement.textContent =\n            'TELEVISI\u00d3';\n\n\n          actionElement.innerHTML =\n            'Veure <span>\u2197<\/span>';\n\n        }\n\n        else{\n\n          typeElement.textContent =\n            'R\u00c0DIO';\n\n\n          actionElement.innerHTML =\n            'Escoltar <span>\u2197<\/span>';\n\n        }\n\n\n        card.style.display =\n          'grid';\n\n\n        leftStack.classList.remove(\n          'mp-no-media'\n        );\n\n      }\n    )\n\n    .catch(\n      function(error){\n\n        console.error(\n          'Error pr\u00f2xim mitj\u00e0:',\n          error\n        );\n\n\n        card.style.display =\n          'none';\n\n\n        leftStack.classList.add(\n          'mp-no-media'\n        );\n\n      }\n    );\n\n  }\n\n\n\n\/* =================================================\n   INICI\n================================================= *\/\n\n  function iniciarHero(){\n\n    carregarProximEvent();\n\n    carregarProximMitja();\n\n  }\n\n\n  if(\n    document.readyState ===\n    'loading'\n  ){\n\n    document.addEventListener(\n      'DOMContentLoaded',\n      iniciarHero\n    );\n\n  }\n\n  else{\n\n    iniciarHero();\n\n  }\n\n\n})();\n\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_1 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_1 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_1 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_1 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><div id=\"ultima-hora\" class=\"mp-actualitat-content\">\n\n  <!-- FILTROS -->\n\n  <nav class=\"mp-filter-nav\">\n\n    <button class=\"mp-filter active\" data-filter=\"all\">\n      Tot\n    <\/button>\n\n    <button class=\"mp-filter\" data-filter=\"noticies\">\n      Not\u00edcies\n    <\/button>\n\n    <button class=\"mp-filter\" data-filter=\"comunicats\">\n      Comunicats\n    <\/button>\n\n    <button class=\"mp-filter\" data-filter=\"propostes\">\n      Propostes\n    <\/button>\n\n    <a class=\"mp-filter\" href=\"#als-mitjans\">\n      Als mitjans\n    <\/a>\n\n    <a class=\"mp-filter mp-filter-agenda\" href=\"#agenda\">\n      Agenda\n    <\/a>\n\n  <\/nav>\n\n\n  <!-- CABECERA -->\n\n  <div class=\"mp-section-heading\">\n\n    <div>\n\n      <div class=\"mp-section-kicker\">\n        ARA MATEIX\n      <\/div>\n\n      <h2>\n        \u00daltima hora\n      <\/h2>\n\n    <\/div>\n\n    <div class=\"mp-section-line\"><\/div>\n\n  <\/div>\n\n\n  <!-- NOTICIAS -->\n\n  <div\n    id=\"mp-news-grid\"\n    class=\"mp-news-grid\"\n  >\n\n    <div class=\"mp-news-loading\">\n      Carregant actualitat...\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n\n<style>\n\nhtml{\n  scroll-behavior:smooth;\n}\n\n.mp-actualitat-content{\n  max-width:1240px;\n  margin:0 auto;\n  padding:12px 30px 70px;\n  font-family:Arial,Helvetica,sans-serif;\n}\n\n\n\/* FILTROS *\/\n\n.mp-filter-nav{\n  display:flex;\n  align-items:center;\n  gap:8px;\n  flex-wrap:wrap;\n  padding:18px 0 55px;\n}\n\n.mp-filter{\n  appearance:none;\n  border:1px solid #E6E6E8;\n  background:#fff;\n  color:#19191B;\n  border-radius:100px;\n  padding:11px 17px;\n  font-size:13px;\n  line-height:1;\n  font-weight:800;\n  cursor:pointer;\n  text-decoration:none;\n  transition:.2s ease;\n}\n\n.mp-filter:hover{\n  transform:translateY(-2px);\n}\n\n.mp-filter.active{\n  background:#111;\n  border-color:#111;\n  color:#fff;\n}\n\n.mp-filter-agenda{\n  color:#D71920;\n  border-color:rgba(215,25,32,.22);\n}\n\n\n\/* CABECERA *\/\n\n.mp-section-heading{\n  display:flex;\n  align-items:flex-end;\n  gap:26px;\n  margin-bottom:28px;\n}\n\n.mp-section-kicker{\n  color:#D71920;\n  font-size:11px;\n  font-weight:900;\n  letter-spacing:.16em;\n  margin-bottom:9px;\n}\n\n.mp-section-heading h2{\n  margin:0;\n  font-size:clamp(38px,5vw,57px);\n  line-height:.93;\n  letter-spacing:-.055em;\n  color:#111;\n}\n\n.mp-section-line{\n  height:1px;\n  flex:1;\n  margin-bottom:7px;\n  background:#E4E4E6;\n}\n\n\n\/* BENTO *\/\n\n.mp-news-grid{\n  display:grid;\n  grid-template-columns:1.15fr .85fr;\n  grid-template-rows:255px 255px;\n  gap:18px;\n}\n\n.mp-news-card{\n  position:relative;\n  display:flex;\n  flex-direction:column;\n  justify-content:flex-end;\n  overflow:hidden;\n  border-radius:28px;\n  padding:27px;\n  min-width:0;\n  text-decoration:none;\n  isolation:isolate;\n  background:#222;\n  transition:.3s ease;\n}\n\n.mp-news-card:hover{\n  transform:translateY(-5px);\n  box-shadow:0 22px 50px rgba(0,0,0,.12);\n}\n\n.mp-news-card:first-child{\n  grid-row:1 \/ span 2;\n}\n\n\n\/* FOTO *\/\n\n.mp-news-image{\n  position:absolute;\n  inset:0;\n  z-index:-3;\n  background-size:cover;\n  background-position:center;\n  transition:transform .5s ease;\n}\n\n.mp-news-card:hover .mp-news-image{\n  transform:scale(1.035);\n}\n\n\n\/* OSCURECIDO *\/\n\n.mp-news-overlay{\n  position:absolute;\n  inset:0;\n  z-index:-2;\n  background:\n    linear-gradient(\n      0deg,\n      rgba(0,0,0,.90) 0%,\n      rgba(0,0,0,.45) 48%,\n      rgba(0,0,0,.08) 100%\n    );\n}\n\n\n\/* SIN FOTO *\/\n\n.mp-news-card.no-image{\n  background:\n    radial-gradient(\n      circle at 85% 5%,\n      rgba(255,255,255,.18),\n      transparent 25%\n    ),\n    linear-gradient(\n      135deg,\n      #7A0B10,\n      #D71920 58%,\n      #310609\n    );\n}\n\n\n\/* CATEGOR\u00cdA *\/\n\n.mp-news-tag{\n  position:absolute;\n  top:20px;\n  left:20px;\n  z-index:4;\n  padding:8px 11px;\n  border-radius:100px;\n  background:rgba(255,255,255,.94);\n  color:#111;\n  font-size:10px;\n  font-weight:900;\n  letter-spacing:.1em;\n  text-transform:uppercase;\n}\n\n\n\/* FECHA *\/\n\n.mp-news-date{\n  color:rgba(255,255,255,.68);\n  font-size:10px;\n  font-weight:900;\n  letter-spacing:.1em;\n  text-transform:uppercase;\n  margin-bottom:8px;\n}\n\n\n\/* T\u00cdTULO *\/\n\n.mp-news-title{\n  margin:0;\n  color:#fff;\n  font-size:25px;\n  line-height:1.08;\n  letter-spacing:-.035em;\n  max-width:650px;\n}\n\n.mp-news-card:first-child .mp-news-title{\n  font-size:clamp(31px,3.3vw,44px);\n}\n\n\n\/* FLECHA *\/\n\n.mp-news-arrow{\n  position:absolute;\n  right:20px;\n  top:20px;\n  width:39px;\n  height:39px;\n  border-radius:50%;\n  display:grid;\n  place-items:center;\n  background:rgba(255,255,255,.13);\n  color:#fff;\n  backdrop-filter:blur(8px);\n  font-size:18px;\n}\n\n\n\/* LOADING *\/\n\n.mp-news-loading{\n  grid-column:1 \/ -1;\n  padding:50px;\n  border-radius:25px;\n  background:#F5F5F6;\n  color:#777;\n  font-weight:700;\n  text-align:center;\n}\n\n\n\/* TABLET *\/\n\n@media(max-width:900px){\n\n  .mp-news-grid{\n    grid-template-columns:1fr;\n    grid-template-rows:auto;\n  }\n\n  .mp-news-card,\n  .mp-news-card:first-child{\n    grid-row:auto;\n    min-height:330px;\n  }\n\n}\n\n\n\/* M\u00d3VIL *\/\n\n@media(max-width:650px){\n\n  .mp-actualitat-content{\n    padding:10px 15px 50px;\n  }\n\n  .mp-filter-nav{\n    flex-wrap:nowrap;\n    overflow-x:auto;\n    padding-bottom:40px;\n    scrollbar-width:none;\n  }\n\n  .mp-filter-nav::-webkit-scrollbar{\n    display:none;\n  }\n\n  .mp-filter{\n    flex:0 0 auto;\n  }\n\n  .mp-section-heading{\n    display:block;\n  }\n\n  .mp-section-line{\n    display:none;\n  }\n\n  .mp-news-card,\n  .mp-news-card:first-child{\n    min-height:310px;\n    border-radius:24px;\n    padding:22px;\n  }\n\n  .mp-news-title,\n  .mp-news-card:first-child .mp-news-title{\n    font-size:27px;\n  }\n\n}\n\n<\/style>\n\n\n<script>\n\n(function(){\n\n  const grid =\n    document.getElementById(\n      'mp-news-grid'\n    );\n\n  if(!grid){\n    return;\n  }\n\n\n  const origin =\n    window.location.origin;\n\n\n  \/*\n  Pedimos 20 entradas porque despu\u00e9s\n  eliminamos las marcadas como Pr\u00f2ximament.\n  *\/\n\n  const endpoints = [\n\n    origin +\n    '\/ca\/wp-json\/wp\/v2\/posts?_embed&per_page=20&orderby=date&order=desc',\n\n    origin +\n    '\/wp-json\/wp\/v2\/posts?_embed&per_page=20&orderby=date&order=desc'\n\n  ];\n\n\n  let loadedPosts = [];\n\n\n\/* =========================\n   ENDPOINT\n========================= *\/\n\n  function intentarEndpoint(index){\n\n    if(index >= endpoints.length){\n\n      throw new Error(\n        'No s\u2019han pogut carregar les not\u00edcies'\n      );\n\n    }\n\n\n    return fetch(\n      endpoints[index],\n      {\n        method:'GET',\n        credentials:'same-origin'\n      }\n    )\n\n    .then(function(response){\n\n      if(!response.ok){\n\n        return intentarEndpoint(\n          index + 1\n        );\n\n      }\n\n      return response.json();\n\n    })\n\n    .then(function(data){\n\n      if(\n        !Array.isArray(data) ||\n        data.length === 0\n      ){\n\n        if(\n          index <\n          endpoints.length - 1\n        ){\n\n          return intentarEndpoint(\n            index + 1\n          );\n\n        }\n\n      }\n\n      return data;\n\n    });\n\n  }\n\n\n\/* =========================\n   LIMPIAR HTML\n========================= *\/\n\n  function limpiarHTML(html){\n\n    const div =\n      document.createElement(\n        'div'\n      );\n\n    div.innerHTML =\n      html || '';\n\n    return (\n      div.textContent ||\n      div.innerText ||\n      ''\n    );\n\n  }\n\n\n\/* =========================\n   FOTO\n========================= *\/\n\n  function getImage(post){\n\n    try{\n\n      return (\n        post._embedded[\n          'wp:featuredmedia'\n        ][0].source_url\n      );\n\n    }\n\n    catch(e){\n\n      return '';\n\n    }\n\n  }\n\n\n\/* =========================\n   CATEGOR\u00cdAS\n========================= *\/\n\n  function getCategories(post){\n\n    try{\n\n      return (\n        post._embedded[\n          'wp:term'\n        ][0] || []\n      );\n\n    }\n\n    catch(e){\n\n      return [];\n\n    }\n\n  }\n\n\n  function normalise(text){\n\n    return (\n      text || ''\n    )\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(\n      \/[\\u0300-\\u036f]\/g,\n      ''\n    )\n    .trim();\n\n  }\n\n\n\/* =========================\n   EXCLUIR PR\u00d2XIMAMENT\n========================= *\/\n\n  function isProximament(post){\n\n    const categories =\n      getCategories(post);\n\n\n    return categories.some(\n      function(cat){\n\n        return (\n          normalise(cat.slug) ===\n          'proximament' ||\n\n          normalise(cat.name) ===\n          'proximament'\n        );\n\n      }\n    );\n\n  }\n\n\n\/* =========================\n   CATEGOR\u00cdA PRINCIPAL\n========================= *\/\n\n  function getPrimaryCategory(post){\n\n    const categories =\n      getCategories(post);\n\n\n    if(!categories.length){\n\n      return 'Actualitat';\n\n    }\n\n\n    const visibleCategory =\n      categories.find(\n        function(cat){\n\n          return (\n            normalise(cat.slug) !==\n            'proximament' &&\n            normalise(cat.name) !==\n            'proximament'\n          );\n\n        }\n      );\n\n\n    if(visibleCategory){\n\n      return visibleCategory.name;\n\n    }\n\n\n    return 'Actualitat';\n\n  }\n\n\n\/* =========================\n   FECHA\n========================= *\/\n\n  function formatDate(dateString){\n\n    const date =\n      new Date(\n        dateString\n      );\n\n\n    const months = [\n\n      'gener',\n      'febrer',\n      'mar\u00e7',\n      'abril',\n      'maig',\n      'juny',\n      'juliol',\n      'agost',\n      'setembre',\n      'octubre',\n      'novembre',\n      'desembre'\n\n    ];\n\n\n    return (\n      date.getDate() +\n      ' ' +\n      months[\n        date.getMonth()\n      ] +\n      ' ' +\n      date.getFullYear()\n    );\n\n  }\n\n\n\/* =========================\n   FILTRO CATEGOR\u00cdAS\n========================= *\/\n\n  function postHasCategory(\n    post,\n    validSlugs\n  ){\n\n    const categories =\n      getCategories(post);\n\n\n    return categories.some(\n      function(cat){\n\n        return validSlugs.includes(\n          normalise(cat.slug)\n        );\n\n      }\n    );\n\n  }\n\n\n\/* =========================\n   RENDER\n========================= *\/\n\n  function renderPosts(posts){\n\n    grid.innerHTML =\n      '';\n\n\n    if(!posts.length){\n\n      grid.innerHTML =\n        '<div class=\"mp-news-loading\">' +\n        'No hi ha publicacions en aquesta categoria.' +\n        '<\/div>';\n\n      return;\n\n    }\n\n\n    posts\n      .slice(0,3)\n      .forEach(\n        function(post){\n\n          const card =\n            document.createElement(\n              'a'\n            );\n\n\n          card.className =\n            'mp-news-card';\n\n\n          card.href =\n            post.link;\n\n\n          const image =\n            getImage(post);\n\n\n          if(!image){\n\n            card.classList.add(\n              'no-image'\n            );\n\n          }\n\n\n          const category =\n            getPrimaryCategory(\n              post\n            );\n\n\n          const title =\n            limpiarHTML(\n              post.title.rendered\n            );\n\n\n          let inner =\n            '';\n\n\n          if(image){\n\n            inner +=\n              '<div class=\"mp-news-image\" ' +\n              'style=\"background-image:url(\\'' +\n              image +\n              '\\')\"><\/div>';\n\n          }\n\n\n          inner +=\n            '<div class=\"mp-news-overlay\"><\/div>';\n\n\n          inner +=\n            '<div class=\"mp-news-tag\">' +\n            category +\n            '<\/div>';\n\n\n          inner +=\n            '<div class=\"mp-news-arrow\">\u2197<\/div>';\n\n\n          inner +=\n            '<div class=\"mp-news-date\">' +\n            formatDate(\n              post.date\n            ) +\n            '<\/div>';\n\n\n          inner +=\n            '<h3 class=\"mp-news-title\">' +\n            title +\n            '<\/h3>';\n\n\n          card.innerHTML =\n            inner;\n\n\n          grid.appendChild(\n            card\n          );\n\n        }\n      );\n\n  }\n\n\n\/* =========================\n   CARGA INICIAL\n========================= *\/\n\n  intentarEndpoint(0)\n\n    .then(function(posts){\n\n      \/*\n      Las entradas con Pr\u00f2ximament\n      desaparecen totalmente de\n      \u00daltima hora.\n      *\/\n\n      loadedPosts =\n        posts.filter(\n          function(post){\n\n            return !isProximament(\n              post\n            );\n\n          }\n        );\n\n\n      renderPosts(\n        loadedPosts\n      );\n\n    })\n\n\n    .catch(function(error){\n\n      console.error(\n        'Error carregant actualitat:',\n        error\n      );\n\n\n      grid.innerHTML =\n        '<div class=\"mp-news-loading\">' +\n        'No s\u2019ha pogut carregar l\u2019actualitat.' +\n        '<\/div>';\n\n    });\n\n\n\/* =========================\n   BOTONES DE FILTRO\n========================= *\/\n\n  const buttons =\n    document.querySelectorAll(\n      '.mp-filter[data-filter]'\n    );\n\n\n  buttons.forEach(\n    function(button){\n\n      button.addEventListener(\n        'click',\n        function(){\n\n          buttons.forEach(\n            function(btn){\n\n              btn.classList.remove(\n                'active'\n              );\n\n            }\n          );\n\n\n          button.classList.add(\n            'active'\n          );\n\n\n          const filter =\n            button.dataset.filter;\n\n\n          \/*\n          TOT\n          *\/\n\n          if(\n            filter === 'all'\n          ){\n\n            renderPosts(\n              loadedPosts\n            );\n\n            return;\n\n          }\n\n\n          \/*\n          FILTROS INTERNOS\n          *\/\n\n          const aliases = {\n\n            noticies:[\n              'noticies',\n              'noticias',\n              'noticia'\n            ],\n\n            comunicats:[\n              'comunicats',\n              'comunicados',\n              'comunicat'\n            ],\n\n            propostes:[\n              'propostes',\n              'propuestas',\n              'proposta'\n            ]\n\n          };\n\n\n          const validSlugs =\n            aliases[filter] ||\n            [filter];\n\n\n          const filtered =\n            loadedPosts.filter(\n              function(post){\n\n                return postHasCategory(\n                  post,\n                  validSlugs\n                );\n\n              }\n            );\n\n\n          renderPosts(\n            filtered\n          );\n\n        }\n      );\n\n    }\n  );\n\n\n})();\n\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_2 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_2 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_2 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_2 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><div\n  id=\"agenda\"\n  class=\"mp-agenda-wrap\"\n>\n\n  <div class=\"mp-agenda-box\">\n\n    <div class=\"mp-agenda-head\">\n\n      <div>\n\n        <div class=\"mp-agenda-kicker\">\n          SEGUEIX LA CAMPANYA\n        <\/div>\n\n        <h2>\n          Agenda\n        <\/h2>\n\n      <\/div>\n\n\n      <p>\n        Reunions, assemblees, presentacions i cites electorals.\n        Consulta d\u2019un cop d\u2019ull tota l\u2019activitat prevista per a la setmana.\n      <\/p>\n\n    <\/div>\n\n\n    <!-- SETMANA -->\n\n    <div class=\"mp-week-toolbar\">\n\n      <div class=\"mp-week-range\">\n\n        <div class=\"mp-week-label\">\n          SETMANA\n        <\/div>\n\n        <div\n          id=\"mp-week-dates\"\n          class=\"mp-week-dates\"\n        >\n          Carregant...\n        <\/div>\n\n      <\/div>\n\n\n      <div class=\"mp-week-nav\">\n\n        <button\n          id=\"mp-week-prev\"\n          type=\"button\"\n          aria-label=\"Setmana anterior\"\n        >\n          \u2190\n        <\/button>\n\n        <button\n          id=\"mp-week-today\"\n          class=\"mp-week-today\"\n          type=\"button\"\n        >\n          HUI\n        <\/button>\n\n        <button\n          id=\"mp-week-next\"\n          type=\"button\"\n          aria-label=\"Setmana seg\u00fcent\"\n        >\n          \u2192\n        <\/button>\n\n      <\/div>\n\n    <\/div>\n\n\n    <!-- CALENDARI -->\n\n    <div class=\"mp-week-scroll\">\n\n      <div\n        id=\"mp-week-grid\"\n        class=\"mp-week-grid\"\n      >\n\n        <div class=\"mp-agenda-loading\">\n          Carregant agenda...\n        <\/div>\n\n      <\/div>\n\n    <\/div>\n\n\n    <div class=\"mp-agenda-foot\">\n\n      <div class=\"mp-agenda-legend\">\n\n        <div class=\"mp-legend-item\">\n\n          <span class=\"mp-legend-dot\"><\/span>\n\n          Pr\u00f2xima activitat\n\n        <\/div>\n\n\n        <div class=\"mp-legend-item\">\n\n          <span\n            class=\"mp-legend-dot normal\"\n          ><\/span>\n\n          Altres activitats\n\n        <\/div>\n\n      <\/div>\n\n\n      <div class=\"mp-mobile-help\">\n        Despla\u00e7a horitzontalment per veure tota la setmana \u2192\n      <\/div>\n\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n\n<style>\n\n\/* ======================================\n   CONTENIDOR\n====================================== *\/\n\n.mp-agenda-wrap{\n\n  max-width:1240px;\n\n  margin:0 auto;\n\n  padding:\n    20px 30px 75px;\n\n  font-family:\n    Arial,\n    Helvetica,\n    sans-serif;\n\n}\n\n\n\/* ======================================\n   CAIXA\n====================================== *\/\n\n.mp-agenda-box{\n\n  position:relative;\n\n  overflow:hidden;\n\n  background:#0D0D0F;\n\n  color:#fff;\n\n  border-radius:38px;\n\n  padding:42px;\n\n}\n\n\n.mp-agenda-box:before{\n\n  content:\"AGENDA\";\n\n  position:absolute;\n\n  right:-10px;\n\n  top:-35px;\n\n  font-size:140px;\n\n  line-height:1;\n\n  font-weight:900;\n\n  letter-spacing:-.08em;\n\n  color:\n    rgba(\n      255,\n      255,\n      255,\n      .035\n    );\n\n  pointer-events:none;\n\n}\n\n\n\/* ======================================\n   CAP\u00c7ALERA\n====================================== *\/\n\n.mp-agenda-head{\n\n  display:flex;\n\n  justify-content:\n    space-between;\n\n  align-items:flex-end;\n\n  gap:30px;\n\n  margin-bottom:28px;\n\n  position:relative;\n\n  z-index:2;\n\n}\n\n\n.mp-agenda-kicker{\n\n  color:#FF4751;\n\n  font-size:11px;\n\n  font-weight:900;\n\n  letter-spacing:.16em;\n\n  margin-bottom:10px;\n\n}\n\n\n.mp-agenda-head h2{\n\n  margin:0;\n\n  font-size:\n    clamp(\n      40px,\n      5vw,\n      58px\n    );\n\n  line-height:.92;\n\n  letter-spacing:-.055em;\n\n  color:#fff;\n\n}\n\n\n.mp-agenda-head p{\n\n  max-width:470px;\n\n  margin:0;\n\n  color:#AFAFB3;\n\n  font-size:14px;\n\n  line-height:1.55;\n\n}\n\n\n\/* ======================================\n   TOOLBAR\n====================================== *\/\n\n.mp-week-toolbar{\n\n  position:relative;\n\n  z-index:2;\n\n  display:flex;\n\n  align-items:center;\n\n  justify-content:\n    space-between;\n\n  gap:18px;\n\n  padding:\n    14px 16px;\n\n  margin-bottom:14px;\n\n  border:\n    1px solid\n    rgba(255,255,255,.09);\n\n  border-radius:18px;\n\n  background:\n    rgba(255,255,255,.035);\n\n}\n\n\n.mp-week-range{\n\n  display:flex;\n\n  align-items:center;\n\n  gap:12px;\n\n}\n\n\n.mp-week-label{\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.14em;\n\n  color:#FF777D;\n\n  text-transform:uppercase;\n\n}\n\n\n.mp-week-dates{\n\n  font-size:16px;\n\n  font-weight:900;\n\n  letter-spacing:-.02em;\n\n}\n\n\n\/* ======================================\n   NAVEGACI\u00d3\n====================================== *\/\n\n.mp-week-nav{\n\n  display:flex;\n\n  align-items:center;\n\n  gap:8px;\n\n}\n\n\n.mp-week-nav button{\n\n  height:36px;\n\n  min-width:36px;\n\n  padding:\n    0 11px;\n\n  border:\n    1px solid\n    rgba(255,255,255,.10);\n\n  border-radius:50px;\n\n  background:\n    rgba(255,255,255,.06);\n\n  color:#fff;\n\n  cursor:pointer;\n\n  font-size:14px;\n\n  font-weight:900;\n\n}\n\n\n.mp-week-nav button:hover{\n\n  background:\n    rgba(255,255,255,.12);\n\n}\n\n\n.mp-week-nav\n.mp-week-today{\n\n  font-size:9px;\n\n  letter-spacing:.1em;\n\n}\n\n\n\/* ======================================\n   GRID SETMANAL\n====================================== *\/\n\n.mp-week-scroll{\n\n  position:relative;\n\n  z-index:2;\n\n}\n\n\n.mp-week-grid{\n\n  display:grid;\n\n  grid-template-columns:\n    repeat(\n      7,\n      minmax(0,1fr)\n    );\n\n  gap:8px;\n\n}\n\n\n\/* ======================================\n   DIA\n====================================== *\/\n\n.mp-day{\n\n  min-height:300px;\n\n  padding:\n    14px 12px;\n\n  border:\n    1px solid\n    rgba(255,255,255,.08);\n\n  border-radius:20px;\n\n  background:\n    rgba(255,255,255,.035);\n\n}\n\n\n.mp-day.today{\n\n  border-color:\n    rgba(215,25,32,.75);\n\n  background:\n\n    linear-gradient(\n      180deg,\n      rgba(215,25,32,.16),\n      rgba(255,255,255,.035)\n    );\n\n}\n\n\n.mp-day-head{\n\n  padding-bottom:12px;\n\n  margin-bottom:11px;\n\n  border-bottom:\n    1px solid\n    rgba(255,255,255,.08);\n\n}\n\n\n.mp-day-name{\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.13em;\n\n  color:#8E8E93;\n\n  text-transform:uppercase;\n\n}\n\n\n.mp-day.today\n.mp-day-name{\n\n  color:#FF777D;\n\n}\n\n\n.mp-day-number{\n\n  margin-top:4px;\n\n  font-size:31px;\n\n  line-height:1;\n\n  font-weight:900;\n\n  letter-spacing:-.06em;\n\n}\n\n\n.mp-day-month{\n\n  margin-left:3px;\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.1em;\n\n  color:#77777C;\n\n}\n\n\n\/* ======================================\n   EVENT\n====================================== *\/\n\n.mp-mini-event{\n\n  display:block;\n\n  margin-top:9px;\n\n  padding:11px;\n\n  border-radius:14px;\n\n  background:\n    rgba(255,255,255,.07);\n\n  text-decoration:none;\n\n  color:#fff;\n\n  transition:.2s ease;\n\n}\n\n\n.mp-mini-event:hover{\n\n  transform:\n    translateY(-2px);\n\n  background:\n    rgba(255,255,255,.11);\n\n}\n\n\n\/*\nPr\u00f2xima activitat\n*\/\n\n.mp-mini-event.featured{\n\n  background:\n\n    linear-gradient(\n      145deg,\n      #D71920,\n      #970A10\n    );\n\n}\n\n\n.mp-event-time{\n\n  margin-bottom:6px;\n\n  color:#FF8A8F;\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.1em;\n\n}\n\n\n.mp-mini-event.featured\n.mp-event-time{\n\n  color:#FFD6D8;\n\n}\n\n\n.mp-mini-event h3{\n\n  margin:0;\n\n  color:#fff;\n\n  font-size:12px;\n\n  line-height:1.2;\n\n  letter-spacing:-.01em;\n\n}\n\n\n.mp-event-place{\n\n  margin-top:6px;\n\n  color:#9B9BA0;\n\n  font-size:9px;\n\n  line-height:1.25;\n\n}\n\n\n.mp-mini-event.featured\n.mp-event-place{\n\n  color:#F2C8CB;\n\n}\n\n\n\/* ======================================\n   DIA BUIT\n====================================== *\/\n\n.mp-empty-day{\n\n  padding-top:7px;\n\n  color:#55555A;\n\n  font-size:10px;\n\n  line-height:1.35;\n\n}\n\n\n\/* ======================================\n   PEU\n====================================== *\/\n\n.mp-agenda-foot{\n\n  position:relative;\n\n  z-index:2;\n\n  display:flex;\n\n  justify-content:\n    space-between;\n\n  align-items:center;\n\n  gap:20px;\n\n  margin-top:16px;\n\n  color:#77777D;\n\n  font-size:10px;\n\n}\n\n\n.mp-agenda-legend{\n\n  display:flex;\n\n  flex-wrap:wrap;\n\n  gap:14px;\n\n}\n\n\n.mp-legend-item{\n\n  display:flex;\n\n  align-items:center;\n\n  gap:6px;\n\n}\n\n\n.mp-legend-dot{\n\n  width:7px;\n\n  height:7px;\n\n  border-radius:50%;\n\n  background:#D71920;\n\n}\n\n\n.mp-legend-dot.normal{\n\n  background:#77777D;\n\n}\n\n\n\/* ======================================\n   LOADING\n====================================== *\/\n\n.mp-agenda-loading{\n\n  grid-column:\n    1 \/ -1;\n\n  padding:40px;\n\n  border-radius:24px;\n\n  background:\n    rgba(255,255,255,.05);\n\n  color:#aaa;\n\n  text-align:center;\n\n  font-weight:700;\n\n}\n\n\n\/* ======================================\n   TABLET\n====================================== *\/\n\n@media(max-width:980px){\n\n  .mp-agenda-head{\n\n    display:block;\n\n  }\n\n\n  .mp-agenda-head p{\n\n    margin-top:15px;\n\n  }\n\n\n  .mp-week-scroll{\n\n    overflow-x:auto;\n\n    padding-bottom:6px;\n\n  }\n\n\n  .mp-week-grid{\n\n    min-width:960px;\n\n  }\n\n}\n\n\n\/* ======================================\n   M\u00d2BIL\n====================================== *\/\n\n@media(max-width:650px){\n\n  .mp-agenda-wrap{\n\n    padding:\n      15px 15px 55px;\n\n  }\n\n\n  .mp-agenda-box{\n\n    padding:\n      28px 15px;\n\n    border-radius:28px;\n\n  }\n\n\n  .mp-week-toolbar{\n\n    align-items:\n      flex-start;\n\n  }\n\n\n  .mp-week-range{\n\n    display:block;\n\n  }\n\n\n  .mp-week-dates{\n\n    margin-top:4px;\n\n    font-size:14px;\n\n  }\n\n\n  .mp-week-grid{\n\n    min-width:870px;\n\n  }\n\n\n  .mp-day{\n\n    min-height:270px;\n\n  }\n\n\n  .mp-agenda-foot{\n\n    display:block;\n\n  }\n\n\n  .mp-mobile-help{\n\n    margin-top:8px;\n\n  }\n\n}\n\n<\/style>\n\n\n<script>\n\n(function(){\n\n\n\/* ==========================================\n   ELEMENTS\n========================================== *\/\n\n  const grid =\n    document.getElementById(\n      'mp-week-grid'\n    );\n\n\n  const rangeElement =\n    document.getElementById(\n      'mp-week-dates'\n    );\n\n\n  const previousButton =\n    document.getElementById(\n      'mp-week-prev'\n    );\n\n\n  const nextButton =\n    document.getElementById(\n      'mp-week-next'\n    );\n\n\n  const todayButton =\n    document.getElementById(\n      'mp-week-today'\n    );\n\n\n  if(\n    !grid ||\n    !rangeElement\n  ){\n\n    return;\n\n  }\n\n\n\n\/* ==========================================\n   CONFIG\n========================================== *\/\n\n  const API =\n    window.location.origin +\n    '\/wp-json\/mp\/v1\/agenda';\n\n\n  const DAY_NAMES = [\n\n    'DILLUNS',\n    'DIMARTS',\n    'DIMECRES',\n    'DIJOUS',\n    'DIVENDRES',\n    'DISSABTE',\n    'DIUMENGE'\n\n  ];\n\n\n  const MONTH_NAMES = [\n\n    'GEN',\n    'FEB',\n    'MAR',\n    'ABR',\n    'MAI',\n    'JUN',\n    'JUL',\n    'AGO',\n    'SET',\n    'OCT',\n    'NOV',\n    'DES'\n\n  ];\n\n\n  let events = [];\n\n\n  let currentWeek =\n    getMonday(\n      new Date()\n    );\n\n\n\n\/* ==========================================\n   DATES\n========================================== *\/\n\n  function startOfDay(date){\n\n    const result =\n      new Date(date);\n\n\n    result.setHours(\n      0,\n      0,\n      0,\n      0\n    );\n\n\n    return result;\n\n  }\n\n\n\n  function getMonday(date){\n\n    const result =\n      startOfDay(date);\n\n\n    let day =\n      result.getDay();\n\n\n    \/*\n    JS:\n    diumenge = 0\n    dilluns = 1\n    *\/\n\n    if(\n      day === 0\n    ){\n\n      day = 7;\n\n    }\n\n\n    result.setDate(\n      result.getDate() -\n      day +\n      1\n    );\n\n\n    return result;\n\n  }\n\n\n\n  function addDays(\n    date,\n    number\n  ){\n\n    const result =\n      new Date(date);\n\n\n    result.setDate(\n      result.getDate() +\n      number\n    );\n\n\n    return result;\n\n  }\n\n\n\n  function sameDay(\n    dateA,\n    dateB\n  ){\n\n    return (\n      dateA.getFullYear() ===\n      dateB.getFullYear() &&\n\n      dateA.getMonth() ===\n      dateB.getMonth() &&\n\n      dateA.getDate() ===\n      dateB.getDate()\n    );\n\n  }\n\n\n\n  function formatTime(date){\n\n    return (\n\n      String(\n        date.getHours()\n      ).padStart(\n        2,\n        '0'\n      )\n\n      +\n\n      ':'\n\n      +\n\n      String(\n        date.getMinutes()\n      ).padStart(\n        2,\n        '0'\n      )\n\n      +\n\n      ' H'\n\n    );\n\n  }\n\n\n\n\/* ==========================================\n   RANG SETMANA\n========================================== *\/\n\n  function updateRange(){\n\n    const end =\n      addDays(\n        currentWeek,\n        6\n      );\n\n\n    const startText =\n\n      String(\n        currentWeek.getDate()\n      ).padStart(\n        2,\n        '0'\n      )\n\n      +\n\n      ' '\n\n      +\n\n      MONTH_NAMES[\n        currentWeek.getMonth()\n      ];\n\n\n    const endText =\n\n      String(\n        end.getDate()\n      ).padStart(\n        2,\n        '0'\n      )\n\n      +\n\n      ' '\n\n      +\n\n      MONTH_NAMES[\n        end.getMonth()\n      ]\n\n      +\n\n      ' '\n\n      +\n\n      end.getFullYear();\n\n\n    rangeElement.textContent =\n\n      startText +\n      ' \u2014 ' +\n      endText;\n\n  }\n\n\n\n\/* ==========================================\n   EVENTOS DEL DIA\n========================================== *\/\n\n  function eventsForDay(date){\n\n    return events\n\n      .filter(\n        function(event){\n\n          const start =\n            new Date(\n              event.start\n            );\n\n\n          return sameDay(\n            start,\n            date\n          );\n\n        }\n      )\n\n      .sort(\n        function(a,b){\n\n          return (\n            new Date(a.start) -\n            new Date(b.start)\n          );\n\n        }\n      );\n\n  }\n\n\n\n\/* ==========================================\n   PR\u00d2XIM EVENT\n========================================== *\/\n\n  function getNextEvent(){\n\n    const now =\n      new Date();\n\n\n    return events\n\n      .filter(\n        function(event){\n\n          return (\n            new Date(\n              event.start\n            ) >=\n            now\n          );\n\n        }\n      )\n\n      .sort(\n        function(a,b){\n\n          return (\n            new Date(a.start) -\n            new Date(b.start)\n          );\n\n        }\n      )[0];\n\n  }\n\n\n\n\/* ==========================================\n   EVENT CARD\n========================================== *\/\n\n  function createEventCard(\n    event,\n    nextEvent\n  ){\n\n    const element =\n      document.createElement(\n        event.url\n        ?\n        'a'\n        :\n        'div'\n      );\n\n\n    element.className =\n      'mp-mini-event';\n\n\n    if(\n      nextEvent &&\n      event.id ===\n      nextEvent.id\n    ){\n\n      element.classList.add(\n        'featured'\n      );\n\n    }\n\n\n    if(\n      event.url\n    ){\n\n      element.href =\n        event.url;\n\n\n      element.target =\n        '_blank';\n\n\n      element.rel =\n        'noopener';\n\n    }\n\n\n    const start =\n      new Date(\n        event.start\n      );\n\n\n    const time =\n      event.all_day\n      ?\n      'TOT EL DIA'\n      :\n      formatTime(start);\n\n\n    element.innerHTML =\n\n      '<div class=\"mp-event-time\">' +\n        time +\n      '<\/div>' +\n\n      '<h3>' +\n        escapeHTML(\n          event.title ||\n          'Activitat'\n        ) +\n      '<\/h3>' +\n\n      (\n        event.location\n        ?\n        '<div class=\"mp-event-place\">' +\n          escapeHTML(\n            event.location\n          ) +\n        '<\/div>'\n        :\n        ''\n      );\n\n\n    return element;\n\n  }\n\n\n\n\/* ==========================================\n   ESCAPE\n========================================== *\/\n\n  function escapeHTML(text){\n\n    const div =\n      document.createElement(\n        'div'\n      );\n\n\n    div.textContent =\n      text || '';\n\n\n    return div.innerHTML;\n\n  }\n\n\n\n\/* ==========================================\n   RENDER\n========================================== *\/\n\n  function render(){\n\n    grid.innerHTML =\n      '';\n\n\n    updateRange();\n\n\n    const today =\n      startOfDay(\n        new Date()\n      );\n\n\n    const nextEvent =\n      getNextEvent();\n\n\n    for(\n      let i = 0;\n      i < 7;\n      i++\n    ){\n\n      const date =\n        addDays(\n          currentWeek,\n          i\n        );\n\n\n      const day =\n        document.createElement(\n          'div'\n        );\n\n\n      day.className =\n        'mp-day';\n\n\n      if(\n        sameDay(\n          date,\n          today\n        )\n      ){\n\n        day.classList.add(\n          'today'\n        );\n\n      }\n\n\n      \/*\n      CAP\u00c7ALERA DIA\n      *\/\n\n      const header =\n        document.createElement(\n          'div'\n        );\n\n\n      header.className =\n        'mp-day-head';\n\n\n      const todayText =\n        sameDay(\n          date,\n          today\n        )\n        ?\n        ' \u00b7 HUI'\n        :\n        '';\n\n\n      header.innerHTML =\n\n        '<div class=\"mp-day-name\">' +\n\n          DAY_NAMES[i] +\n\n          todayText +\n\n        '<\/div>' +\n\n        '<div class=\"mp-day-number\">' +\n\n          String(\n            date.getDate()\n          ).padStart(\n            2,\n            '0'\n          ) +\n\n          '<span class=\"mp-day-month\">' +\n\n            MONTH_NAMES[\n              date.getMonth()\n            ] +\n\n          '<\/span>' +\n\n        '<\/div>';\n\n\n      day.appendChild(\n        header\n      );\n\n\n      \/*\n      EVENTS\n      *\/\n\n      const dayEvents =\n        eventsForDay(\n          date\n        );\n\n\n      if(\n        !dayEvents.length\n      ){\n\n        const empty =\n          document.createElement(\n            'div'\n          );\n\n\n        empty.className =\n          'mp-empty-day';\n\n\n        empty.textContent =\n          'Sense activitats programades';\n\n\n        day.appendChild(\n          empty\n        );\n\n      }\n\n      else{\n\n        dayEvents.forEach(\n          function(event){\n\n            day.appendChild(\n              createEventCard(\n                event,\n                nextEvent\n              )\n            );\n\n          }\n        );\n\n      }\n\n\n      grid.appendChild(\n        day\n      );\n\n    }\n\n  }\n\n\n\n\/* ==========================================\n   NAVEGACI\u00d3\n========================================== *\/\n\n  previousButton.addEventListener(\n    'click',\n    function(){\n\n      currentWeek =\n        addDays(\n          currentWeek,\n          -7\n        );\n\n\n      render();\n\n    }\n  );\n\n\n  nextButton.addEventListener(\n    'click',\n    function(){\n\n      currentWeek =\n        addDays(\n          currentWeek,\n          7\n        );\n\n\n      render();\n\n    }\n  );\n\n\n  todayButton.addEventListener(\n    'click',\n    function(){\n\n      currentWeek =\n        getMonday(\n          new Date()\n        );\n\n\n      render();\n\n    }\n  );\n\n\n\n\/* ==========================================\n   CARREGAR API\n========================================== *\/\n\n  fetch(\n    API,\n    {\n      method:'GET',\n      credentials:'same-origin'\n    }\n  )\n\n  .then(\n    function(response){\n\n      if(\n        !response.ok\n      ){\n\n        throw new Error(\n          'Agenda API'\n        );\n\n      }\n\n\n      return response.json();\n\n    }\n  )\n\n  .then(\n    function(data){\n\n      if(\n        !Array.isArray(data)\n      ){\n\n        throw new Error(\n          'Format agenda incorrecte'\n        );\n\n      }\n\n\n      events =\n        data;\n\n\n      render();\n\n    }\n  )\n\n  .catch(\n    function(error){\n\n      console.error(\n        'Error agenda Google:',\n        error\n      );\n\n\n      grid.innerHTML =\n\n        '<div class=\"mp-agenda-loading\">' +\n\n          'No s\u2019ha pogut carregar l\u2019agenda.' +\n\n        '<\/div>';\n\n    }\n  );\n\n\n})();\n\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_3 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_3 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_3 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_3 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><div id=\"als-mitjans\" class=\"mp-media-section\">\n\n  <!-- CAP\u00c7ALERA -->\n\n  <div class=\"mp-media-heading\">\n\n    <div>\n\n      <div class=\"mp-media-kicker\">\n        +PARTICIPACI\u00d3 +FUTUR\n      <\/div>\n\n      <h2>\n        Als mitjans\n      <\/h2>\n\n    <\/div>\n\n    <div class=\"mp-media-heading-line\"><\/div>\n\n    <p>\n      Entrevistes, not\u00edcies i aparicions de la candidatura\n      en premsa, r\u00e0dio i televisi\u00f3.\n    <\/p>\n\n  <\/div>\n\n\n  <!-- FILTRES -->\n\n  <div class=\"mp-media-filters\">\n\n    <button\n      class=\"mp-media-filter active\"\n      data-media-filter=\"all\"\n    >\n      Tots\n    <\/button>\n\n    <button\n      class=\"mp-media-filter\"\n      data-media-filter=\"premsa\"\n    >\n      Premsa\n    <\/button>\n\n    <button\n      class=\"mp-media-filter\"\n      data-media-filter=\"radio\"\n    >\n      R\u00e0dio\n    <\/button>\n\n    <button\n      class=\"mp-media-filter\"\n      data-media-filter=\"televisio\"\n    >\n      Televisi\u00f3\n    <\/button>\n\n  <\/div>\n\n\n  <!-- GRID -->\n\n  <div\n    id=\"mp-media-grid\"\n    class=\"mp-media-grid\"\n  >\n\n    <div class=\"mp-media-loading\">\n      Carregant aparicions...\n    <\/div>\n\n  <\/div>\n\n<\/div>\n\n\n<!-- =========================\n     MODAL\n========================= -->\n\n<div\n  id=\"mp-media-modal\"\n  class=\"mp-media-modal\"\n  aria-hidden=\"true\"\n>\n\n  <div\n    class=\"mp-media-modal-backdrop\"\n    data-close-media\n><\/div>\n\n\n  <div class=\"mp-media-modal-box\">\n\n    <button\n      type=\"button\"\n      class=\"mp-media-modal-close\"\n      data-close-media\n aria-label=\"Tancar\"\n    >\n      \u00d7\n    <\/button>\n\n\n    <div\n      id=\"mp-media-modal-type\"\n      class=\"mp-media-modal-type\"\n    >\n      R\u00c0DIO\n    <\/div>\n\n\n    <h3\n      id=\"mp-media-modal-title\"\n      class=\"mp-media-modal-title\"\n    ><\/h3>\n\n\n    <div\n      id=\"mp-media-modal-content\"\n      class=\"mp-media-modal-content\"\n    ><\/div>\n\n  <\/div>\n\n<\/div>\n\n\n<style>\n\n\/* ==========================================\n   SECCI\u00d3\n========================================== *\/\n\n.mp-media-section{\n\n  max-width:1240px;\n\n  margin:0 auto;\n\n  padding:\n    25px 30px 80px;\n\n  font-family:\n    Arial,\n    Helvetica,\n    sans-serif;\n\n}\n\n\n\/* ==========================================\n   CAP\u00c7ALERA\n========================================== *\/\n\n.mp-media-heading{\n\n  display:grid;\n\n  grid-template-columns:\n    auto 1fr minmax(260px,420px);\n\n  align-items:end;\n\n  gap:25px;\n\n  margin-bottom:28px;\n\n}\n\n\n.mp-media-kicker{\n\n  margin-bottom:9px;\n\n  color:#D71920;\n\n  font-size:10px;\n\n  font-weight:900;\n\n  letter-spacing:.16em;\n\n}\n\n\n.mp-media-heading h2{\n\n  margin:0;\n\n  color:#111;\n\n  font-size:\n    clamp(\n      39px,\n      5vw,\n      58px\n    );\n\n  line-height:.92;\n\n  letter-spacing:-.055em;\n\n}\n\n\n.mp-media-heading-line{\n\n  height:1px;\n\n  margin-bottom:8px;\n\n  background:#E2E2E4;\n\n}\n\n\n.mp-media-heading p{\n\n  margin:0;\n\n  color:#77777C;\n\n  font-size:13px;\n\n  line-height:1.5;\n\n}\n\n\n\/* ==========================================\n   FILTRES\n========================================== *\/\n\n.mp-media-filters{\n\n  display:flex;\n\n  flex-wrap:wrap;\n\n  gap:7px;\n\n  margin-bottom:22px;\n\n}\n\n\n.mp-media-filter{\n\n  appearance:none;\n\n  border:\n    1px solid\n    #E5E5E7;\n\n  border-radius:999px;\n\n  padding:\n    10px 15px;\n\n  background:#fff;\n\n  color:#18181A;\n\n  cursor:pointer;\n\n  font-size:11px;\n\n  font-weight:900;\n\n  letter-spacing:.08em;\n\n  text-transform:uppercase;\n\n  transition:.2s ease;\n\n}\n\n\n.mp-media-filter:hover{\n\n  transform:\n    translateY(-2px);\n\n}\n\n\n.mp-media-filter.active{\n\n  border-color:#111;\n\n  background:#111;\n\n  color:#fff;\n\n}\n\n\n\/* ==========================================\n   GRID\n========================================== *\/\n\n.mp-media-grid{\n\n  display:grid;\n\n  grid-template-columns:\n    repeat(\n      3,\n      minmax(0,1fr)\n    );\n\n  gap:16px;\n\n}\n\n\n\/* ==========================================\n   CARD\n========================================== *\/\n\n.mp-media-card{\n\n  position:relative;\n\n  min-height:300px;\n\n  overflow:hidden;\n\n  display:flex;\n\n  flex-direction:column;\n\n  justify-content:flex-end;\n\n  padding:24px;\n\n  border-radius:27px;\n\n  background:#121214;\n\n  color:#fff;\n\n  isolation:isolate;\n\n  text-decoration:none;\n\n  cursor:pointer;\n\n  transition:\n    transform .25s ease,\n    box-shadow .25s ease;\n\n}\n\n\n.mp-media-card:hover{\n\n  transform:\n    translateY(-4px);\n\n  box-shadow:\n    0 18px 40px\n    rgba(0,0,0,.13);\n\n}\n\n\n\/* FOTO *\/\n\n.mp-media-image{\n\n  position:absolute;\n\n  inset:0;\n\n  z-index:-3;\n\n  background-size:cover;\n\n  background-position:center;\n\n  transition:\n    transform .4s ease;\n\n}\n\n\n.mp-media-card:hover\n.mp-media-image{\n\n  transform:\n    scale(1.035);\n\n}\n\n\n\/* OVERLAY *\/\n\n.mp-media-overlay{\n\n  position:absolute;\n\n  inset:0;\n\n  z-index:-2;\n\n  background:\n\n    linear-gradient(\n      0deg,\n      rgba(0,0,0,.92) 0%,\n      rgba(0,0,0,.55) 45%,\n      rgba(0,0,0,.08) 100%\n    );\n\n}\n\n\n\/* SIN FOTO *\/\n\n.mp-media-card.no-image{\n\n  background:\n\n    radial-gradient(\n      circle at 90% 0%,\n      rgba(215,25,32,.45),\n      transparent 38%\n    ),\n\n    linear-gradient(\n      145deg,\n      #19191B,\n      #050506\n    );\n\n}\n\n\n\/* ==========================================\n   TIPUS\n========================================== *\/\n\n.mp-media-card-type{\n\n  position:absolute;\n\n  left:19px;\n\n  top:19px;\n\n  z-index:5;\n\n  padding:\n    7px 10px;\n\n  border-radius:999px;\n\n  background:\n    rgba(255,255,255,.94);\n\n  color:#111;\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.11em;\n\n  text-transform:uppercase;\n\n}\n\n\n\/* ==========================================\n   ICONA\n========================================== *\/\n\n.mp-media-card-icon{\n\n  position:absolute;\n\n  right:18px;\n\n  top:18px;\n\n  z-index:5;\n\n  width:40px;\n\n  height:40px;\n\n  display:grid;\n\n  place-items:center;\n\n  border-radius:50%;\n\n  background:\n    rgba(255,255,255,.13);\n\n  backdrop-filter:\n    blur(8px);\n\n  color:#fff;\n\n  font-size:17px;\n\n}\n\n\n\/* ==========================================\n   DATA\n========================================== *\/\n\n.mp-media-card-date{\n\n  margin-bottom:8px;\n\n  color:\n    rgba(255,255,255,.63);\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.09em;\n\n  text-transform:uppercase;\n\n}\n\n\n\/* ==========================================\n   T\u00cdTOL\n========================================== *\/\n\n.mp-media-card h3{\n\n  margin:0;\n\n  color:#fff;\n\n  font-size:22px;\n\n  line-height:1.08;\n\n  letter-spacing:-.03em;\n\n}\n\n\n\/* ==========================================\n   ACCI\u00d3\n========================================== *\/\n\n.mp-media-card-action{\n\n  margin-top:15px;\n\n  display:flex;\n\n  align-items:center;\n\n  gap:7px;\n\n  color:#FF777D;\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.1em;\n\n  text-transform:uppercase;\n\n}\n\n\n\/* ==========================================\n   LOADING\n========================================== *\/\n\n.mp-media-loading{\n\n  grid-column:\n    1 \/ -1;\n\n  padding:45px;\n\n  border-radius:25px;\n\n  background:#F5F5F6;\n\n  color:#777;\n\n  text-align:center;\n\n  font-weight:700;\n\n}\n\n\n\/* ==========================================\n   MODAL\n========================================== *\/\n\n.mp-media-modal{\n\n  position:fixed;\n\n  inset:0;\n\n  z-index:999999;\n\n  display:none;\n\n  align-items:center;\n\n  justify-content:center;\n\n  padding:20px;\n\n}\n\n\n.mp-media-modal.open{\n\n  display:flex;\n\n}\n\n\n.mp-media-modal-backdrop{\n\n  position:absolute;\n\n  inset:0;\n\n  background:\n    rgba(0,0,0,.76);\n\n  backdrop-filter:\n    blur(7px);\n\n}\n\n\n.mp-media-modal-box{\n\n  position:relative;\n\n  z-index:2;\n\n  width:min(\n    720px,\n    100%\n  );\n\n  max-height:\n    calc(100vh - 40px);\n\n  overflow-y:auto;\n\n  padding:35px;\n\n  border-radius:30px;\n\n  background:#fff;\n\n  box-shadow:\n    0 30px 100px\n    rgba(0,0,0,.30);\n\n}\n\n\n.mp-media-modal-close{\n\n  position:absolute;\n\n  right:17px;\n\n  top:16px;\n\n  width:38px;\n\n  height:38px;\n\n  display:grid;\n\n  place-items:center;\n\n  border:0;\n\n  border-radius:50%;\n\n  background:#F0F0F1;\n\n  color:#111;\n\n  cursor:pointer;\n\n  font-size:24px;\n\n  line-height:1;\n\n}\n\n\n.mp-media-modal-type{\n\n  margin-bottom:10px;\n\n  color:#D71920;\n\n  font-size:9px;\n\n  font-weight:900;\n\n  letter-spacing:.13em;\n\n  text-transform:uppercase;\n\n}\n\n\n.mp-media-modal-title{\n\n  margin:\n    0 45px 25px 0;\n\n  color:#111;\n\n  font-size:\n    clamp(\n      25px,\n      4vw,\n      38px\n    );\n\n  line-height:1.04;\n\n  letter-spacing:-.04em;\n\n}\n\n\n.mp-media-modal-content{\n\n  color:#222;\n\n}\n\n\n\/* ==========================================\n   AUDIO\n========================================== *\/\n\n.mp-media-modal-content audio{\n\n  display:block;\n\n  width:100%;\n\n  min-height:54px;\n\n  margin:\n    5px 0 0;\n\n}\n\n\n\/* ==========================================\n   VIDEO\n========================================== *\/\n\n.mp-media-modal-content iframe{\n\n  display:block;\n\n  width:100%;\n\n  aspect-ratio:16 \/ 9;\n\n  height:auto;\n\n  border:0;\n\n  border-radius:18px;\n\n}\n\n\n.mp-media-modal-content video{\n\n  width:100%;\n\n  border-radius:18px;\n\n}\n\n\n\/* ==========================================\n   ENLLA\u00c7 PREMSA\n========================================== *\/\n\n.mp-media-external{\n\n  display:inline-flex;\n\n  align-items:center;\n\n  gap:9px;\n\n  margin-top:5px;\n\n  padding:\n    12px 18px;\n\n  border-radius:999px;\n\n  background:#111;\n\n  color:#fff !important;\n\n  text-decoration:none;\n\n  font-size:10px;\n\n  font-weight:900;\n\n  letter-spacing:.08em;\n\n  text-transform:uppercase;\n\n}\n\n\n\/* ==========================================\n   TABLET\n========================================== *\/\n\n@media(max-width:900px){\n\n  .mp-media-heading{\n\n    grid-template-columns:\n      auto 1fr;\n\n  }\n\n\n  .mp-media-heading p{\n\n    grid-column:\n      1 \/ -1;\n\n  }\n\n\n  .mp-media-grid{\n\n    grid-template-columns:\n      repeat(\n        2,\n        1fr\n      );\n\n  }\n\n}\n\n\n\/* ==========================================\n   M\u00d2BIL\n========================================== *\/\n\n@media(max-width:650px){\n\n  .mp-media-section{\n\n    padding:\n      20px 15px 60px;\n\n  }\n\n\n  .mp-media-heading{\n\n    display:block;\n\n  }\n\n\n  .mp-media-heading-line{\n\n    display:none;\n\n  }\n\n\n  .mp-media-heading p{\n\n    margin-top:15px;\n\n  }\n\n\n  .mp-media-filters{\n\n    flex-wrap:nowrap;\n\n    overflow-x:auto;\n\n    padding-bottom:5px;\n\n    scrollbar-width:none;\n\n  }\n\n\n  .mp-media-filters::-webkit-scrollbar{\n\n    display:none;\n\n  }\n\n\n  .mp-media-filter{\n\n    flex:\n      0 0 auto;\n\n  }\n\n\n  .mp-media-grid{\n\n    grid-template-columns:\n      1fr;\n\n  }\n\n\n  .mp-media-card{\n\n    min-height:300px;\n\n  }\n\n\n  .mp-media-modal-box{\n\n    padding:\n      29px 20px;\n\n    border-radius:25px;\n\n  }\n\n}\n\n<\/style>\n\n\n<script>\n\n(function(){\n\n\n\/* ==========================================\n   ELEMENTS\n========================================== *\/\n\n  const grid =\n    document.getElementById(\n      'mp-media-grid'\n    );\n\n\n  if(!grid){\n\n    return;\n\n  }\n\n\n  const origin =\n    window.location.origin;\n\n\n  const filters =\n    document.querySelectorAll(\n      '.mp-media-filter[data-media-filter]'\n    );\n\n\n  const modal =\n    document.getElementById(\n      'mp-media-modal'\n    );\n\n\n  const modalTitle =\n    document.getElementById(\n      'mp-media-modal-title'\n    );\n\n\n  const modalType =\n    document.getElementById(\n      'mp-media-modal-type'\n    );\n\n\n  const modalContent =\n    document.getElementById(\n      'mp-media-modal-content'\n    );\n\n\n  let mediaPosts = [];\n\n\n\/* ==========================================\n   WORDPRESS API\n========================================== *\/\n\n  const endpoints = [\n\n    origin +\n    '\/ca\/wp-json\/wp\/v2\/posts' +\n    '?_embed' +\n    '&per_page=50' +\n    '&orderby=date' +\n    '&order=desc',\n\n    origin +\n    '\/wp-json\/wp\/v2\/posts' +\n    '?_embed' +\n    '&per_page=50' +\n    '&orderby=date' +\n    '&order=desc'\n\n  ];\n\n\n  function intentarEndpoint(index){\n\n    if(\n      index >=\n      endpoints.length\n    ){\n\n      throw new Error(\n        'No s\u2019han pogut carregar els mitjans'\n      );\n\n    }\n\n\n    return fetch(\n      endpoints[index],\n      {\n        method:'GET',\n        credentials:'same-origin'\n      }\n    )\n\n    .then(\n      function(response){\n\n        if(!response.ok){\n\n          return intentarEndpoint(\n            index + 1\n          );\n\n        }\n\n\n        return response.json();\n\n      }\n    )\n\n    .then(\n      function(data){\n\n        if(\n          !Array.isArray(data)\n        ){\n\n          if(\n            index <\n            endpoints.length - 1\n          ){\n\n            return intentarEndpoint(\n              index + 1\n            );\n\n          }\n\n        }\n\n\n        return data;\n\n      }\n    );\n\n  }\n\n\n\/* ==========================================\n   UTILITATS\n========================================== *\/\n\n  function cleanHTML(html){\n\n    const div =\n      document.createElement(\n        'div'\n      );\n\n\n    div.innerHTML =\n      html || '';\n\n\n    return (\n      div.textContent ||\n      div.innerText ||\n      ''\n    ).trim();\n\n  }\n\n\n  function normalise(text){\n\n    return (\n      text || ''\n    )\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(\n      \/[\\u0300-\\u036f]\/g,\n      ''\n    )\n    .trim();\n\n  }\n\n\n\/* ==========================================\n   CATEGORIES\n========================================== *\/\n\n  function getCategories(post){\n\n    try{\n\n      return (\n        post._embedded[\n          'wp:term'\n        ][0] || []\n      );\n\n    }\n\n    catch(e){\n\n      return [];\n\n    }\n\n  }\n\n\n  function hasCategory(\n    post,\n    wanted\n  ){\n\n    const target =\n      normalise(\n        wanted\n      );\n\n\n    return getCategories(post)\n      .some(\n        function(cat){\n\n          return (\n            normalise(\n              cat.slug\n            ) === target ||\n\n            normalise(\n              cat.name\n            ) === target\n          );\n\n        }\n      );\n\n  }\n\n\n\/* ==========================================\n   PR\u00d2XIMAMENT\n   NOM\u00c9S BANNER\n========================================== *\/\n\n  function isProximament(post){\n\n    return (\n      hasCategory(\n        post,\n        'proximament'\n      ) ||\n\n      hasCategory(\n        post,\n        'pr\u00f2ximament'\n      )\n    );\n\n  }\n\n\n\/* ==========================================\n   TIPUS DE MITJ\u00c0\n========================================== *\/\n\n  function getMediaType(post){\n\n    const categories =\n      getCategories(post);\n\n\n    const categoryText =\n      categories\n        .map(\n          function(cat){\n\n            return normalise(\n              cat.slug +\n              ' ' +\n              cat.name\n            );\n\n          }\n        )\n        .join(' ');\n\n\n    if(\n      categoryText.includes(\n        'radio'\n      )\n    ){\n\n      return 'radio';\n\n    }\n\n\n    if(\n      categoryText.includes(\n        'televisio'\n      ) ||\n\n      categoryText.includes(\n        'television'\n      ) ||\n\n      categoryText.includes(\n        ' tv'\n      )\n    ){\n\n      return 'televisio';\n\n    }\n\n\n    return 'premsa';\n\n  }\n\n\n\/* ==========================================\n   FOTO\n========================================== *\/\n\n  function getImage(post){\n\n    try{\n\n      return (\n        post._embedded[\n          'wp:featuredmedia'\n        ][0].source_url\n      );\n\n    }\n\n    catch(e){\n\n      return '';\n\n    }\n\n  }\n\n\n\/* ==========================================\n   DATA\n========================================== *\/\n\n  function formatDate(dateString){\n\n    const date =\n      new Date(\n        dateString\n      );\n\n\n    const months = [\n\n      'gener',\n      'febrer',\n      'mar\u00e7',\n      'abril',\n      'maig',\n      'juny',\n      'juliol',\n      'agost',\n      'setembre',\n      'octubre',\n      'novembre',\n      'desembre'\n\n    ];\n\n\n    return (\n      date.getDate() +\n      ' ' +\n      months[\n        date.getMonth()\n      ] +\n      ' ' +\n      date.getFullYear()\n    );\n\n  }\n\n\n\/* ==========================================\n   CONTINGUT POST\n========================================== *\/\n\n  function getPostContent(post){\n\n    if(\n      !post.content ||\n      !post.content.rendered\n    ){\n\n      return '';\n\n    }\n\n\n    return post.content.rendered;\n\n  }\n\n\n\/* ==========================================\n   DETECTAR AUDIO\n========================================== *\/\n\n  function getAudioSource(html){\n\n    if(!html){\n\n      return '';\n\n    }\n\n\n    const wrapper =\n      document.createElement(\n        'div'\n      );\n\n\n    wrapper.innerHTML =\n      html;\n\n\n    \/*\n    <audio src=\"\">\n    *\/\n\n    const audio =\n      wrapper.querySelector(\n        'audio'\n      );\n\n\n    if(audio){\n\n      if(\n        audio.getAttribute(\n          'src'\n        )\n      ){\n\n        return audio.getAttribute(\n          'src'\n        );\n\n      }\n\n\n      const source =\n        audio.querySelector(\n          'source'\n        );\n\n\n      if(\n        source &&\n        source.getAttribute(\n          'src'\n        )\n      ){\n\n        return source.getAttribute(\n          'src'\n        );\n\n      }\n\n    }\n\n\n    \/*\n    Enlla\u00e7 directe MP3\/M4A\/WAV\/OGG\n    *\/\n\n    const links =\n      wrapper.querySelectorAll(\n        'a[href]'\n      );\n\n\n    for(\n      let i = 0;\n      i < links.length;\n      i++\n    ){\n\n      const href =\n        links[i]\n        .getAttribute(\n          'href'\n        );\n\n\n      if(\n        href &&\n        \/\\.(mp3|m4a|wav|ogg)(\\?.*)?$\/i\n          .test(href)\n      ){\n\n        return href;\n\n      }\n\n    }\n\n\n    \/*\n    Cerca bruta dins HTML\n    *\/\n\n    const match =\n      html.match(\n        \/https?:\\\/\\\/[^\"' ]+\\.(mp3|m4a|wav|ogg)(\\?[^\"' ]*)?\/i\n      );\n\n\n    return (\n      match\n      ?\n      match[0]\n      :\n      ''\n    );\n\n  }\n\n\n\/* ==========================================\n   DETECTAR VIDEO\n========================================== *\/\n\n  function getVideoHTML(html){\n\n    if(!html){\n\n      return '';\n\n    }\n\n\n    const wrapper =\n      document.createElement(\n        'div'\n      );\n\n\n    wrapper.innerHTML =\n      html;\n\n\n    const iframe =\n      wrapper.querySelector(\n        'iframe'\n      );\n\n\n    if(iframe){\n\n      return iframe.outerHTML;\n\n    }\n\n\n    const video =\n      wrapper.querySelector(\n        'video'\n      );\n\n\n    if(video){\n\n      return video.outerHTML;\n\n    }\n\n\n    return '';\n\n  }\n\n\n\/* ==========================================\n   TEXTOS TIPUS\n========================================== *\/\n\n  function typeLabel(type){\n\n    if(\n      type ===\n      'radio'\n    ){\n\n      return 'R\u00c0DIO';\n\n    }\n\n\n    if(\n      type ===\n      'televisio'\n    ){\n\n      return 'TELEVISI\u00d3';\n\n    }\n\n\n    return 'PREMSA';\n\n  }\n\n\n  function typeAction(type){\n\n    if(\n      type ===\n      'radio'\n    ){\n\n      return 'Escoltar';\n\n    }\n\n\n    if(\n      type ===\n      'televisio'\n    ){\n\n      return 'Veure';\n\n    }\n\n\n    return 'Llegir';\n\n  }\n\n\n  function typeIcon(type){\n\n    if(\n      type ===\n      'radio'\n    ){\n\n      return '\u25b6';\n\n    }\n\n\n    if(\n      type ===\n      'televisio'\n    ){\n\n      return '\u25b6';\n\n    }\n\n\n    return '\u2197';\n\n  }\n\n\n\/* ==========================================\n   MODAL\n========================================== *\/\n\n  function openModal(post){\n\n    const type =\n      getMediaType(\n        post\n      );\n\n\n    const title =\n      cleanHTML(\n        post.title.rendered\n      );\n\n\n    const html =\n      getPostContent(\n        post\n      );\n\n\n    modalTitle.textContent =\n      title;\n\n\n    modalType.textContent =\n      typeLabel(\n        type\n      );\n\n\n    modalContent.innerHTML =\n      '';\n\n\n    \/*\n    R\u00c0DIO\n    *\/\n\n    if(\n      type ===\n      'radio'\n    ){\n\n      const audioSource =\n        getAudioSource(\n          html\n        );\n\n\n      if(audioSource){\n\n        const audio =\n          document.createElement(\n            'audio'\n          );\n\n\n        audio.controls =\n          true;\n\n\n        audio.preload =\n          'metadata';\n\n\n        audio.src =\n          audioSource;\n\n\n        modalContent.appendChild(\n          audio\n        );\n\n      }\n\n      else{\n\n        modalContent.innerHTML =\n          html;\n\n      }\n\n    }\n\n\n    \/*\n    TELEVISI\u00d3\n    *\/\n\n    else if(\n      type ===\n      'televisio'\n    ){\n\n      const videoHTML =\n        getVideoHTML(\n          html\n        );\n\n\n      if(videoHTML){\n\n        modalContent.innerHTML =\n          videoHTML;\n\n      }\n\n      else{\n\n        modalContent.innerHTML =\n          html;\n\n      }\n\n    }\n\n\n    \/*\n    PREMSA\n    *\/\n\n    else{\n\n      const link =\n        document.createElement(\n          'a'\n        );\n\n\n      link.className =\n        'mp-media-external';\n\n\n      link.href =\n        post.link;\n\n\n      link.target =\n        '_blank';\n\n\n      link.rel =\n        'noopener';\n\n\n      link.innerHTML =\n        'Llegir publicaci\u00f3 <span>\u2197<\/span>';\n\n\n      modalContent.appendChild(\n        link\n      );\n\n    }\n\n\n    modal.classList.add(\n      'open'\n    );\n\n\n    modal.setAttribute(\n      'aria-hidden',\n      'false'\n    );\n\n\n    document.body.style.overflow =\n      'hidden';\n\n  }\n\n\n  function closeModal(){\n\n    modal.classList.remove(\n      'open'\n    );\n\n\n    modal.setAttribute(\n      'aria-hidden',\n      'true'\n    );\n\n\n    document.body.style.overflow =\n      '';\n\n\n    \/*\n    Aturem reproductors\n    *\/\n\n    modalContent\n      .querySelectorAll(\n        'audio,video'\n      )\n      .forEach(\n        function(media){\n\n          try{\n\n            media.pause();\n\n          }\n\n          catch(e){}\n\n        }\n      );\n\n\n    modalContent.innerHTML =\n      '';\n\n  }\n\n\n  document\n    .querySelectorAll(\n      '[data-close-media]'\n    )\n    .forEach(\n      function(element){\n\n        element.addEventListener(\n          'click',\n          closeModal\n        );\n\n      }\n    );\n\n\n  document.addEventListener(\n    'keydown',\n    function(event){\n\n      if(\n        event.key ===\n        'Escape'\n      ){\n\n        closeModal();\n\n      }\n\n    }\n  );\n\n\n\/* ==========================================\n   TARGETA\n========================================== *\/\n\n  function createCard(post){\n\n    const card =\n      document.createElement(\n        'article'\n      );\n\n\n    card.className =\n      'mp-media-card';\n\n\n    const type =\n      getMediaType(\n        post\n      );\n\n\n    card.dataset.type =\n      type;\n\n\n    const image =\n      getImage(\n        post\n      );\n\n\n    if(!image){\n\n      card.classList.add(\n        'no-image'\n      );\n\n    }\n\n\n    const title =\n      cleanHTML(\n        post.title.rendered\n      );\n\n\n    let html =\n      '';\n\n\n    if(image){\n\n      html +=\n\n        '<div class=\"mp-media-image\" ' +\n\n        'style=\"background-image:url(\\'' +\n\n        image +\n\n        '\\')\"><\/div>';\n\n    }\n\n\n    html +=\n\n      '<div class=\"mp-media-overlay\"><\/div>';\n\n\n    html +=\n\n      '<div class=\"mp-media-card-type\">' +\n\n        typeLabel(type) +\n\n      '<\/div>';\n\n\n    html +=\n\n      '<div class=\"mp-media-card-icon\">' +\n\n        typeIcon(type) +\n\n      '<\/div>';\n\n\n    html +=\n\n      '<div class=\"mp-media-card-date\">' +\n\n        formatDate(\n          post.date\n        ) +\n\n      '<\/div>';\n\n\n    html +=\n\n      '<h3>' +\n\n        title +\n\n      '<\/h3>';\n\n\n    html +=\n\n      '<div class=\"mp-media-card-action\">' +\n\n        typeAction(type) +\n\n        ' <span>\u2192<\/span>' +\n\n      '<\/div>';\n\n\n    card.innerHTML =\n      html;\n\n\n    card.addEventListener(\n      'click',\n      function(){\n\n        openModal(\n          post\n        );\n\n      }\n    );\n\n\n    return card;\n\n  }\n\n\n\/* ==========================================\n   RENDER\n========================================== *\/\n\n  function render(type){\n\n    grid.innerHTML =\n      '';\n\n\n    let posts =\n      mediaPosts;\n\n\n    if(\n      type !==\n      'all'\n    ){\n\n      posts =\n        posts.filter(\n          function(post){\n\n            return (\n              getMediaType(post) ===\n              type\n            );\n\n          }\n        );\n\n    }\n\n\n    if(\n      !posts.length\n    ){\n\n      grid.innerHTML =\n\n        '<div class=\"mp-media-loading\">' +\n\n          'No hi ha publicacions en aquesta categoria.' +\n\n        '<\/div>';\n\n\n      return;\n\n    }\n\n\n    posts\n      .slice(\n        0,\n        12\n      )\n      .forEach(\n        function(post){\n\n          grid.appendChild(\n            createCard(\n              post\n            )\n          );\n\n        }\n      );\n\n  }\n\n\n\/* ==========================================\n   FILTRES\n========================================== *\/\n\n  filters.forEach(\n    function(button){\n\n      button.addEventListener(\n        'click',\n        function(){\n\n          filters.forEach(\n            function(item){\n\n              item.classList.remove(\n                'active'\n              );\n\n            }\n          );\n\n\n          button.classList.add(\n            'active'\n          );\n\n\n          render(\n            button.dataset.mediaFilter\n          );\n\n        }\n      );\n\n    }\n  );\n\n\n\/* ==========================================\n   CARREGA\n========================================== *\/\n\n  intentarEndpoint(0)\n\n    .then(\n      function(posts){\n\n        \/*\n        Nom\u00e9s:\n        EN LOS MEDIOS\n\n        I excloem:\n        PR\u00d2XIMAMENT\n\n        perqu\u00e8 Pr\u00f2ximament nom\u00e9s ha\n        d'apar\u00e9ixer al banner superior.\n        *\/\n\n        mediaPosts =\n          posts.filter(\n            function(post){\n\n              const isMedia =\n                (\n                  hasCategory(\n                    post,\n                    'en-los-medios'\n                  ) ||\n\n                  hasCategory(\n                    post,\n                    'en-els-mitjans'\n                  )\n                );\n\n\n              return (\n                isMedia &&\n                !isProximament(post)\n              );\n\n            }\n          );\n\n\n        render(\n          'all'\n        );\n\n      }\n    )\n\n\n    .catch(\n      function(error){\n\n        console.error(\n          'Error carregant Als mitjans:',\n          error\n        );\n\n\n        grid.innerHTML =\n\n          '<div class=\"mp-media-loading\">' +\n\n            'No s\u2019han pogut carregar les aparicions.' +\n\n          '<\/div>';\n\n      }\n    );\n\n\n})();\n\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_4 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_4 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_4 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_4 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><div class=\"mp-final-cta\">\n\n  <div class=\"mp-final-copy\">\n\n    <div class=\"mp-final-kicker\">\n      +PARTICIPACI\u00d3 +FUTUR\n    <\/div>\n\n    <h2>\n      No et perdes cap novetat.\n    <\/h2>\n\n    <p>\n      Segueix l'actualitat, les propostes i l'agenda de campanya\n      des d'un \u00fanic espai.\n    <\/p>\n\n  <\/div>\n\n\n  <div class=\"mp-final-actions\">\n\n    <a\n      href=\"#\"\n      class=\"mp-final-btn mp-final-btn-main\"\n    >\n      Coneix el projecte\n      <span>\u2192<\/span>\n    <\/a>\n\n    <a\n      href=\"#agenda\"\n      class=\"mp-final-btn mp-final-btn-secondary\"\n    >\n      Veure agenda\n    <\/a>\n\n  <\/div>\n\n<\/div>\n\n\n<style>\n\n.mp-final-cta{\n\n  max-width:1180px;\n\n  margin:\n    0 auto 70px;\n\n  padding:42px;\n\n  display:grid;\n\n  grid-template-columns:\n    1fr auto;\n\n  align-items:center;\n\n  gap:35px;\n\n  border:\n    1px solid #E7E7E9;\n\n  border-radius:32px;\n\n  background:\n\n    radial-gradient(\n      circle at 90% 10%,\n      rgba(215,25,32,.08),\n      transparent 25%\n    ),\n\n    linear-gradient(\n      135deg,\n      #F5F5F6,\n      #FFFFFF\n    );\n\n  font-family:\n    Arial,\n    Helvetica,\n    sans-serif;\n\n}\n\n\n.mp-final-kicker{\n\n  color:#D71920;\n\n  font-size:10px;\n\n  font-weight:900;\n\n  letter-spacing:.16em;\n\n  margin-bottom:10px;\n\n}\n\n\n.mp-final-copy h2{\n\n  margin:0;\n\n  font-size:\n    clamp(\n      34px,\n      4vw,\n      48px\n    );\n\n  line-height:.95;\n\n  letter-spacing:-.05em;\n\n  color:#111;\n\n}\n\n\n.mp-final-copy p{\n\n  max-width:620px;\n\n  margin:\n    14px 0 0;\n\n  color:#6F6F74;\n\n  font-size:15px;\n\n  line-height:1.55;\n\n}\n\n\n.mp-final-actions{\n\n  display:flex;\n\n  gap:10px;\n\n  align-items:center;\n\n  flex-wrap:wrap;\n\n}\n\n\n.mp-final-btn{\n\n  display:inline-flex;\n\n  align-items:center;\n\n  gap:14px;\n\n  padding:\n    14px 20px;\n\n  border-radius:100px;\n\n  font-size:13px;\n\n  font-weight:900;\n\n  text-decoration:none;\n\n  transition:.2s ease;\n\n}\n\n\n.mp-final-btn:hover{\n\n  transform:\n    translateY(-2px);\n\n}\n\n\n.mp-final-btn-main{\n\n  background:#111;\n\n  color:#fff;\n\n}\n\n\n.mp-final-btn-main span{\n\n  font-size:18px;\n\n}\n\n\n.mp-final-btn-secondary{\n\n  background:#fff;\n\n  color:#111;\n\n  border:\n    1px solid #DEDEE1;\n\n}\n\n\n@media(max-width:780px){\n\n  .mp-final-cta{\n\n    grid-template-columns:\n      1fr;\n\n    padding:30px;\n\n    margin:\n      0 15px 55px;\n\n  }\n\n\n  .mp-final-actions{\n\n    justify-content:flex-start;\n\n  }\n\n}\n\n\n@media(max-width:520px){\n\n  .mp-final-actions{\n\n    display:grid;\n\n    grid-template-columns:\n      1fr;\n\n  }\n\n\n  .mp-final-btn{\n\n    justify-content:center;\n\n  }\n\n}\n\n<\/style><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>",
        "protected": false
    },
    "excerpt": {
        "rendered": "",
        "protected": false
    },
    "author": 1,
    "featured_media": 0,
    "parent": 0,
    "menu_order": 0,
    "comment_status": "closed",
    "ping_status": "closed",
    "template": "",
    "meta": {
        "footnotes": ""
    },
    "class_list": [
        "post-342",
        "page",
        "type-page",
        "status-publish",
        "hentry"
    ],
    "_links": {
        "self": [
            {
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/pages\/342",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/pages"
            }
        ],
        "about": [
            {
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/types\/page"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/comments?post=342"
            }
        ],
        "version-history": [
            {
                "count": 25,
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/pages\/342\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 425,
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/pages\/342\/revisions\/425"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/mesparticipacio.org\/es_es\/wp-json\/wp\/v2\/media?parent=342"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}