1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <title>News-and-notices | Town of Armstrong Creek</title> 5 <meta name="description" content=""> 6 <meta name="keywords" content=""> 7 <meta name="author" content="Town Web | SK"> 8 <meta charset="UTF-8"> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 10 <link rel="icon" type="image/x-icon" href="https://storage.googleapis.com/juniper-media-library/509/2026/04/faviocn-ac.png"> 11 <meta property="og:title" content="News-and-notices | Town of Armstrong Creek"> 12 <meta property="og:description" content=""> 13 <meta property="og:site_name" content="Town of Armstrong Creek"> 14 <meta property="og:type" content="website"> 15 <link rel="canonical" href="https://armstrongcreek.org/news-and-notices/"> 16 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous" /> 17 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" integrity="sha512-MV7K8+y+gLIBoVD59lQIYicR65iaqukzvf/nwasF0nqhPay5w/9lJmVM2hMDcnK1OnMGCdVK+iQrJ7lzPJQd1w==" crossorigin="anonymous" referrerpolicy="no-referrer" /> 18 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css" integrity="sha512-tS3S5qG0BlhnQROyJXvNjeEM4UpMXHrQfTGmbQ1gKmelCxlSEBUaxhRBj/EFTzpbP4RVSrpEikbmdJobCvhE3g==" crossorigin="anonymous" referrerpolicy="no-referrer" /> 19 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.css" integrity="sha512-Woz+DqWYJ51bpVk5Fv0yES/edIMXjj3Ynda+KWTIkGoynAMHrqTcDUQltbipuiaD5ymEo9520lyoVOo9jCQOCA==" crossorigin="anonymous" referrerpolicy="no-referrer" /> 20
20<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
20 21
21<script src="https://darkskyapp.github.io/skycons/skycons.js"></script>
21 22
22<script src="/settings.js?v=f57aa3e4"></script>
22 23 <link rel="stylesheet" href="/setting.css" /> 24 <style> 25@import url('https://fonts.googleapis.com/css?family=Roboto:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); 26@import url('https://fonts.googleapis.com/css?family=Libre+Baskerville:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); 27:root{--favicon-image:https://storage.googleapis.com/juniper-media-library/509/2026/04/faviocn-ac.png;--default-featured-image:https://storage.googleapis.com/juniper-media-library/509/2026/04/News-post-image.png;--primary-color:#b81922;--secondary-color:#0c8144;--tertiary-color:#fafafa;--primary-font:"Roboto";--hedings-font:"Libre Baskerville";--default-size:16px;--h1-size:36px;--h2-size:28px;--h3-size:24px;--h4-size:20px;--h5-size:16px;--h6-size:12px;--a-size:16px;--a-color:;}body .sk-page-content{font-family:var(--primary-font);font-size:var(--default-size);}body .sk-page-content h1,body .sk-page-content h2,body .sk-page-content h3,body .sk-page-content h4,body .sk-page-content h5,body .sk-page-content h6{font-family:var(--hedings-font);}body .sk-page-content h1{font-size:var(--h1-size);}body .sk-page-content h2{font-size:var(--h2-size);}body .sk-page-content h3{font-size:var(--h3-size);}body .sk-page-content h4{font-size:var(--h4-size);}body .sk-page-content h5{font-size:var(--h5-size);}body .sk-page-content h6{font-size:var(--h6-size);}body .sk-page-content a{font-size:var(--a-size);}body .sk-page-content a{color:var(--a-color);} 28</style> 29<link rel="stylesheet" href="/theme.css?v=09973c8b" /> 30 <link rel="stylesheet" href="/style.css" /> 31
31<script>window.HeyGovApi = "https:\/\/api.heygov.com"</script>
31<script src="https://edge.heygov.com/heygov.js" data-heygov-jurisdiction="armstrongcreek.org" data-heygov-button-text="Report an issue" data-heygov-button-show="false" data-heygov-button-style="bottom-right" ></script>
31<style>.heygov-widget-button{left:auto;right:15px;top:auto;bottom:15px}</style><style>.heygov-widget-button{display:none}</style><style>.userway_p3{left:auto!important;right:15px!important;top:auto!important;bottom:15px!important}</style><style>.userway_p3 .userway_buttons_wrapper{left:auto!important;right:15px!important;top:auto!important;bottom:15px!important;transform: none!important;}</style> 32 <!-- Google tag (gtag.js) -->
vendor: 96 bytes, lines 32-33
32 33 <script async src='https://www.googletagmanager.com/gtag/js?id=
33G-6BPCKRV643
vendor: 44 bytes, lines 33-34
33'></script> 34
34<script> 35
vendor: 235 bytes, lines 35-38
35window.dataLayer = window.dataLayer || []; 36 function gtag(){dataLayer.push(arguments);} 37 gtag('js', new Date()); 38 gtag('config', '
38G-6BPCKRV643
vendor: 36 bytes, lines 38-39
38'); 39
39</script>
39 40 41
41<script> 42 (function(d) { 43 var s = d.createElement("script"); 44 /* uncomment the following line to override default position*/ 45 s.setAttribute("data-position", 3); 46 /* uncomment the following line to override default size (values: small, large)*/ 47 /* s.setAttribute("data-size", "large");*/ 48 /* uncomment the following line to override default language (e.g., fr, de, es, he, nl, etc.)*/ 49 /* s.setAttribute("data-language", "null");*/ 50 /* uncomment the following line to override color set via widget (e.g., #053f67)*/ 51 /*s.setAttribute("data-color", "#ccc");*/ 52 /* uncomment the following line to override type set via widget (1=person, 2=chair, 3=eye, 4=text)*/ 53 /* s.setAttribute("data-type", "1");*/ 54 /* s.setAttribute("data-statement_text:", "Our Accessibility Statement");*/ 55 /* s.setAttribute("data-statement_url", "http://www.example.com/accessibility";*/ 56 /* uncomment the following line to override support on mobile devices*/ 57 /* s.setAttribute("data-mobile", true);*/ 58 /* uncomment the following line to set custom trigger action for accessibility menu*/ 59 /* s.setAttribute("data-trigger", "triggerId")*/ 60 s.setAttribute("data-account", "UILnNGMstU"); 61 s.setAttribute("src", "https://cdn.userway.org/widget.js"); 62 (d.body || d.head).appendChild(s); 63 })(document) 64 </script>
64 65
65<script> 66 /* Third-party accessibility/gallery widget a11y patches. These run only when 67 the widget is present and only ADD attributes (labels / aria-hidden on 68 decorative icons / landmark wrappers) -- we never hide or remove a working 69 widget, so sites that use UserWay/accessiBe/Lightbox are unaffected. */ 70 (function () { 71 var UW_SELECTOR = '[class*="userway"],[class*="uwaw"],[id*="userway"]'; 72 function accessibleName(el) { 73 return el.getAttribute('aria-label') || 74 el.getAttribute('aria-labelledby') || 75 el.getAttribute('title') || 76 (el.textContent && el.textContent.trim()); 77 } 78 function labelUserwayTriggers() { 79 var buttons = document.querySelectorAll('[role="button"]'); 80 for (var i = 0; i < buttons.length; i++) { 81 var el = buttons[i]; 82 if (!el.closest(UW_SELECTOR)) continue; 83 if (!accessibleName(el)) el.setAttribute('aria-label', 'Accessibility menu'); 84 } 85 /* The launcher's inner SVG icons are decorative once the button is 86 named; hide them so they don't trip svg-has-no-accessible-name. */ 87 var svgs = document.querySelectorAll(UW_SELECTOR + ' svg'); 88 for (var j = 0; j < svgs.length; j++) { 89 var svg = svgs[j]; 90 if (accessibleName(svg) || svg.querySelector('title')) continue; 91 svg.setAttribute('aria-hidden', 'true'); 92 svg.setAttribute('focusable', 'false'); 93 } 94 /* UserWay marks its launcher wrapper aria-hidden="true" yet leaves the 95 launcher button tabbable (aria_hidden_nontabbable). The button is a 96 real control, so un-hide the wrapper rather than remove keyboard 97 access. Only touch wrappers that actually hold a focusable element. */ 98 var hiddenWraps = document.querySelectorAll(UW_SELECTOR + '[aria-hidden="true"]'); 99 for (var w = 0; w < hiddenWraps.length; w++) { 100 if (hiddenWraps[w].querySelector('a[href],button,input,select,textarea,[tabindex],[role="button"]')) { 101 hiddenWraps[w].removeAttribute('aria-hidden'); 102 } 103 } 104 } 105 /* accessiBe (paid ADA add-on some clients load) renders its launcher inside 106 open shadow roots on <access-widget-ui> hosts, with icon SVGs that have no 107 accessible name and occasionally an unnamed button. We keep the widget 108 working and just name/hide those so they stop failing the scanner. */ 109 function patchAccessibe() { 110 /* accessiBe also drops a light-DOM trigger <div role="button"> with no 111 text/label ("button role has no associated label"); name it. */ 112 var triggers = document.querySelectorAll('.acsb-trigger,[class*="acsb"][role="button"]'); 113 for (var t = 0; t < triggers.length; t++) { 114 if (!accessibleName(triggers[t])) triggers[t].setAttribute('aria-label', 'Accessibility options'); 115 } 116 var hosts = document.querySelectorAll('access-widget-ui'); 117 for (var i = 0; i < hosts.length; i++) { 118 var root = hosts[i].shadowRoot; 119 if (!root) continue; 120 var svgs = root.querySelectorAll('svg'); 121 for (var s = 0; s < svgs.length; s++) { 122 if (accessibleName(svgs[s]) || svgs[s].querySelector('title')) continue; 123 svgs[s].setAttribute('aria-hidden', 'true'); 124 svgs[s].setAttribute('focusable', 'false'); 125 } 126 var btns = root.querySelectorAll('button,[role="button"]'); 127 for (var b = 0; b < btns.length; b++) { 128 if (!accessibleName(btns[b])) btns[b].setAttribute('aria-label', 'Accessibility options'); 129 } 130 /* The host sits directly under <body>, so its content is "not within 131 a landmark". Make each visible, non-empty host a regi
131on landmark, 132 labelled from its button when present else an index (kept unique 133 to avoid the duplicate-landmark-label rule). */ 134 var host = hosts[i]; 135 if (!host.getAttribute('role') && root.childElementCount > 0 && getComputedStyle(host).display !== 'none') { 136 var namer = root.querySelector('button,[role="button"]'); 137 host.setAttribute('role', 'region'); 138 host.setAttribute('aria-label', ((namer && accessibleName(namer)) || ('Accessibility widget ' + (i + 1))).slice(0, 60)); 139 } 140 } 141 /* accessiBe's screen-reader-only <a>/<span> helpers are also loose under 142 <body>; gather them under one region landmark. */ 143 var loose = document.querySelectorAll('body > a.acsb-sr-only, body > span.acsb-sr-alert, body > .acsb-sr-only'); 144 if (loose.length) { 145 var region = document.getElementById('acsb-sr-landmark'); 146 if (!region) { 147 region = document.createElement('div'); 148 region.id = 'acsb-sr-landmark'; 149 region.setAttribute('role', 'region'); 150 region.setAttribute('aria-label', 'Accessibility screen reader helpers'); 151 loose[0].parentNode.insertBefore(region, loose[0]); 152 } 153 for (var l = 0; l < loose.length; l++) { 154 if (loose[l].parentNode !== region) region.appendChild(loose[l]); 155 } 156 } 157 } 158 /* Lightbox2 (image gallery lib) injects close/cancel controls as 159 <a role="button"> with no text -> "button role has no associated label". */ 160 function patchLightbox() { 161 var map = [ 162 ['.lb-close', 'Close image'], 163 ['.lb-cancel', 'Close image'], 164 ['.lb-prev', 'Previous image'], 165 ['.lb-next', 'Next image'] 166 ]; 167 for (var i = 0; i < map.length; i++) { 168 var els = document.querySelectorAll(map[i][0]); 169 for (var j = 0; j < els.length; j++) { 170 if (!accessibleName(els[j])) els[j].setAttribute('aria-label', map[i][1]); 171 } 172 } 173 } 174 function processOverlays() { 175 labelUserwayTriggers(); 176 patchAccessibe(); 177 patchLightbox(); 178 } 179 function init() { 180 processOverlays(); 181 var obs = new MutationObserver(processOverlays); 182 obs.observe(document.body, { childList: true, subtree: true }); 183 /* Overlays load async and accessiBe fills an encapsulated shadow root 184 the observer can't see, so poll for ~30s as well. */ 185 var ticks = 0; 186 var poll = setInterval(function () { 187 processOverlays(); 188 if (++ticks >= 15) { clearInterval(poll); obs.disconnect(); } 189 }, 2000); 190 } 191 if (document.readyState === 'loading') { 192 document.addEventListener('DOMContentLoaded', init); 193 } else { 194 init(); 195 } 196 })(); 197 </script>
197 198 <noscript> 199 Please ensure Javascript is enabled for purposes of 200 <a href="https://userway.org">website accessibility</a> 201 </noscript>
202<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
202 203</head> 204 205<body id="juniper"> 206 <style> 207 section#sectionHero #heroSlider h1 { 208 font-size: 3.5rem; 209} 210 211section#tw-faq h3 { 212 font-size: 28px; 213} 214 215#subs_button { 216 width: 100%; 217 border-radius: 4px; 218} 219 220#heroSlider > div.carousel-inner > div > div.slider-image-hero.\30 { 221 background-attachment: fixed!important; 222background-position: center!important; 223} 224 225#tw-subscribe { 226 margin-bottom: 0rem!important; 227} 228 229 @media (max-width: 767.99px) { 230 /* make menu font smaller */ 231div#menuNewsDefault ul li a, div#menuHeroMobile ul li a { 232 font-size: 20px; 233 border-radius: 4px; 234} 235 236/* hide icons in Hero menu */ 237div#menuHeroMobile ul li i { 238 display: none; 239} 240 241/* remove extra spacing between Hero menu and News */ 242div#menuHeroMobile { 243 margin-bottom: -5rem!important; 244} 245 246section#sectionHero #heroSlider h1 { 247 font-size: 3rem; 248} 249 } 250</style> 251 252<header id="defaultHeader" class="default-header" role="banner"> 253 <a href="#main-content" class="skip-to-main">Skip to main content</a> 254 <div id="topHeader" class="top-header"> 255 <div class="container"> 256 <div class="row mx-0"> 257 <div class="col-md-3 d-flex align-items-center justify-content-center justify-content-md-start"> 258 <a href="/" class="navbar-brand custom-logo-link" rel="home" aria-current="page" aria-label="Home"> 259 <img src="https://storage.googleapis.com/juniper-media-library/509/2026/04/[email protected]" width="150px" height="" class="img-responsive" alt="Site Logo" decoding="async"> 260 </a> 261 </div> 262 <div class="col-md-9 justify-content-end d-flex align-items-center"> 263 <!-- Weather Widget --> 264 <div class="weather-widget d-flex me-2" role="region" aria-label="Current weather information"> 265 <canvas class="icon-weather" data-icon="" role="img" aria-label="Weather icon"></canvas> 266 <span class="weather-temperature" aria-live="polite">NO DATA</span> 267 </div> 268 <!-- Social Icons --> 269 <div id="headerSocialMenuWrapper"> 270 <ul id="headerSocialMenu" class="nav flex-nowrap"> 271 272 </ul> 273</div> 274 <!-- Search and Translate --> 275 <div class="search-container "> 276 <form action="/search" method="get" role="search" aria-label="Site search" id="header-search-form"> 277 <input class="search expandright" id="searchright" type="search" name="q" placeholder="Search" aria-label="Search the website" title="Search the website"> 278 <button type="button" class="search-button searchbutton" aria-label="Toggle search" aria-expanded="false"> 279 <i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i> 280 </button> 281 </form> 282 </div> 283 <div class="gtranslate_wrapper" role="region" aria-label="Language translator"></div> 284 </div> 285 </div> 286 </div> 287 </div> 288 <div id="bottomHeader" class="bottom-header w-100"> 289 <div id="fixed-header-logo" class="d-none d-sm-none d-md-flex d-lg-flex d-xl-flex position-absolute align-items-center pb-4"> 290 <a class="navbar-brand" rel="home" href="/" aria-label="Home"> 291 <img src="https://storage.googleapis.com/juniper-media-library/509/2026/04/[email protected]" class="" alt="Site Logo" decoding="async"> 292 </a> 293 </div> 294 <nav id="menuPrimary" class="navbar navbar-dark navbar-expand-lg"> 295 <div class="container"> 296 <button style="z-index: 9999;" class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#menuPrimaryContent" aria-controls="menuPrimaryContent" aria-expanded="false" aria-label="Toggle navigation"> 297 <div class="tw-hamburger-animated-icon"><span></span><span></span><span></span></div> 298 </button> 299 <div class="collapse navbar-collapse" id="menuPrimaryContent"> 300 <ul class="navbar-nav mb-2 mb-lg-0 menu-primary"> 301 <li class="nav-item menu-level-one " role="listitem"> <a class="nav-link first-level-link " aria-current="page" rel="none" href="https://armstrongcreek.org"><span> <span class="visually-hidden">Navigate to </span>Home</span> </a></li><li class="nav-item menu-level-one dropdown" role="listitem"> <a class="nav-link first-level-link dropdown-toggle " rel="none" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span><span class="visually-hidden">Navigate to </span>Government</span></a> <ul class="dropdown-menu"> <li><a class="dropdown-item" rel="none" href="/agendas-minutes"><span>Agendas & Minutes</span></a></li><li><a class="dropdown-item" rel="none" href="/town-board"><span>Town Board</span></a></li><li><a class="dropdown-item" rel="none" href="/calendar"><span>Calendar of Events</span></a></li><li><a class="dropdown-item" rel="none" href="/ordinances-resolutions"><span>Ordinances & Resolutions</span></a></li><li><a class="dropdown-item" rel="none" href="/election-information"><span>Election Information</span></a></li><li><a class="dropdown-item" rel="none" href="/news-and-notices"><span>News & Notices</span></a></li> </ul></li><li class="nav-item menu-level-one " role="listitem"> <a class="nav-link first-level-link " aria-current="page" rel="none" href="/town-contacts"><span> <span class="visually-hidden">Navigate to </span>Town Contacts</span> </a></li><li class="nav-item menu-level-one dropdown" role="listitem"> <a class="nav-link first-level-link dropdown-toggle " rel="none" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span><span class="visually-hidden">Navigate to </span>Community</span></a> <ul class="dropdown-menu"> <li><a class="dropdown-item" rel="none" href="/businesses"><span>Business Directory</span></a></li><li><a class="dropdown-item" rel="none" href="/community-center"><span>Community Center</span></a></li><li><a class="dropdown-item" rel="none" href="/community-services"><span>Community Services</span></a></li><li><a class="dropdown-item" rel="none" href="/cemetery"><span>Cemetery</span></a></li><li><a class="dropdown-item" rel="none" href="/transfer-station"><span>Transfer Station</span></a></li><li><a class="dropdown-item" rel="none" href="/meal-site"><span>Meal Site</span></a></li><li><a class="dropdown-item" rel="none" href="/snow-removal"><span>Snow Removal</span></a></li><li><a class="dropdown-item" rel="none" href="/subscribe-to-updates"><span>Subscribe to Updates</span></a></li> </ul></li><li class="nav-item menu-level-one " role="listitem"> <a class="nav-link first-level-link " aria-current="page" rel="none" href="/contact-us"><span> <span class="visually-hidden">Navigate to </span>Contact Us</span> </a></li> 302 </ul> 303 </div> 304 </div> 305</nav> 306 <div class="line"></div> 307 </div> 308</header> 309 310 311 312 <style> 313 /* Filters Section Styling */ 314 .filters-section { 315 display: flex; 316 align-items: flex-start; 317 justify-content: space-between; 318 flex-wrap: wrap; 319 gap: 20px; 320 margin-bottom: 15px; 321 align-items: end; 322 } 323 324 .category-filters-wrapper { 325 flex: 1; 326 min-width: 300px; 327 } 328 329 .category-filters-title { 330 font-weight: 600; 331 font-size: 1.1rem; 332 margin-bottom: 10px; 333 color: #495057; 334 } 335 336 .category-filter { 337 display: inline-block; 338 padding: 6px 16px; 339 margin: 4px 8px 4px 0; 340 background-color: #ffffff; 341 border: 2px solid #dee2e6; 342 border-radius: 10px; 343 text-decoration: none; 344 color: #495057; 345 font-size: 0.9rem; 346 transition: all 0.3s ease; 347 cursor: pointer; 348 } 349 350 .category-filter:hover { 351 background-color: #e9ecef; 352 border-color: #adb5bd; 353 text-decoration: none; 354 color: #495057; 355 } 356 357 .category-filter.active { 358 background-color: #0056b3; 359 border-color: #0056b3; 360 color: #ffffff; 361 } 362 363 .category-filters-wrapper-mobile { 364 margin-bottom: 20px; 365 } 366 367 .category-filters-wrapper-mobile label, 368 .archive-filters-wrapper label { 369 font-weight: 600; 370 margin-bottom: 8px; 371 margin-right: 10px; 372 color: #495057; 373 } 374 375 .categories-select-list, 376 .archive-filters-wrapper select, 377 .archive-filters-wrapper input[type="date"] { 378 margin-right: 15px; 379 margin-bottom: 10px; 380 padding: 8px 12px; 381 border: 1px solid #ced4da; 382 border-radius: 4px; 383 font-size: 0.9rem; 384 } 385 386 .archive-filters-wrapper { 387 display: flex; 388 align-items: center; 389 gap: 10px; 390 flex-shrink: 0; 391 } 392 393 .date-range-filters { 394 display: none; 395 } 396 397 /* Card Styling for Even Height */ 398 .archive-item { 399 height: 100%; 400 display: flex; 401 flex-direction: column; 402 border: 1px solid #dee2e6; 403 border-radius: 0px; 404 overflow: hidden; 405 } 406 407 408 .archive-item-image { 409 width: 100%; 410 height: 200px; 411 object-fit: cover; 412 border-bottom: 1px solid #dee2e6; 413 } 414 415 .archive-item-body { 416 flex: 1; 417 display: flex; 418 flex-direction: column; 419 padding: 20px; 420 } 421 422 .archive-item-title { 423 font-size: 1.1rem; 424 font-weight: 600; 425 margin-bottom: 10px; 426 line-height: 1.3; 427 } 428 429 .archive-item-title a, 430 a .archive-item-title { 431 text-decoration: none; 432 color: #212529; 433 } 434 435 .archive-item-title a:hover, 436 a:hover .archive-item-title { 437 color: #0056b3; 438 text-decoration: none; 439 } 440 441 .archive-item-snippet { 442 flex: 1; 443 font-size: 0.9rem; 444 color: #6c757d; 445 line-height: 1.5; 446 margin-bottom: 15px; 447 } 448 449 .archive-item-button { 450 margin-top: auto; 451 padding: 8px 0; 452 font-size: 0.9rem; 453 font-weight: 500; 454 color: #0056b3; 455 } 456 457 .archive-item-button:hover, 458 .archive-item-button:focus { 459 color: #004085; 460 } 461 462 /* No Image Placeholder */ 463 .no-image-placeholder { 464 width: 100%; 465 height: 200px; 466 background-color: #e9ecef; 467 display: flex; 468 align-items: center; 469 justify-content: center; 470 color: #495057; 471 font-size: 0.9rem; 472 font-weight: 500; 473 border-bottom: 1px solid #dee2e6; 474 border-radius: 10px; 475 } 476 477 /* Pagination Styling */ 478 .view-more-button { 479 background-color: #0056b3; 480 color: white; 481 border: none; 482 padding: 12px 24px; 483 border-radius: 6px; 484 font-size: 1rem; 485 font-weight: 500; 486 transition: background-color 0.3s ease; 487 } 488 489 .view-more-button:hover { 490 background-color: #004085; 491 } 492 493 .view-more-button i { 494 margin-right: 8px; 495 } 496
497 /* Responsive adjustments */ 498 @media (max-width: 768px) { 499 .filters-section { 500 flex-direction: column; 501 gap: 0px; 502 } 503 504 .category-filters-wrapper { 505 display: none; 506 min-width: auto; 507 } 508 509 .category-filters-wrapper-mobile { 510 width: 100%; 511 display: block; 512 margin-bottom: 0px; 513 } 514 515 .category-filters-wrapper-mobile select, 516 .archive-filters-wrapper select { 517 width: 100%; 518 margin-right: 0; 519 } 520 521 .archive-filters-wrapper { 522 align-self: flex-start; 523 width: 100%; 524 flex-direction: column; 525 align-items: flex-start; 526 } 527 528 .archive-filters-wrapper label { 529 margin-bottom: 0%; 530 margin-right: 0; 531 } 532 } 533 534 @media (min-width: 769px) { 535 .category-filters-wrapper-mobile { 536 display: none; 537 } 538 } 539</style> 540 541<main id="main-content" class="juniper-news-archive news-archive option-1 mb-5"> 542 <div class="container"> 543 <div class="row"> 544 <!-- Page heading --> 545 <div class="col-12"> 546 <h1 class="page-heading">News & Notices</h1> 547 </div> 548 <!-- Filters --> 549 <div class="col-12 filters-section"> 550 <div class="category-filters-wrapper"> 551 <div class="category-filters-title">Categories</div> 552 <a class="category-filter active" data-category="all">View All</a> 553 <!-- Dynamic News Categories --> 554 </div> 555 <div class="category-filters-wrapper-mobile"> 556 <label for="categoriesSelectList">Category</label> 557 <select id="categoriesSelectList" class="categories-select-list"> 558 <option value="all">View All</option> 559 </select> 560 </div> 561 <div class="archive-filters-wrapper"> 562 <div class="date-range-filters"> 563 <label for="dateFrom">Date Range</label> 564 <input type="date" id="dateFrom" name="date-start" aria-label="Input start date in format month-day-year"> 565 <input type="date" id="dateTo" name="date-end" aria-label="Input end date in format month-day-year"> 566 </div> 567 <label for="archiveYears">Archive</label> 568 <select id="archiveYears" name="archive_years"> 569 <option value="">All</option><option value="2026">2026</option><option value="2025">2025</option><option value="2024">2024</option><option value="2023">2023</option> 570 </select> 571 </div> 572 </div> 573 <!-- Content --> 574 <div class="col-12 py-3 "> 575 <div id="news-container" class="row"> 576 577 </div> 578 <div id="loader" style="display:none; text-align:center; margin: 2rem 0;"> 579 <div class="spinner-border" role="status"></div> 580 </div> 581 </div> 582 <!-- Pagination --> 583 <div class="col-12 pagination"> 584 <button class="view-more-button"><i class="fa fa-refresh"></i><span class="button-text">View More</span></button> 585 </div> 586 <!-- JSON Pagination --> 587 <nav aria-label="Page navigation example"> 588 <ul id="pagination" class="pagination"></ul> 589 </nav> 590 <!-- Default Pagination --> 591 <div id="newsPerPagePagination" class="col-12 pagination"> 592 593 </div> 594 </div> 595</div> 596</main>
597<script> 598 let itemsPerPage = parseInt(jNewsPerPage); 599 let currentIndex = 0; 600 let newsData = []; 601 let filteredNews = []; 602 let selectedCategory = 'all'; 603 604 function getQueryParam(name) { 605 const urlParams = new URLSearchParams(window.location.search); 606 return urlParams.get(name); 607 } 608 609 function getQueryPage() { 610 const urlParams = new URLSearchParams(window.location.search); 611 const page = parseInt(urlParams.get('page')); 612 return isNaN(page) || page < 1 ? 1 : page; 613 } 614 615 function applyCategoryFilter(category, updateURL = true) { 616 selectedCategory = category; 617 currentIndex = 0; 618 $('#news-container').empty(); 619 620 // Sync desktop and mobile category selection 621 $('.category-filter').removeClass('active'); 622 $(`.category-filter[data-category="${category}"]`).addClass('active'); 623 $('.categories-select-list').val(category); 624 625 if (updateURL) { 626 const params = new URLSearchParams(window.location.search); 627 if (category === 'all') { 628 params.delete('cat'); 629 } else { 630 params.set('cat', category); 631 } 632 params.set('page', 1); 633 const newUrl = `${window.location.pathname}?${params.toString()}`; 634 history.pushState(null, '', newUrl); 635 } 636 637 filterAndRenderNews(); 638 } 639 640 function renderCategoryFilters(categories) { 641 const categoryFromUrl = getQueryParam('cat'); 642 643 const container = $('.category-filters-wrapper'); 644 container.find('.category-filter:not([data-category="all"])').remove(); 645 categories.forEach(category => { 646 const filter = $(`<a class="category-filter" data-category="${category}">${category}</a>`); 647 container.append(filter); 648 }); 649 container.find('.category-filter').removeClass('active'); 650 if (categoryFromUrl && categoryFromUrl !== '') { 651 container.find(`.category-filter[data-category="${categoryFromUrl}"]`).addClass('active'); 652 } else { 653 container.find('.category-filter[data-category="all"]').addClass('active'); 654 } 655 656 const selectListCategories = $('.categories-select-list'); 657 categories.forEach(category => { 658 const filter = $(`<option value="${category}">${category}</option>`); 659 selectListCategories.append(filter); 660 }); 661 selectListCategories.val(categoryFromUrl || 'all'); 662 } 663 664 function getUniqueCategories(data) { 665 const categorySet = new Set(); 666 data.forEach(item => { 667 let categories = []; 668 try { 669 categories = JSON.parse(item.categories); 670 } catch { 671 categories = ["News"]; 672 } 673 categories.forEach(cat => categorySet.add(cat)); 674 }); 675 return Array.from(categorySet); 676 } 677 678 function filterAndRenderNews(updateURL = false, customPage = null) { 679 let category = selectedCategory; 680 let fromDate = $('#dateFrom').val(); 681 let toDate = $('#dateTo').val(); 682 let archiveYear = $('#archiveYears').val(); 683 684 const params = new URLSearchParams(window.location.search); 685 686 if (updateURL) { 687 if (category !== 'all') params.set('cat', category); 688 else params.delete('cat'); 689 if (fromDate) params.set('from', fromDate); 690 else params.delete('from'); 691 if (toDate) params.set('to', toDate); 692 else params.delete('to'); 693 if (archiveYear) params.set('year', archiveYear); 694 else params.delete('year'); 695 if (customPage) params.set('page', customPage); 696 const newUrl = `${window.location.pathname}?${params.toString()}`; 697 history.pushState(null, '', newUrl); 698 } 699 700 const page = customPage || getQueryPage(); 701 currentIndex = (page - 1) * itemsPerPage; 702 703 filteredNews = newsData.filter(item => { 704 let categories = []; 705 try { 706 categories = JSON.parse(item.categories); 707 } catch { 708 categories = ["News"]; 709 } 710 const date = new Date(item.published_at); 711 const matchCategory = category === 'all' || categories.includes(category); 712 const matchFrom = !fromDate || new Date(fromDate) <= date; 713 const matchTo = !toDate || new Date(toDate) >= date; 714 const matchYear = !archiveYear || date.getFullYear().toString() === archiveYear; 715 return matchCategory && matchFrom && matchTo && matchYear; 716 }); 717 718 const append = false;
719 renderNewsItems(filteredNews, currentIndex, itemsPerPage, append); 720 721 if (jNewsPaginationType === 'pages') { 722 renderPagination(filteredNews.length, itemsPerPage, page); 723 } 724 } 725 726 function renderNewsItems(data, start, count, append = false) { 727 const container = $('#news-container'); 728 if (!append) container.empty(); 729 730 for (let i = start; i < start + count && i < data.length; i++) { 731 const item = data[i]; 732 let categories = []; 733 try { 734 categories = JSON.parse(item.categories); 735 } catch { 736 categories = ["News"]; 737 } 738 739 const categoryHtml = categories.map(cat => `<span class="category">${cat}</span>`).join(''); 740 const imageHtml = item.image && item.image.trim() !== '' ? 741 `<img alt="${item.title}" src="${item.image}" class="archive-item-image">` : 742 `<div class="no-image-placeholder">No Image</div>`; 743 744 const html = ` 745 <div class="col-md-4 mb-3"> 746 <div class="card archive-item"> 747 ${imageHtml} 748 <div class="card-body archive-item-body"> 749 <a href="${item.slug}" class=""> 750 <h3 class="card-title archive-item-title">${item.title}</h3> 751 </a> 752 <p class="archive-item-snippet">${item.snippet || ''}</p> 753 <a href="${item.slug}" class="btn btn-link mt-2 archive-item-button">Read more</a> 754 </div> 755 </div> 756 </div> 757 `; 758 container.append(html); 759 } 760 761 currentIndex += count; 762 763 if (jNewsPaginationType === 'infinite') { 764 $('.view-more-button').toggle(currentIndex < data.length); 765 } 766 } 767 768 function renderPagination(totalItems, perPage, currentPage) { 769 const totalPages = Math.ceil(totalItems / perPage); 770 const container = $('#pagination'); 771 container.empty(); 772 773 if (totalPages <= 1) { 774 container.hide(); 775 return; 776 } 777 778 container.show(); 779 780 const ul = $('<ul class="pagination"></ul>'); 781 782 // Previous button 783 const prevDisabled = currentPage === 1 ? 'disabled' : ''; 784 ul.append(` 785 <li class="page-item ${prevDisabled}"> 786 <a href="javascript:void(0)" class="page-link" data-page="${currentPage - 1}">«</a> 787 </li> 788 `); 789 790 // Calculate page range to show 791 const pageButtons = []; 792 if (totalPages <= 5) { 793 for (let i = 1; i <= totalPages; i++) { 794 pageButtons.push(i); 795 } 796 } else { 797 if (currentPage <= 3) { 798 pageButtons.push(1, 2, 3, 4, '...', totalPages); 799 } else if (currentPage >= totalPages - 2) { 800 pageButtons.push(1, '...', totalPages - 3, totalPages - 2, totalPages - 1, totalPages); 801 } else { 802 pageButtons.push(1, '...', currentPage - 1, currentPage, currentPage + 1, '...', totalPages); 803 } 804 } 805 806 for (let btn of pageButtons) { 807 if (btn === '...') { 808 ul.append(`<li class="page-item disabled"><span class="page-link">...</span></li>`); 809 } else { 810 const activeClass = btn === currentPage ? 'active' : ''; 811 ul.append(` 812 <li class="page-item ${activeClass}"> 813 <a href="javascript:void(0)" class="page-link" data-page="${btn}">${btn}</a> 814 </li> 815 `); 816 } 817 } 818 819 // Next button 820 const nextDisabled = currentPage === totalPages ? 'disabled' : ''; 821 ul.append(` 822 <li class="page-item ${nextDisabled}"> 823 <a href="javascript:void(0)" class="page-link" data-page="${currentPage + 1}">»</a> 824 </li> 825 `); 826 827 container.append(ul); 828 } 829 830 831 function fetchNewsItems() { 832 $('#loader').show(); 833 834 fetch(jClientUrl + "/json/search/search.json") 835 .then(response => response.json()) 836 .then(data => { 837 newsData = data 838 .filter(item => item.type === "NewsNotice") 839 .sort((a, b) => new Date(b.published_at) - new Date(a.published_at)); 840 const uniqueCategories = getUniqueCategories(newsData); 841 renderCategoryFilters(uniqueCategories); 842 843 selectedCategory = getQueryParam('cat') || 'all'; 844 $('#dateFrom').val(getQueryParam('from') || ''); 845 $('#dateTo').val(getQueryParam('to') || ''); 846 $('#archiveYears').val(getQueryParam('year') || ''); 847 848 filterAndRenderNews(false); 849 }) 850 .catch(error => { 851 console.error("Error fetching data:", error); 852 }) 853 .finally(() => { 854 $('#loader').hide(); 855 }); 856 } 857 858 $(document).ready(function() { 859 860 // If JSON is enabled for News Archive Page 861 if (jNewsJSON == '1') { 862 if (jNewsPaginationType === "infinite") { 863 $('#pagination').hide(); 864 $('.view-more-button').show(); 865 } else { 866 $('#pagination').show(); 867 $('.view-more-button').hide(); 868 } 869 870 871 872 fetchNewsItems(); 873 874 // Handle view more button click 875 $('.view-more-button').on('click', function() { 876 const button = $(this); 877 const icon = button.find('i'); 878 const text = button.find('.button-text'); 879 880 icon.addClass('fa-spin-custom'); 881 text.text('Loading...'); 882 883 setTimeout(() => { 884 renderNewsItems(filteredNews, currentIndex, itemsPerPage, true); // APPEND 885 icon.removeClass('fa-spin-custom'); 886 text.text('View More'); 887 }, 300); 888 }); 889 890 // Handle category filter click 891 $(document).on('click', '.category-filter', function() { 892 const category = $(this).data('category'); 893 applyCategoryFilter(category, true); 894 filterAndRenderNews(false, 1); 895 }); 896 897 // Handle category filter select list 898 $(document).on('change', '.categories-select-list', function() { 899 const category = $(this).val(); 900 applyCategoryFilter(category, true); 901 filterAndRenderNews(false, 1); 902 }); 903 904 // Handle date range and archive year changes 905 $('#dateFrom, #dateTo, #archiveYears').on('change', function() { 906 filterAndRenderNews(true, 1); 907 }); 908 909 // Handle pagination click 910 $(document).on('click', '.page-link', function() { 911 const page = $(this).data('page'); 912 filterAndRenderNews(true, page); 913 }); 914 915 } else { 916 $('.view-more-button').hide(); 917 $('.filters-section').hide(); 918 } 919 }); 920</script>
920 921 922 923 <footer id="footerDefault" class="footer w-100" role="contentinfo"> 924 <div class="footer-top-line"></div> 925 <div class="container py-5"> 926 <div class="row"> 927 <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12 p-3"> 928 <img src="https://storage.googleapis.com/juniper-media-library/509/2026/04/[email protected]" width="90%" height="" alt="Site Logo" /> 929 <div> 930 931 </div> 932 </div> 933 <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12 p-3"> 934 <h2 class="footer-default-heading">Town of Armstrong Creek</h2> 935 <div> 936 <p>Mailing<br />PO Box 67, Armstrong Creek, WI 54103</p> 937<p>Address<br />7860 Old 101, Armstrong Creek, WI 5410</p> 938 </div> 939 </div> 940 <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12 p-3"> 941 <h2 class="footer-default-heading">Contact Information</h2> 942 <div> 943 <p>Phone: (715) 889-0817</p> 944<p>Email <a href="/cdn-cgi/l/email-protection#187b747d6a7358796a756b6c6a77767f7b6a7d7d7336776a7f"><span class="__cf_email__" data-cfemail="690a050c1b0229081b041a1d1b06070e0a1b0c0c0247061b0e">[email protected]</span></a></p> 945 </div> 946 </div> 947 <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12 p-3"> 948 <h2 class="footer-default-heading"></h2> 949 <div> 950 <p><a href="https://www.facebook.com/armstrongcreekwi" title="Facebook page link" target="_blank" rel="noopener">Give Us a Follow on Facebook!</a></p> 951 </div> 952 </div> 953 </div> 954 <div class="d-flex justify-content-center mt-3 bottom-footer" role="contentinfo" aria-label="Copyright and legal information"> 955 © 2026 Designed & Hosted by <a href="https://www.townweb.com/" class="mx-1" target="_blank" rel="noopener noreferrer" aria-label="Town Web (opens in new tab)">Town Web</a> | <a href="/accessibility" class="mx-1" aria-label="View accessibility statement">Accessibility</a> | <a href="/privacy-policy" class="ms-1" aria-label="View privacy policy">Privacy Policy</a> 956 </div> 957 </div> 958</footer> 959<style> 960 961 @media (max-width: 767.99px) { 962 963 } 964</style>
vendor: 115 bytes, lines 964-967
964 965 966 967 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
967<script src="/theme.js?v=99c0169a"></script>
967<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
vendor: 1 bytes, line 967
967
968<script src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js" integrity="sha512-bPs7Ae6pVvhOSiIcyUClR7/q2OAsRiovw4vAkX+zJbw3ShAeeqezq50RIIcIURq7Oa20rW2n2q+fyXBNcU9lrw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 968
968
969<script src="https://cdn.jsdelivr.net/npm/[email protected]/jquery.marquee.min.js" type="text/javascript"></script>
vendor: 1 bytes, line 969
969
970<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/0.9.0/jquery.mask.min.js" integrity="sha512-oJCa6FS2+zO3EitUSj+xeiEN9UTr+AjqlBZO58OPadb2RfqwxHpjTU8ckIC8F4nKvom7iru2s8Jwdo+Z8zm0Vg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 970
970
971<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox.min.js" integrity="sha512-Ixzuzfxv1EqafeQlTCufWfaC6ful6WFqIz4G+dWvK0beHw0NVJwvCKSgafpy5gwNqKmgUfIBraVwkKI+Cz0SEQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 971
971
972<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"c3d48eea442040cfb72109ca74f4dfbc","r":1,"spa":2}' crossorigin="anonymous"></script>
972 973</body> 974 975</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.