{"id":29433,"date":"2026-10-29T11:32:25","date_gmt":"2026-10-29T15:32:25","guid":{"rendered":"https:\/\/keener13.org\/?p=29433"},"modified":"2026-10-29T11:32:25","modified_gmt":"2026-10-29T15:32:25","slug":"halloween-events-in-metro-detroit","status":"publish","type":"post","link":"https:\/\/keener13.org\/?p=29433","title":{"rendered":"Halloween Events in Metro Detroit"},"content":{"rendered":"<!-- Metro Detroit Halloween Weekend: paste into a WordPress \"Custom HTML\" block -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.css\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\">\r\n<style>\r\n#metro-halloween{--mh-bg:#1c1230;--mh-panel:#2a1c45;--mh-card:#fffaf2;--mh-ink:#2a1a12;--mh-muted:#5c4a3d;--mh-orange:#ff8a1f;--mh-orange-dk:#b34700;--mh-purple:#5b2a86;--mh-lilac:#e9dcff;--mh-free:#1e6b3a;--mh-low:#7a3e00;--mh-focus:#ffd23f;\r\n  background:var(--mh-bg);color:#fff;font-family:system-ui,-apple-system,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;font-size:16px;line-height:1.5;border-radius:16px;padding:24px 16px;max-width:1100px;margin:0 auto;\r\n  background-image:radial-gradient(circle at 92% 6%,rgba(255,138,31,.22) 0,transparent 36%),radial-gradient(circle at 4% 96%,rgba(155,93,229,.25) 0,transparent 40%)}\r\n#metro-halloween *,#metro-halloween *::before,#metro-halloween *::after{box-sizing:border-box}\r\n#metro-halloween .mh-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\r\n#metro-halloween .mh-head{text-align:center;margin:0 0 20px}\r\n#metro-halloween .mh-head h2{font-family:Georgia,\"Times New Roman\",serif;font-size:clamp(1.6rem,4.5vw,2.4rem);line-height:1.15;margin:0 0 6px;color:#fff;letter-spacing:.01em}\r\n#metro-halloween .mh-head h2 span{color:var(--mh-orange)}\r\n#metro-halloween .mh-head p{margin:0;color:var(--mh-lilac);font-size:1rem}\r\n#metro-halloween .mh-bunting{font-size:1.4rem;letter-spacing:.4em;margin-bottom:6px}\r\n#metro-halloween .mh-controls{background:var(--mh-panel);border:1px solid rgba(255,255,255,.12);border-radius:12px;padding:16px;display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));align-items:end}\r\n#metro-halloween .mh-field{display:flex;flex-direction:column;gap:6px;min-width:0}\r\n#metro-halloween .mh-field label,#metro-halloween .mh-legend{font-size:.85rem;font-weight:700;color:var(--mh-lilac);text-transform:uppercase;letter-spacing:.05em;padding:0;margin:0}\r\n#metro-halloween .mh-field input,#metro-halloween .mh-field select{width:100%;min-height:44px;padding:8px 12px;font:inherit;font-size:1rem;color:var(--mh-ink);background:#fff;border:2px solid #cbb8ea;border-radius:8px;margin:0;box-shadow:none;appearance:auto}\r\n#metro-halloween .mh-search{grid-column:1\/-1}\r\n#metro-halloween .mh-bar{display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;align-items:center;margin:18px 0 8px}\r\n#metro-halloween .mh-count{margin:0;color:var(--mh-lilac);font-size:.95rem}\r\n#metro-halloween .mh-toggle{display:inline-flex;border:2px solid var(--mh-orange);border-radius:999px;overflow:hidden}\r\n#metro-halloween .mh-toggle button,#metro-halloween .mh-reset{font:inherit;font-size:.95rem;font-weight:700;min-height:44px;padding:8px 18px;border:0;margin:0;cursor:pointer;background:transparent;color:#fff;border-radius:0;text-transform:none;letter-spacing:normal;line-height:1.2;box-shadow:none}\r\n#metro-halloween .mh-toggle button[aria-pressed=\"true\"]{background:var(--mh-orange);color:#1c1230}\r\n#metro-halloween .mh-reset{background:transparent;border:2px solid #cbb8ea;border-radius:8px;color:#fff;width:100%}\r\n#metro-halloween .mh-reset:hover,#metro-halloween .mh-toggle button:hover{text-decoration:underline}\r\n#metro-halloween button:focus-visible,#metro-halloween input:focus-visible,#metro-halloween select:focus-visible,#metro-halloween a:focus-visible,#metro-halloween .leaflet-marker-icon:focus-visible{outline:3px solid var(--mh-focus);outline-offset:2px}\r\n#metro-halloween .mh-day{margin:22px 0 0}\r\n#metro-halloween .mh-day h3{font-family:Georgia,\"Times New Roman\",serif;font-size:1.45rem;margin:0 0 12px;color:var(--mh-orange);display:flex;align-items:center;gap:10px;border-bottom:2px dashed rgba(255,138,31,.45);padding-bottom:6px}\r\n#metro-halloween .mh-day h3 small{font-family:system-ui,sans-serif;font-size:.85rem;color:var(--mh-lilac);font-weight:400}\r\n#metro-halloween .mh-grid{list-style:none;margin:0;padding:0;display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}\r\n#metro-halloween .mh-card{background:var(--mh-card);color:var(--mh-ink);border-radius:12px;padding:16px;margin:0;display:flex;flex-direction:column;gap:6px;border-top:6px solid var(--mh-orange);box-shadow:0 4px 14px rgba(0,0,0,.25)}\r\n#metro-halloween .mh-card h4{font-size:1.1rem;line-height:1.3;margin:0;color:var(--mh-ink);font-family:inherit}\r\n#metro-halloween .mh-meta{margin:0;font-size:.95rem;color:var(--mh-muted)}\r\n#metro-halloween .mh-meta strong{color:var(--mh-ink)}\r\n#metro-halloween .mh-desc{margin:4px 0 0;font-size:.95rem;color:var(--mh-ink)}\r\n#metro-halloween .mh-badges{display:flex;flex-wrap:wrap;gap:6px;margin:2px 0}\r\n#metro-halloween .mh-badge{display:inline-block;font-size:.8rem;font-weight:700;padding:3px 10px;border-radius:999px;line-height:1.4}\r\n#metro-halloween .mh-free{background:#d9f2e1;color:var(--mh-free);border:1px solid #9fd4b1}\r\n#metro-halloween .mh-low{background:#ffe7c7;color:var(--mh-low);border:1px solid #f2b56b}\r\n#metro-halloween .mh-age{background:var(--mh-lilac);color:#3d1d63;border:1px solid #c6b0ee}\r\n#metro-halloween .mh-county{background:#eee6dc;color:#4a3a2c;border:1px solid #d6c7b5}\r\n#metro-halloween .mh-link{margin-top:auto;padding-top:8px}\r\n#metro-halloween .mh-link a{display:inline-block;font-weight:700;color:#fff;background:var(--mh-purple);padding:8px 14px;border-radius:8px;text-decoration:none;min-height:40px}\r\n#metro-halloween .mh-link a:hover{background:#43196b;text-decoration:underline}\r\n#metro-halloween .mh-empty{background:var(--mh-panel);border-radius:12px;padding:24px;text-align:center;margin-top:16px}\r\n#metro-halloween .mh-map{height:520px;width:100%;border-radius:12px;overflow:hidden;border:2px solid var(--mh-orange);background:#e8e1d6;margin-top:6px}\r\n#metro-halloween .mh-map[hidden],#metro-halloween .mh-list[hidden]{display:none!important}\r\n#metro-halloween .mh-pin{background:none;border:0}\r\n#metro-halloween .mh-pin-in{background:var(--mh-orange);border:2px solid #1c1230;border-radius:50% 50% 50% 0;transform:rotate(-45deg);width:30px;height:30px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 6px rgba(0,0,0,.4)}\r\n#metro-halloween .mh-pin-in span{transform:rotate(45deg);font-size:15px;line-height:1}\r\n#metro-halloween .leaflet-popup-content{margin:12px 14px;color:var(--mh-ink);font-size:.92rem;line-height:1.45;min-width:220px}\r\n#metro-halloween .leaflet-popup-content h4{margin:0 0 4px;font-size:1rem;color:var(--mh-ink)}\r\n#metro-halloween .leaflet-popup-content p{margin:0 0 4px}\r\n#metro-halloween .leaflet-popup-content .mh-link a{padding:6px 12px;min-height:0;color:#fff}\r\n#metro-halloween .leaflet-container a.leaflet-popup-close-button{color:#333}\r\n#metro-halloween .mh-foot{margin:24px 0 0;padding:14px 16px;border-radius:10px;background:rgba(255,255,255,.07);color:var(--mh-lilac);font-size:.9rem;text-align:center}\r\n#metro-halloween .mh-foot p{margin:0}\r\n@media (max-width:600px){#metro-halloween{padding:18px 12px;border-radius:0}#metro-halloween .mh-map{height:420px}#metro-halloween .mh-bar{flex-direction:column;align-items:stretch}#metro-halloween .mh-toggle{justify-content:stretch}#metro-halloween .mh-toggle button{flex:1}}\r\n@media (prefers-reduced-motion:reduce){#metro-halloween *{transition:none!important;animation:none!important}}\r\n<\/style>\r\n\r\n<div id=\"metro-halloween\">\r\n  <header class=\"mh-head\">\r\n    <div class=\"mh-bunting\" aria-hidden=\"true\">? ? ? ? ?<\/div>\r\n    <h2>Free &amp; Low-Cost <span>Halloween Weekend<\/span> in Metro Detroit<\/h2>\r\n    <p>Fri, Oct 30 \u2013 Sun, Nov 1, 2026 \u00b7 Wayne, Oakland &amp; Macomb counties<\/p>\r\n  <\/header>\r\n\r\n  <form class=\"mh-controls\" role=\"search\" aria-label=\"Filter events\" onsubmit=\"return false;\">\r\n    <div class=\"mh-field mh-search\">\r\n      <label for=\"mh-q\">Search events<\/label>\r\n      <input id=\"mh-q\" type=\"search\" placeholder=\"Try \u201ctrunk\u201d, \u201clibrary\u201d, \u201cDetroit\u201d\u2026\" autocomplete=\"off\">\r\n    <\/div>\r\n    <div class=\"mh-field\">\r\n      <label for=\"mh-day\">Day<\/label>\r\n      <select id=\"mh-day\">\r\n        <option value=\"all\">All weekend<\/option>\r\n        <option value=\"2026-10-30\">Friday, Oct 30<\/option>\r\n        <option value=\"2026-10-31\">Saturday, Oct 31<\/option>\r\n        <option value=\"2026-11-01\">Sunday, Nov 1<\/option>\r\n      <\/select>\r\n    <\/div>\r\n    <div class=\"mh-field\">\r\n      <label for=\"mh-county\">County<\/label>\r\n      <select id=\"mh-county\">\r\n        <option value=\"all\">All counties<\/option>\r\n        <option value=\"Wayne\">Wayne<\/option>\r\n        <option value=\"Oakland\">Oakland<\/option>\r\n        <option value=\"Macomb\">Macomb<\/option>\r\n      <\/select>\r\n    <\/div>\r\n    <div class=\"mh-field\">\r\n      <label for=\"mh-cost\">Cost<\/label>\r\n      <select id=\"mh-cost\">\r\n        <option value=\"all\">Free &amp; low-cost<\/option>\r\n        <option value=\"Free\">Free only<\/option>\r\n        <option value=\"Low-cost\">Low-cost ($10 or less)<\/option>\r\n      <\/select>\r\n    <\/div>\r\n    <div class=\"mh-field\">\r\n      <button type=\"button\" class=\"mh-reset\" id=\"mh-reset\">Reset filters<\/button>\r\n    <\/div>\r\n  <\/form>\r\n\r\n  <div class=\"mh-bar\">\r\n    <p class=\"mh-count\" id=\"mh-count\" role=\"status\" aria-live=\"polite\"><\/p>\r\n    <div class=\"mh-toggle\" role=\"group\" aria-label=\"View\">\r\n      <button type=\"button\" id=\"mh-view-list\" aria-pressed=\"true\" aria-controls=\"mh-list\">? List<\/button>\r\n      <button type=\"button\" id=\"mh-view-map\" aria-pressed=\"false\" aria-controls=\"mh-map\">? Map<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"mh-list\" id=\"mh-list\"><\/div>\r\n  <div class=\"mh-map\" id=\"mh-map\" role=\"region\" aria-label=\"Map of events\" hidden><\/div>\r\n\r\n  <footer class=\"mh-foot\">\r\n    <p>Details can change. Please confirm with the organizer before you go. Last updated Oct 29, 2026.<\/p>\r\n  <\/footer>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.js\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"><\/script>\r\n<script>\r\n(function () {\r\n  var EVENTS = [{\"id\":1,\"name\":\"Red Oaks Park Grand Opening Celebration\",\"dates\":[\"2026-10-30\"],\"start\":\"3:00 PM\",\"end\":\"5:00 PM\",\"venue\":\"Red Oaks Park\",\"address\":\"600 E. 13 Mile Rd\",\"city\":\"Madison Heights\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"All ages\",\"description\":\"Oakland County Parks opens the rebuilt park with a DJ, climbing tower and giant yard games. Costumes encouraged; treats handed out at stations around the park.\",\"source\":\"https:\/\/www.oaklandcountymi.gov\/community\/oakland-county-parks\/events\/2026\/10\/30\/default-calendar\/red-oaks-park-grand-opening-community-celebration\",\"lat\":42.52031,\"lng\":-83.10017},{\"id\":2,\"name\":\"Trunk-R-Treat at North Rosedale Park\",\"dates\":[\"2026-10-30\"],\"start\":\"4:00 PM\",\"end\":\"7:00 PM\",\"venue\":\"North Rosedale Park Community House\",\"address\":\"18445 Scarsdale St\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Neighborhood trunk-or-treat with decorated cars and candy, co-hosted with the Wayne County Sheriff's Office.\",\"source\":\"https:\/\/www.cbsnews.com\/detroit\/news\/halloween-treats-haunted-events-metro-detroit\/\",\"lat\":42.40728,\"lng\":-83.22322},{\"id\":6,\"name\":\"Halloween Storytime & Craft Spectacular\",\"dates\":[\"2026-10-30\"],\"start\":\"2:00 PM\",\"end\":\"4:00 PM\",\"venue\":\"Detroit Public Library \u2013 Douglass Branch\",\"address\":\"3666 Grand River Ave\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free (Eventbrite RSVP)\",\"ages\":\"Kids 4\u201310\",\"description\":\"Halloween stories read aloud plus a take-home craft at the Douglass Branch.\",\"source\":\"https:\/\/detroitpubliclibrary.org\/news\/fall-halloween-events\",\"lat\":42.34323,\"lng\":-83.07463},{\"id\":10,\"name\":\"Ofrendas: Celebrating el D\u00eda de Muertos\",\"dates\":[\"2026-10-30\",\"2026-10-31\",\"2026-11-01\"],\"start\":\"Hours vary\",\"end\":\"\",\"venue\":\"Detroit Institute of Arts\",\"address\":\"5200 Woodward Ave\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free for Wayne, Oakland & Macomb residents\",\"ages\":\"All ages\",\"description\":\"The DIA's 14th annual exhibit of altars built by local artists and families to honor loved ones. Final weekend; closes Nov. 1. Hours: Fri 9 AM\u201310 PM, Sat\u2013Sun 10 AM\u20135 PM.\",\"source\":\"https:\/\/dia.org\/events\/exhibitions\/14th-annual-ofrendas-celebrating-el-dia-de-muertos\",\"lat\":42.35951,\"lng\":-83.06452},{\"id\":11,\"name\":\"Halloween in the D: Helen Moore Community Center\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"7:00 PM\",\"venue\":\"Helen Moore Community Center\",\"address\":\"11825 Dexter Ave\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.3806,\"lng\":-83.12516},{\"id\":12,\"name\":\"Halloween in the D: Patton Rec Center\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"7:00 PM\",\"venue\":\"Patton Recreation Center\",\"address\":\"2301 Woodmere St\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.30893,\"lng\":-83.13712},{\"id\":13,\"name\":\"Halloween in the D: Clemente Rec Center\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"6:30 PM\",\"venue\":\"Clemente Recreation Center\",\"address\":\"2631 Bagley St\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.32498,\"lng\":-83.0787},{\"id\":14,\"name\":\"Halloween in the D: Heilmann Rec Center\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"8:00 PM\",\"venue\":\"Heilmann Recreation Center\",\"address\":\"19601 Crusade St\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.44683,\"lng\":-82.96104},{\"id\":15,\"name\":\"Halloween in the D: Northwest Activities Center\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"7:00 PM\",\"venue\":\"Northwest Activities Center\",\"address\":\"18100 Meyers Rd\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.42299,\"lng\":-83.169},{\"id\":16,\"name\":\"Halloween in the D: Coleman A. Young Rec Center\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"7:00 PM\",\"venue\":\"Coleman A. Young Recreation Center\",\"address\":\"2751 Robert Bradby Dr\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.34588,\"lng\":-83.02476},{\"id\":17,\"name\":\"Halloween in the D: Chandler Park Fieldhouse\",\"dates\":[\"2026-10-31\"],\"start\":\"4:00 PM\",\"end\":\"6:30 PM\",\"venue\":\"Chandler Park Fieldhouse\",\"address\":\"12600 Chandler Park Dr\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Part of the City of Detroit's free Halloween in the D: candy, games and costumed fun for families at a neighborhood rec center.\",\"source\":\"https:\/\/detroitmi.gov\/departments\/department-neighborhoods\/halloween-d\",\"lat\":42.39454,\"lng\":-82.9744},{\"id\":18,\"name\":\"Halloween in the D: Precinct Trunk-or-Treats\",\"dates\":[\"2026-10-31\"],\"start\":\"2:00 PM\",\"end\":\"8:00 PM\",\"venue\":\"Detroit police precincts & fire stations (20+ sites)\",\"address\":\"4th Precinct, 4700 W. Fort St (one of many)\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Every Detroit police precinct and several fire engine houses host trunk-or-treats. Times vary by site, roughly 2\u20138 PM; see the city's list for the one nearest you. Pin shows the 4th Precinct.\",\"source\":\"https:\/\/www.fox2detroit.com\/news\/halloween-in-the-d-detroit-2026-events\",\"lat\":42.31151,\"lng\":-83.093},{\"id\":19,\"name\":\"Trick or Book!\",\"dates\":[\"2026-10-31\"],\"start\":\"10:00 AM\",\"end\":\"6:00 PM\",\"venue\":\"Detroit Public Library \u2013 Main Library (Children's Library)\",\"address\":\"5201 Woodward Ave\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free (Eventbrite RSVP)\",\"ages\":\"Kids 0\u201312\",\"description\":\"Kids pick a free book (while supplies last) and decorate a bookmark. Costumes welcome.\",\"source\":\"https:\/\/detroitpubliclibrary.org\/news\/fall-halloween-events\",\"lat\":42.35835,\"lng\":-83.06686},{\"id\":20,\"name\":\"Haunted Library\",\"dates\":[\"2026-10-31\"],\"start\":\"1:00 PM\",\"end\":\"4:00 PM\",\"venue\":\"Detroit Public Library \u2013 Jefferson Branch\",\"address\":\"12350 E. Outer Dr\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free (Eventbrite RSVP)\",\"ages\":\"Kids & families\",\"description\":\"Come in costume and finish spooky challenges around the branch to earn a prize.\",\"source\":\"https:\/\/detroitpubliclibrary.org\/news\/fall-halloween-events\",\"lat\":42.40407,\"lng\":-82.93725},{\"id\":21,\"name\":\"Trick or Treat at Parkman\",\"dates\":[\"2026-10-31\"],\"start\":\"3:00 PM\",\"end\":\"5:00 PM\",\"venue\":\"Detroit Public Library \u2013 Parkman Branch\",\"address\":\"1766 Oakman Blvd\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"All ages\",\"description\":\"Trick-or-treat through themed stations inside the library.\",\"source\":\"https:\/\/detroitpubliclibrary.org\/news\/fall-halloween-events\",\"lat\":42.39633,\"lng\":-83.12687},{\"id\":23,\"name\":\"D\u00eda de Muertos at La Jalisciense\",\"dates\":[\"2026-10-31\"],\"start\":\"3:00 PM\",\"end\":\"9:00 PM\",\"venue\":\"La Jalisciense Supermercado y Taquer\u00eda\",\"address\":\"3923 W. Vernor Hwy\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Low-cost\",\"price\":\"$10 passport (optional)\",\"ages\":\"All ages\",\"description\":\"Mexicantown market with 15 local vendors. A $10 D\u00eda de Muertos passport covers five hands-on activities and enters you in a gift-basket drawing.\",\"source\":\"https:\/\/www.eventbrite.com\/e\/dia-de-los-muertos-at-la-jalisciense-tickets-2003161351526\",\"lat\":42.32189,\"lng\":-83.09096},{\"id\":27,\"name\":\"Haunted StoryWalk\",\"dates\":[\"2026-10-31\"],\"start\":\"11:00 AM\",\"end\":\"1:00 PM\",\"venue\":\"Livonia Civic Center Library\",\"address\":\"32777 Five Mile Rd\",\"city\":\"Livonia\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids\",\"description\":\"Follow an outdoor Halloween picture book page by page behind the library, collecting treats along the way. Bring a treat bag; costumes encouraged.\",\"source\":\"https:\/\/livoniapubliclibrary.org\/events-programs\/calendar-of-events\/#\/events\/aq22l0GIDQ\/instances\/7qTF8xIQM0\/\",\"lat\":42.3966,\"lng\":-83.372},{\"id\":28,\"name\":\"Trick or Treat at the Market\",\"dates\":[\"2026-10-31\"],\"start\":\"10:00 AM\",\"end\":\"1:00 PM\",\"venue\":\"Oakland County Farmers Market\",\"address\":\"2350 Pontiac Lake Rd\",\"city\":\"Waterford\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Trick-or-treat from booth to booth with farmers and crafters, plus a pumpkin-painting station. No registration.\",\"source\":\"https:\/\/www.oaklandcountymi.gov\/community\/oakland-county-parks\/events\/2026\/10\/31\/default-calendar\/trick-or-treat-at-the-market\",\"lat\":42.65311,\"lng\":-83.33321},{\"id\":29,\"name\":\"Downtown Berkley Trick-or-Treat Stroll\",\"dates\":[\"2026-10-31\"],\"start\":\"12:00 PM\",\"end\":\"3:00 PM\",\"venue\":\"Downtown Berkley\",\"address\":\"12 Mile Rd & Coolidge Hwy\",\"city\":\"Berkley\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"The BOO!kley season finale: collect candy from participating shops along 12 Mile and Coolidge.\",\"source\":\"https:\/\/www.downtownberkley.com\/berkley-events\/calendar\/\",\"lat\":42.503,\"lng\":-83.1835},{\"id\":30,\"name\":\"Downtown Farmington Trick-or-Treat\",\"dates\":[\"2026-10-31\"],\"start\":\"12:00 PM\",\"end\":\"2:00 PM\",\"venue\":\"Downtown Farmington\",\"address\":\"Grand River Ave & Farmington Rd\",\"city\":\"Farmington\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids & families\",\"description\":\"Kids in costume trick-or-treat at participating downtown businesses.\",\"source\":\"https:\/\/www.cbsnews.com\/detroit\/news\/halloween-treats-haunted-events-metro-detroit\/\",\"lat\":42.4645,\"lng\":-83.3763},{\"id\":31,\"name\":\"Halloween at The Village of Rochester Hills\",\"dates\":[\"2026-10-31\"],\"start\":\"12:30 PM\",\"end\":\"2:00 PM\",\"venue\":\"The Village of Rochester Hills\",\"address\":\"Adams Rd & Walton Blvd\",\"city\":\"Rochester Hills\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free (registration required)\",\"ages\":\"Kids & families\",\"description\":\"Trick-or-treat through the outdoor shopping center's storefronts. Free, but you must register in advance.\",\"source\":\"https:\/\/www.cbsnews.com\/detroit\/news\/halloween-treats-haunted-events-metro-detroit\/\",\"lat\":42.68345,\"lng\":-83.19254},{\"id\":32,\"name\":\"Costume Parade at Baldwin Library\",\"dates\":[\"2026-10-31\"],\"start\":\"10:30 AM\",\"end\":\"11:00 AM\",\"venue\":\"Baldwin Public Library\",\"address\":\"300 W. Merrill St\",\"city\":\"Birmingham\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Babies \u2013 1st grade\",\"description\":\"Little ones show off their costumes in a short parade through the library.\",\"source\":\"https:\/\/www.baldwinlib.org\/calendar\/#\/events\/50TYFMD41l\/instances\/IYuPwblHvm\/\",\"lat\":42.54543,\"lng\":-83.21773},{\"id\":34,\"name\":\"Spooktacular Halloween for Teens\",\"dates\":[\"2026-10-31\"],\"start\":\"2:00 PM\",\"end\":\"3:00 PM\",\"venue\":\"Wixom Public Library\",\"address\":\"49015 Pontiac Trail\",\"city\":\"Wixom\",\"county\":\"Oakland\",\"cost\":\"Free\",\"price\":\"Free (registration)\",\"ages\":\"Teens (grades 7\u201312)\",\"description\":\"Halloween crafts, activities and treats just for teens.\",\"source\":\"https:\/\/www.wixomlibrary.org\/event\/spooktacular-halloween-14679\",\"lat\":42.52364,\"lng\":-83.5313},{\"id\":36,\"name\":\"Craft and Treat at the Library\",\"dates\":[\"2026-10-31\"],\"start\":\"9:00 AM\",\"end\":\"5:00 PM\",\"venue\":\"Maybelle Burnette Branch Library\",\"address\":\"23345 Van Dyke Ave\",\"city\":\"Warren\",\"county\":\"Macomb\",\"cost\":\"Free\",\"price\":\"Free\",\"ages\":\"Kids (all ages)\",\"description\":\"Drop in any time for a Halloween craft and a treat. Costumes welcome, no registration.\",\"source\":\"https:\/\/www.cityofwarren.org\/events\/craft-and-treat-at-the-library\/\",\"lat\":42.46574,\"lng\":-83.02721},{\"id\":39,\"name\":\"D\u00eda de los Muertos on the Detroit Riverfront\",\"dates\":[\"2026-11-01\"],\"start\":\"11:00 AM\",\"end\":\"3:00 PM\",\"venue\":\"Robert C. Valade Park\",\"address\":\"2670 Atwater St\",\"city\":\"Detroit\",\"county\":\"Wayne\",\"cost\":\"Free\",\"price\":\"Free (Eventbrite RSVP)\",\"ages\":\"All ages\",\"description\":\"Children's storytelling, crafts, a community ofrenda, Ballet Folkl\u00f3rico Moyocoyani Izel, mariachi and food trucks on the riverfront.\",\"source\":\"https:\/\/www.detroitriverfront.org\/events\/calendar\/2026\/11\/01\/da-de-los-muertos\",\"lat\":42.33387,\"lng\":-83.02443}];\r\n\r\n  var root = document.getElementById('metro-halloween');\r\n  if (!root) return;\r\n  var $ = function (id) { return document.getElementById(id); };\r\n  var q = $('mh-q'), daySel = $('mh-day'), countySel = $('mh-county'), costSel = $('mh-cost');\r\n  var listEl = $('mh-list'), mapEl = $('mh-map'), countEl = $('mh-count');\r\n  var btnList = $('mh-view-list'), btnMap = $('mh-view-map');\r\n\r\n  var DAYS = [\r\n    { key: '2026-10-30', label: 'Friday, Oct 30', icon: '?' },\r\n    { key: '2026-10-31', label: 'Saturday, Oct 31', icon: '?' },\r\n    { key: '2026-11-01', label: 'Sunday, Nov 1', icon: '?' }\r\n  ];\r\n  var DAY_SHORT = { '2026-10-30': 'Fri', '2026-10-31': 'Sat', '2026-11-01': 'Sun' };\r\n\r\n  function esc(s) {\r\n    return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function (c) {\r\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\r\n    });\r\n  }\r\n  function minutes(t) {\r\n    var m = \/(\\d+):(\\d+)\\s*(AM|PM)\/i.exec(t || '');\r\n    if (!m) return -1;\r\n    var h = +m[1] % 12 + (m[3].toUpperCase() === 'PM' ? 12 : 0);\r\n    return h * 60 + +m[2];\r\n  }\r\n  function timeText(e) { return e.end ? e.start + ' \u2013 ' + e.end : e.start; }\r\n  function daysText(e) { return e.dates.map(function (d) { return DAY_SHORT[d]; }).join(', '); }\r\n\r\n  function badges(e) {\r\n    var costCls = e.cost === 'Free' ? 'mh-free' : 'mh-low';\r\n    var costLabel = e.cost === 'Free' ? (e.price || 'Free') : 'Low-cost: ' + e.price;\r\n    return '<div class=\"mh-badges\">' +\r\n      '<span class=\"mh-badge ' + costCls + '\">' + esc(costLabel) + '<\/span>' +\r\n      '<span class=\"mh-badge mh-age\">' + esc(e.ages) + '<\/span>' +\r\n      '<span class=\"mh-badge mh-county\">' + esc(e.county) + ' Co.<\/span><\/div>';\r\n  }\r\n  function infoHTML(e, heading, multiDay) {\r\n    return '<' + heading + '>' + esc(e.name) + '<\/' + heading + '>' +\r\n      '<p class=\"mh-meta\"><strong>' + esc(timeText(e)) + '<\/strong>' + (multiDay ? ' \u00b7 ' + esc(daysText(e)) : '') + '<\/p>' +\r\n      '<p class=\"mh-meta\">' + esc(e.venue) + '<br>' + esc(e.address) + ', ' + esc(e.city) + '<\/p>' +\r\n      badges(e) +\r\n      '<p class=\"mh-desc\">' + esc(e.description) + '<\/p>' +\r\n      '<p class=\"mh-link\"><a href=\"' + esc(e.source) + '\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Details for ' + esc(e.name) + ' (opens in a new tab)\">Details ?<\/a><\/p>';\r\n  }\r\n\r\n  function filtered() {\r\n    var term = q.value.trim().toLowerCase(), day = daySel.value, county = countySel.value, cost = costSel.value;\r\n    return EVENTS.filter(function (e) {\r\n      if (day !== 'all' && e.dates.indexOf(day) === -1) return false;\r\n      if (county !== 'all' && e.county !== county) return false;\r\n      if (cost !== 'all' && e.cost !== cost) return false;\r\n      if (term) {\r\n        var hay = [e.name, e.venue, e.address, e.city, e.county, e.description, e.ages, e.price].join(' ').toLowerCase();\r\n        var words = term.split(\/\\s+\/);\r\n        for (var i = 0; i < words.length; i++) if (hay.indexOf(words[i]) === -1) return false;\r\n      }\r\n      return true;\r\n    });\r\n  }\r\n\r\n  function renderList(items) {\r\n    var day = daySel.value, html = '';\r\n    DAYS.forEach(function (d) {\r\n      if (day !== 'all' && day !== d.key) return;\r\n      var evs = items.filter(function (e) { return e.dates.indexOf(d.key) !== -1; })\r\n        .sort(function (a, b) { return minutes(a.start) - minutes(b.start) || a.name.localeCompare(b.name); });\r\n      if (!evs.length) return;\r\n      html += '<section class=\"mh-day\" aria-labelledby=\"mh-h-' + d.key + '\">' +\r\n        '<h3 id=\"mh-h-' + d.key + '\"><span aria-hidden=\"true\">' + d.icon + '<\/span> ' + d.label +\r\n        ' <small>(' + evs.length + ' event' + (evs.length === 1 ? '' : 's') + ')<\/small><\/h3><ul class=\"mh-grid\">';\r\n      evs.forEach(function (e) {\r\n        html += '<li class=\"mh-card\">' + infoHTML(e, 'h4', e.dates.length > 1) + '<\/li>';\r\n      });\r\n      html += '<\/ul><\/section>';\r\n    });\r\n    listEl.innerHTML = html || '<div class=\"mh-empty\"><p>No events match those filters. Try clearing the search or choosing \u201cAll\u201d.<\/p><\/div>';\r\n  }\r\n\r\n  var map = null, layer = null;\r\n  function renderMap(items) {\r\n    if (mapEl.hidden) return;\r\n    if (typeof L === 'undefined') {\r\n      mapEl.innerHTML = '<div class=\"mh-empty\" style=\"color:#2a1a12;background:#fffaf2;margin:0;height:100%\">The map could not load. Please use the List view.<\/div>';\r\n      return;\r\n    }\r\n    if (!map) {\r\n      map = L.map(mapEl, { scrollWheelZoom: false }).setView([42.45, -83.2], 10);\r\n      L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\r\n        maxZoom: 18,\r\n        attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> contributors'\r\n      }).addTo(map);\r\n      layer = L.layerGroup().addTo(map);\r\n    }\r\n    map.invalidateSize();\r\n    layer.clearLayers();\r\n    var icon = L.divIcon({ className: 'mh-pin', html: '<div class=\"mh-pin-in\"><span aria-hidden=\"true\">?<\/span><\/div>', iconSize: [30, 30], iconAnchor: [15, 30], popupAnchor: [0, -28] });\r\n    var pts = [];\r\n    items.forEach(function (e) {\r\n      if (e.lat == null || e.lng == null) return;\r\n      var m = L.marker([e.lat, e.lng], { icon: icon, title: e.name, alt: e.name, keyboard: true });\r\n      m.bindPopup('<div>' + infoHTML(e, 'h4', true) + '<\/div>', { maxWidth: 300 });\r\n      m.addTo(layer);\r\n      pts.push([e.lat, e.lng]);\r\n    });\r\n    if (pts.length === 1) map.setView(pts[0], 14);\r\n    else if (pts.length) map.fitBounds(pts, { padding: [30, 30], maxZoom: 14 });\r\n  }\r\n\r\n  function render() {\r\n    var items = filtered();\r\n    var n = items.length;\r\n    countEl.textContent = n + ' event' + (n === 1 ? '' : 's') + ' found';\r\n    renderList(items);\r\n    renderMap(items);\r\n  }\r\n\r\n  function setView(view) {\r\n    var isMap = view === 'map';\r\n    btnList.setAttribute('aria-pressed', String(!isMap));\r\n    btnMap.setAttribute('aria-pressed', String(isMap));\r\n    listEl.hidden = isMap;\r\n    mapEl.hidden = !isMap;\r\n    render();\r\n  }\r\n\r\n  q.addEventListener('input', render);\r\n  [daySel, countySel, costSel].forEach(function (s) { s.addEventListener('change', render); });\r\n  $('mh-reset').addEventListener('click', function () {\r\n    q.value = ''; daySel.value = 'all'; countySel.value = 'all'; costSel.value = 'all';\r\n    render(); q.focus();\r\n  });\r\n  btnList.addEventListener('click', function () { setView('list'); });\r\n  btnMap.addEventListener('click', function () { setView('map'); });\r\n\r\n  render();\r\n})();\r\n<\/script>\r\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[727],"tags":[],"class_list":["post-29433","post","type-post","status-publish","format-standard","hentry","category-keener-today","wpcat-727-id"],"_links":{"self":[{"href":"https:\/\/keener13.org\/index.php?rest_route=\/wp\/v2\/posts\/29433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keener13.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keener13.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keener13.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/keener13.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=29433"}],"version-history":[{"count":1,"href":"https:\/\/keener13.org\/index.php?rest_route=\/wp\/v2\/posts\/29433\/revisions"}],"predecessor-version":[{"id":29434,"href":"https:\/\/keener13.org\/index.php?rest_route=\/wp\/v2\/posts\/29433\/revisions\/29434"}],"wp:attachment":[{"href":"https:\/\/keener13.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keener13.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keener13.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}