{"id":4163,"date":"2025-08-13T17:15:28","date_gmt":"2025-08-13T17:15:28","guid":{"rendered":"https:\/\/www.njfuture.org\/?page_id=4163"},"modified":"2025-11-21T13:09:00","modified_gmt":"2025-11-21T13:09:00","slug":"news","status":"publish","type":"page","link":"https:\/\/www.njfuture.org\/news\/","title":{"rendered":"News"},"content":{"rendered":"\n<div class=\"bg-brand-jersey-blue text-white relative mb-10 overflow-hidden\">\n  <div class=\"container py-10 md:py-36 relative\">\n        <div\n      class=\"uppercase w-full md:w-[42%] font-gotham\">\n              <h2 class=\"text-3xl text-brand-grey\">News<\/h2>\n                    <h2 class=\"text-h2 md:text-h1 font-bold mt-6\">\n          Latest News &#038; Updates        <\/h2>\n          <\/div>\n  <\/div>\n\n      <div class=\"max-md:hidden absolute top-0 h-full w-[50%] right-0\"\n      style=\"background-image: url('https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Copy-of-Copy-of-Hoboken-Skyline-Green-Roof-e1763730533706.jpg'); background-size: cover; background-position: top; background-repeat: no-repeat;\">\n      <!-- w-[26.875rem] -->\n      <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Frame-1261152805.svg\" alt=\"hero-banner-vector\"\n        class=\"object-cover object-left absolute top-0 left-0 w-full h-full lg:h-full lg:w-auto   without-contrast-wave-image block\">\n\n      <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Frame-1261152805-1.svg\" alt=\"hero-banner-vector\"\n        class=\"object-cover object-left absolute top-0 left-0 w-full h-full lg:h-full lg:w-auto contrast-wave-image hidden\">\n    <\/div>\n    <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Copy-of-Copy-of-Hoboken-Skyline-Green-Roof-e1763730533706.jpg\" alt=\"hero-banner-image\"\n      class=\"md:hidden w-full object-contain object-center h-[22rem]\">\n      <\/div>\n\n\n<section data-testid=\"section-news-cards\" class=\"w-full bg-white pb-20\">\n  <div class=\"bg-brand-light-steel-blue py-[1.875rem] \">\n    <div class=\"container\">\n\n      <h2 class=\"font-gotham text-h2 font-medium  text-white mb-6 text-center\">\n        BROWSE LIBRARY      <\/h2>\n\n      <!-- Filters -->\n      <div class=\"flex flex-wrap gap-5 justify-center items-center mb-6 \">\n        <button\n          class=\"filter-btn font-tradeGothic transition-all !text-p1 font-normal bg-white text-brand-slate-grey px-4 py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n          data-filter=\"all\">All<\/button>\n                  <div class=\"w-[.0625rem] h-6 bg-white\"><\/div>\n          <button\n            class=\"filter-btn font-tradeGothic !text-p1 font-normal transition-all text-white py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n            data-filter=\"blog\">\n            Blog          <\/button>\n                  <div class=\"w-[.0625rem] h-6 bg-white\"><\/div>\n          <button\n            class=\"filter-btn font-tradeGothic !text-p1 font-normal transition-all text-white py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n            data-filter=\"news-releases\">\n            News Releases          <\/button>\n                  <div class=\"w-[.0625rem] h-6 bg-white\"><\/div>\n          <button\n            class=\"filter-btn font-tradeGothic !text-p1 font-normal transition-all text-white py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n            data-filter=\"newsletters\">\n            Newsletters          <\/button>\n                  <div class=\"w-[.0625rem] h-6 bg-white\"><\/div>\n          <button\n            class=\"filter-btn font-tradeGothic !text-p1 font-normal transition-all text-white py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n            data-filter=\"njf-in-the-news\">\n            NJF in the News          <\/button>\n                  <div class=\"w-[.0625rem] h-6 bg-white\"><\/div>\n          <button\n            class=\"filter-btn font-tradeGothic !text-p1 font-normal transition-all text-white py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n            data-filter=\"op-ed-articles\">\n            Op-Ed Articles          <\/button>\n                  <div class=\"w-[.0625rem] h-6 bg-white\"><\/div>\n          <button\n            class=\"filter-btn font-tradeGothic !text-p1 font-normal transition-all text-white py-2 rounded-full hover:bg-white hover:text-brand-slate-grey hover:px-4\"\n            data-filter=\"testimonies-statements\">\n            Testimonies &amp; Statements          <\/button>\n              <\/div>\n\n      <div class=\"w-full flex flex-col sm:flex-row justify-center items-center gap-6 sm:gap-8\">\n        <!-- Search form with clear button and search icon -->\n        <div class=\"bg-white flex  w-full lg:w-[26rem] md:w-[50%] overflow-hidden rounded relative\">\n          <input type=\"text\" id=\"searchInput\"\n            class=\"w-full h-full font-tradeGothic pl-6 pr-10 py-[1.825rem]  ring-0 outline-0 placeholder:text-brand-slate-grey text-brand-slate-grey text-p2\"\n            placeholder=\"Search by Keyword\" \/>\n\n          <!-- Clear search button -->\n          <div id=\"cross-search-icon\" class=\"absolute right-0 top-0 bottom-0 clear-search\" style=\"display: none;\">\n            <button type=\"button\"\n              class=\"w-14 cursor-pointer h-full flex justify-center items-center text-brand-slate-grey hover:text-[#004970]\">\n              <img decoding=\"async\"\n                src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Button_-Close.svg\"\n                alt=\"close-icon\" class=\"w-8 h-8 shrink-0\" \/>\n            <\/button>\n          <\/div>\n\n          <!-- Search icon -->\n          <div id=\"search-icon\" class=\"absolute right-1 top-0 bottom-0  items-center\" style=\"display: flex;\">\n            <a class=\"aspect-square w-14 flex justify-center items-center\">\n              <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/09\/Search.svg\"\n                class=\"w-9 h-9 shrink-0 block search-icon-blue\" alt=\"Search\">\n              <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/themes\/new-jersey-production\/assets\/images\/icons\/NJF-Global-Icon-Search-white.svg\"\n                class=\"w-7 hidden search-icon-white\" alt=\"Search\">\n            <\/a>\n          <\/div>\n        <\/div>\n\n        <!-- news topic filter -->\n              <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Active search\/query pills -->\n  <div id=\"container-query-pills\" class=\"w-full bg-brand-grey py-[1.6875rem] hidden\">\n    <div class=\"container flex justify-between items-center gap-6\">\n      <div id=\"activeFilters\" class=\"flex items-center flex-wrap gap-[0.6875rem] w-[calc(100%-12rem)]\"><\/div>\n      <button id=\"clearAllSearchBtn\"\n        class=\"hidden w-max shrink-0 items-start gap-2 text-brand-slate-grey font-tradeGothic text-p2\">\n        <img decoding=\"async\" src=\"https:\/\/www.njfuture.org\/wp-content\/themes\/new-jersey-production\/assets\/images\/icons\/close-button-gray-outline.svg\"\n          class=\"w-5 h-5 flex-shrink-0 mt-[.325rem]\" alt=\"close\">\n        <span>Clear Search<\/span>\n      <\/button>\n    <\/div>\n  <\/div>\n\n  <!-- total results -->\n  <div class=\"container\">\n    <div id=\"results-container\" class=\"w-full my-8 hidden\">\n      <p id=\"resultsCount\" class=\"font-tradeGothic text-p3 font-normal text-brand-black text-left\">0 results<\/p>\n    <\/div>\n\n    <!-- news cards -->\n    <div id=\"news-container\" class=\"grid-three gap-x-6 gap-y-10\"><\/div>\n\n    <!-- Load More -->\n    <button id=\"loadMoreBtn\"\n      class=\"mx-auto mt-8  items-center gap-2 attendee-button bg-transparent text-brand-jersey-blue border-2 border-brand-jersey-blue px-5 pt-[0.75rem] pb-[0.5625rem] rounded-[.3125rem] transition-all font-normal hover:opacity-80 cursor-pointer no-underline text-center w-fit text-p2 font-tradeGothic focus:outline-none active:outline-none hidden\">\n      Load More\n      <svg class=\"transition-transform group-hover:translate-x-1 mt-[-0.3125rem]\" width=\"32\" height=\"31\"\n        viewBox=\"0 0 32 31\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n        <path d=\"M11.8496 7.5L20.1515 15.5L11.8496 23.5\" stroke=\"#004970\" stroke-linecap=\"round\" \/>\n      <\/svg>\n    <\/button>\n\n  <\/div>\n<\/section>\n\n<script>\n  function debounce(func, wait) {\n    let timeout;\n    return function (...args) {\n      clearTimeout(timeout);\n      timeout = setTimeout(() => func.apply(this, args), wait);\n    };\n  }\n\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    const searchInput = document.getElementById(\"searchInput\");\n    const loadMoreBtn = document.getElementById(\"loadMoreBtn\");\n    const newsContainer = document.getElementById(\"news-container\");\n    const activeFiltersEl = document.getElementById(\"activeFilters\");\n    const clearAllSearchBtn = document.getElementById(\"clearAllSearchBtn\");\n    const resultsCountEl = document.getElementById(\"resultsCount\");\n    const containerQueryPills = document.getElementById(\"container-query-pills\");\n    const resultsContainer = document.getElementById(\"results-container\");\n    const searchIcon = document.getElementById(\"search-icon\");\n    const clearSearchBtn = document.getElementById(\"cross-search-icon\");\n    const topicsSelect = document.getElementById(\"news-topics-select\");\n    const optionsContainer = document.getElementById(\"news-topics-options-container\");\n    const newsTopicClearIcon = document.getElementById(\"news-topic-cross-icon\");\n    const newsTopicSelectIcon = document.getElementById(\"news-topic-select-icon\");\n\n    let currentPage = 1;\n    let maxPages = 1;\n    let selectedTypes = [{ label: \"All\", value: \"all\" }];\n\n    function getSelectedTopics() {\n      if (!topicsSelect) return [];\n      const selectedText = topicsSelect.querySelector(\".selected-text\");\n      const val = selectedText.dataset.value || \"\";\n      const label = selectedText.textContent.trim();\n      return val && val !== \"all\" ? [{ label, value: val }] : [];\n    }\n    function getSelectedFilters() {\n      return selectedTypes;\n    }\n\n\n    function renderActiveFilters(search, topics, filters) {\n      activeFiltersEl.innerHTML = \"\";\n\n      if (search) addPill(search, \"search\");\n      if (topics.length) addPill(topics[0], \"topic\"); \/\/ show only first topic\n      filters.forEach(f => {\n        if (f !== \"All\") addPill(f, \"type\");\n      });\n      const hasFilters = search || topics.length || (filters.length && !filters.includes(\"All\"));\n\n      clearAllSearchBtn.style.display = hasFilters ? \"flex\" : \"none\";\n      containerQueryPills.style.display = hasFilters ? \"flex\" : \"none\";\n    }\n    function addPill(label, type) {\n      const pill = document.createElement(\"div\");\n      pill.className =\n        \"w-max pl-[0.875rem] pt-[0.5625rem] pr-[0.625rem] pb-[0.4375rem] bg-white rounded-[2.5rem] flex items-center gap-[0.625rem] border border-brand-secondary-blue\";\n\n      const span = document.createElement(\"span\");\n      span.textContent = label;\n\n      const img = document.createElement(\"img\");\n      img.src = \"https:\/\/www.njfuture.org\/wp-content\/themes\/new-jersey-production\/assets\/images\/icons\/close-btn-gray.svg\";\n      img.className =\n        \"w-[1.625rem] h-[1.625rem] flex-shrink-0 cursor-pointer mt-[-0.125rem]\";\n\n      img.addEventListener(\"click\", () => {\n        if (type === \"search\") {\n          searchInput.value = \"\";\n          clearSearchBtn.style.display = \"none\";\n          searchIcon.style.display = \"flex\";\n        } else if (type === \"topic\") {\n          const selectedText = topicsSelect.querySelector(\".selected-text\");\n          selectedText.textContent = \"By Topic\";\n          selectedText.dataset.value = \"all\";\n          if (newsTopicClearIcon) newsTopicClearIcon.style.display = \"none\";\n          if (newsTopicSelectIcon) newsTopicSelectIcon.style.display = \"flex\";\n        } else if (type === \"type\") {\n          selectedTypes = selectedTypes.filter(f => f.label !== label);\n          if (selectedTypes.length === 0) {\n            selectedTypes = [{ label: \"All\", value: \"all\" }];\n          }\n        }\n\n        updateFilterStyles();\n        renderActiveFilters(\n          searchInput.value.trim(),\n          getSelectedTopics().map(t => t.label),\n          getSelectedFilters().map(f => f.label)\n        );\n\n        loadPosts();\n      });\n\n      pill.appendChild(span);\n      pill.appendChild(img);\n      activeFiltersEl.appendChild(pill);\n    }\n\n    clearAllSearchBtn.addEventListener(\"click\", () => {\n      searchInput.value = \"\";\n      if (topicsSelect) {\n        const selectedText = topicsSelect.querySelector(\".selected-text\");\n        selectedText.textContent = \"By Topic\";\n        selectedText.dataset.value = \"all\";\n        if (newsTopicClearIcon) newsTopicClearIcon.style.display = \"none\";\n        if (newsTopicSelectIcon) newsTopicSelectIcon.style.display = \"flex\";\n      }\n\n      selectedTypes = [{ label: \"All\", value: \"all\" }];\n      clearSearchBtn.style.display = \"none\";\n      searchIcon.style.display = \"flex\";\n      updateFilterStyles();\n      renderActiveFilters(\n        searchInput.value.trim(),\n        getSelectedTopics().map(t => t.label),\n        getSelectedFilters().map(f => f.label)\n      );\n      loadPosts();\n    });\n\n\n    async function loadPosts(page = 1, append = false) {\n      try {\n        const search = searchInput.value.trim();\n        const topicsArray = getSelectedTopics();\n        const topicLabels = topicsArray.map(t => t.label);\n        const topics = topicsArray.map(t => t.value);\n\n        const filters = getSelectedFilters().map(f => f.value);\n        const filterLabels = getSelectedFilters().map(f => f.label);\n\n        let filterBy = [];\n        if (topics.length) filterBy.push(`news_topics: [${topics}]`);\n        if (filters.length && filters.some(f => f.trim() !== \"\") && !filters.includes(\"all\")) {\n          filterBy.push(`news_types: [${filters.map(f => `\"${f}\"`).join(\", \")}]`);\n        }\n        const filterString = filterBy.length ? filterBy.join(\" && \") : \"\";\n\n        const response = await fetch(\n          `${envConfig.TYPESENSE_BASE_URL}:${envConfig.TYPESENSE_PORT}\/collections\/news\/documents\/search?` +\n          new URLSearchParams({\n            q: `${search}` || \"*\",\n            query_by: \"title,news_date,news_topics,news_types,content,choose_news_type,choose_news_type_slug,pdf_content\",\n            filter_by: filterString,\n            sort_by: \"unix_date:desc\",\n            per_page: 9,\n            page: page,\n            num_typos: 0\n          }),\n          {\n            headers: {\n              \"Content-Type\": \"application\/json\",\n              \"X-TYPESENSE-API-KEY\": envConfig.TYPESENSE_SEARCH_ONLY_KEY,\n            },\n          }\n        );\n\n        if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\n        const data = await response.json();\n        const count = data.found ?? 0;\n        resultsCountEl.textContent = `${count} result${count !== 1 ? \"s\" : \"\"}`;\n\n        data.found === 0\n          ? resultsContainer.classList.add(\"hidden\")\n          : resultsContainer.classList.remove(\"hidden\");\n        if (!append) {\n          newsContainer.innerHTML = data.found === 0\n            ? `<div class=\"text-center text-brand-black text-p1 py-10 col-span-6\">There are no results for that search, please try again.<\/div>`\n            : generateNewsHTML(data.hits);\n\n          data.found === 0\n            ? resultsContainer.classList.add(\"hidden\")\n            : resultsContainer.classList.remove(\"hidden\");\n        } else {\n          newsContainer.innerHTML += generateNewsHTML(data.hits);\n        }\n\n        currentPage = page;\n        maxPages = Math.ceil(data.found \/ 9);\n        loadMoreBtn.style.display = maxPages > currentPage ? \"flex\" : \"none\";\n      } catch (error) {\n        console.error(\"Error fetching news:\", error);\n      }\n    }\n\n    function generateNewsHTML(news) {\n      return news.map(hit => {\n        const n = hit.document;\n        let href = n.permalink;\n        let target = \"_self\";\n        let featured_image = n.featured_image || `${envConfig.NJF_BASE_URL}\/wp-content\/uploads\/2025\/07\/NJF-Logo-Navigation.svg`;\n        let newsType = n.choose_news_type;\n        let newsTypeSlug = n.choose_news_type_slug;\n\n        if (!newsType) {\n          if (n.news_types?.length) {\n            newsType = n?.news_types[0]?.includes(\"njf-in-the-news\")\n              ? \"NJF in the News\"\n              : n?.news_types[0]?.replace(\/[-_]\/g, \" \");\n            newsTypeSlug = n?.news_types[0];\n          } else {\n            newsType = \"\";\n            newsTypeSlug = ''\n          }\n        }\n\n        if (n.choose_news_type_slug === \"testimonies-statements\" || newsTypeSlug === \"testimonies-statements\") {\n          href = n.upload_link || '';\n          target = \"_blank\";\n\n          \/\/ Prefer the server-resolved preview URL (set on indexing for Testimonies\n          \/\/ with file attachments). Fall back to the legacy filename dance only when\n          \/\/ the record was indexed before the preview URL was populated.\n          if (!n.featured_image && n.upload_link && \/\\.pdf(\\?|$)\/i.test(n.upload_link)) {\n            const pdfPreview = `${n.upload_link}.png`;\n            const fallbackPreview = n.upload_link.replace(\/\\.pdf(\\?|$)\/i, \"-preview-large.png\");\n            featured_image = `\"${pdfPreview}\" onerror=\"this.onerror=null;this.src='${fallbackPreview}'\"`;\n          }\n        } else if (n.choose_news_type_slug === \"njf-in-the-news\" || newsTypeSlug === \"njf-in-the-news\") {\n          href = n.njf_url || '';\n          target = \"_blank\";\n\n          if (n.njf_url && \/\\.pdf(\\?|$)\/i.test(n.njf_url)) {\n            const pdfPreview = `${n.njf_url}.png`;\n            const fallbackPreview = n.njf_url.replace(\/\\.pdf(\\?|$)\/i, \"-preview-large.png\");\n            featured_image = `\"${pdfPreview}\" onerror=\"this.onerror=null;this.src='${fallbackPreview}'\"`;\n          }\n        } else {\n          href = n.permalink;\n          target = \"_self\";\n        }\n\n        return ` \n      <${href ? `a href=\"${href}\" target=\"${target}\"` : \"div\"}\n        class=\"gridBox-three p-6 bg-white flex flex-col shadow-[0_4px_20px_0_rgba(0,0,0,0.08)] overflow-hidden ${href ? \"hover:!scale-[1.02] !transition-all !duration-200\" : ''} \">\n        <div class=\"w-full h-[12.125rem] min-h-[12.125rem] max-h-[12.125rem] bg-brand-light-green\">\n          <img src=${featured_image}\n            alt=\"${n.title}\" class=\"h-full w-full object-contain\">\n        <\/div>\n        <div class=\"w-full h-full flex flex-col gap-2 pt-[1.5625rem]\">\n          ${n.news_date ? `<p class=\"font-tradeGothic text-p3 font-normal text-brand-future-green\">${n.news_date}<\/p>` : \"\"}\n          <h3 class=\"font-tradeGothic text-p1 font-normal text-brand-jersey-blue\">${n.title}<\/h3>\n          ${newsType\n            ? `<div class=\"mt-auto pt-2\">\n          <span class=\"inline-block w-max font-tradeGothic text-p3 font-normal px-4 py-[0.625rem] rounded-[0.3125rem] border border-brand-future-green text-brand-future-green bg-[rgba(209,240,205,0.62)]\">${newsType}<\/span><\/div>`\n            : \"\"}\n        <\/div>\n      <\/${href ? \"a\" : \"div\"}>`;\n      }).join(\"\");\n    }\n\n\n    searchInput.addEventListener(\"input\", debounce(() => {\n      clearSearchBtn.style.display = searchInput.value ? \"flex\" : \"none\";\n      searchIcon.style.display = searchInput.value ? \"none\" : \"flex\";\n      loadPosts();\n      if (\n        searchInput.value.trim() ||\n        getSelectedTopics().length ||\n        getSelectedFilters().length\n      ) {\n        renderActiveFilters(\n          searchInput.value.trim(),\n          getSelectedTopics().map(t => t.label),\n          getSelectedFilters().map(f => f.label)\n        );\n      }\n    }, 300));\n\n    clearSearchBtn.addEventListener(\"click\", () => {\n      searchInput.value = \"\";\n      clearSearchBtn.style.display = \"none\";\n      searchIcon.style.display = \"flex\";\n      renderActiveFilters(\n        searchInput.value.trim(),\n        getSelectedTopics().map(t => t.label),\n        getSelectedFilters().map(f => f.label)\n      );\n      loadPosts();\n    });\n\n    function updateFilterStyles() {\n      document.querySelectorAll(\".filter-btn\").forEach(btn => {\n        const value = btn.dataset.filter;\n        const isSelected = selectedTypes.some(f => f.value === value);\n\n        if (isSelected) {\n          btn.classList.add(\"bg-white\", \"text-brand-slate-grey\", \"px-4\");\n          btn.classList.remove(\"bg-transparent\", \"text-white\", \"px-0\");\n        } else {\n          btn.classList.add(\"bg-transparent\", \"text-white\", \"px-0\");\n          btn.classList.remove(\"bg-white\", \"text-brand-slate-grey\", \"px-4\");\n        }\n      });\n    }\n\n    document.querySelectorAll(\".filter-btn\").forEach(btn => {\n      btn.addEventListener(\"click\", () => {\n        const value = btn.dataset.filter;\n        const label = btn.textContent.trim();\n        if (value === \"all\") {\n          selectedTypes = [{ label: \"All\", value: \"all\" }];\n        } else {\n          selectedTypes = selectedTypes.filter(f => f.value !== \"all\");\n          const exists = selectedTypes.some(f => f.value === value);\n          if (exists) {\n            selectedTypes = selectedTypes.filter(f => f.value !== value);\n          } else {\n            selectedTypes.push({ label, value });\n          }\n          if (selectedTypes.length === 0) {\n            selectedTypes = [{ label: \"All\", value: \"all\" }];\n          }\n        }\n        if (\n          searchInput.value.trim() ||\n          getSelectedTopics().length ||\n          getSelectedFilters().length\n        ) {\n          renderActiveFilters(\n            searchInput.value.trim(),\n            getSelectedTopics().map(t => t.label),\n            getSelectedFilters().map(f => f.label)\n          );\n        }\n        updateFilterStyles();\n        loadPosts();\n      });\n    });\n    if (topicsSelect && optionsContainer) {\n      const selectedText = topicsSelect.querySelector(\".selected-text\");\n      const topicOptions = optionsContainer.querySelectorAll(\"#news-topics-option\");\n\n      topicsSelect.addEventListener(\"click\", (e) => {\n        optionsContainer.classList.toggle(\"hidden\");\n        newsTopicSelectIcon.classList.toggle(\"rotate-180\");\n        e.stopPropagation();\n        e.preventDefault();\n      });\n\n      topicOptions.forEach(option => {\n        option.addEventListener(\"click\", (e) => {\n          e.stopPropagation();\n          e.preventDefault();\n          selectedText.textContent = option.textContent.trim();\n          selectedText.dataset.value = option.dataset.value;\n          matchValues = option.dataset.value != \"all\" && option.dataset.value;\n          newsTopicClearIcon.style.display = matchValues ? 'flex' : \"none\";\n          newsTopicSelectIcon.style.display = matchValues ? \"none\" : \"flex\";\n          optionsContainer.classList.add(\"hidden\");\n          newsTopicSelectIcon.classList.remove(\"rotate-180\");\n          if (\n            searchInput.value.trim() ||\n            getSelectedTopics().length ||\n            getSelectedFilters().length\n          ) {\n            renderActiveFilters(\n              searchInput.value.trim(),\n              getSelectedTopics().map(t => t.label),\n              getSelectedFilters().map(f => f.label)\n            );\n          }\n          loadPosts();\n        });\n      });\n\n      newsTopicClearIcon.addEventListener(\"click\", (e) => {\n        e.stopPropagation();\n        e.preventDefault();\n        selectedText.textContent = \"By Topic\";\n        selectedText.dataset.value = \"all\";\n        newsTopicClearIcon.style.display = \"none\";\n        newsTopicSelectIcon.style.display = \"flex\";\n        newsTopicSelectIcon.classList.remove(\"rotate-180\");\n        optionsContainer.classList.add(\"hidden\");\n        renderActiveFilters(\n          searchInput.value.trim(),\n          getSelectedTopics().map(t => t.label),\n          getSelectedFilters().map(f => f.label)\n        );\n        loadPosts();\n      });\n\n      document.addEventListener(\"click\", e => {\n        if (!topicsSelect.contains(e.target)) {\n          optionsContainer.classList.add(\"hidden\");\n          newsTopicSelectIcon.classList.remove(\"rotate-180\");\n        }\n      });\n    }\n\n    loadMoreBtn.addEventListener(\"click\", () => loadPosts(currentPage + 1, true));\n\n\n    loadPosts();\n    updateFilterStyles();\n  });\n<\/script>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-4163","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>News - New Jersey Future<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.njfuture.org\/news\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"News - New Jersey Future\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.njfuture.org\/news\/\" \/>\n<meta property=\"og:site_name\" content=\"New Jersey Future\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/NewJerseyFuture\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-21T13:09:00+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@NewJerseyFuture\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/news\\\/\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/news\\\/\",\"name\":\"News - New Jersey Future\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#website\"},\"datePublished\":\"2025-08-13T17:15:28+00:00\",\"dateModified\":\"2025-11-21T13:09:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/news\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.njfuture.org\\\/news\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/news\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.njfuture.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"News\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#website\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/\",\"name\":\"New Jersey Future\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.njfuture.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#organization\",\"name\":\"New Jersey Future\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.njfuture.org\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/NJF-Footer-Logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.njfuture.org\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/NJF-Footer-Logo.svg\",\"width\":354,\"height\":285,\"caption\":\"New Jersey Future\"},\"image\":{\"@id\":\"https:\\\/\\\/www.njfuture.org\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/NewJerseyFuture\\\/\",\"https:\\\/\\\/x.com\\\/NewJerseyFuture\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"News - New Jersey Future","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.njfuture.org\/news\/","og_locale":"en_US","og_type":"article","og_title":"News - New Jersey Future","og_url":"https:\/\/www.njfuture.org\/news\/","og_site_name":"New Jersey Future","article_publisher":"https:\/\/www.facebook.com\/NewJerseyFuture\/","article_modified_time":"2025-11-21T13:09:00+00:00","twitter_card":"summary_large_image","twitter_site":"@NewJerseyFuture","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.njfuture.org\/news\/","url":"https:\/\/www.njfuture.org\/news\/","name":"News - New Jersey Future","isPartOf":{"@id":"https:\/\/www.njfuture.org\/#website"},"datePublished":"2025-08-13T17:15:28+00:00","dateModified":"2025-11-21T13:09:00+00:00","breadcrumb":{"@id":"https:\/\/www.njfuture.org\/news\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.njfuture.org\/news\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.njfuture.org\/news\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.njfuture.org\/"},{"@type":"ListItem","position":2,"name":"News"}]},{"@type":"WebSite","@id":"https:\/\/www.njfuture.org\/#website","url":"https:\/\/www.njfuture.org\/","name":"New Jersey Future","description":"","publisher":{"@id":"https:\/\/www.njfuture.org\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.njfuture.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.njfuture.org\/#organization","name":"New Jersey Future","url":"https:\/\/www.njfuture.org\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.njfuture.org\/#\/schema\/logo\/image\/","url":"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/12\/NJF-Footer-Logo.svg","contentUrl":"https:\/\/www.njfuture.org\/wp-content\/uploads\/2025\/12\/NJF-Footer-Logo.svg","width":354,"height":285,"caption":"New Jersey Future"},"image":{"@id":"https:\/\/www.njfuture.org\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/NewJerseyFuture\/","https:\/\/x.com\/NewJerseyFuture"]}]}},"_links":{"self":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages\/4163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/comments?post=4163"}],"version-history":[{"count":11,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages\/4163\/revisions"}],"predecessor-version":[{"id":14654,"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/pages\/4163\/revisions\/14654"}],"wp:attachment":[{"href":"https:\/\/www.njfuture.org\/wp-json\/wp\/v2\/media?parent=4163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}