{
  "version": 3,
  "sources": ["/cdn/shop/t/24/assets/ftb-events.js?x=7130"],
  "sourcesContent": ["\n(function(){\nvar root = document.currentScript.closest('.ftb-events') || document.querySelector('.ftb-events');\nif(!root || root.__ftbEvents){ return; }\nroot.__ftbEvents = true;\nvar featEl = root.querySelector('[data-ev-featured]');\nvar listEl = root.querySelector('[data-ev-list]');\nvar emptyEl = root.querySelector('[data-ev-empty]');\nvar pills = root.querySelectorAll('.ftb-ev__tgl');\nvar featuredImage = root.getAttribute('data-featured-image') || '';\nvar showPlaceholders = root.getAttribute('data-show-placeholders') === '1';\n/* EVENTS WORDING, his call 2026-11-03 (option A). Every word this script prints\n   comes from Theme settings > From The Bronx > Events wording, handed over as one\n   JSON object in data-ev-words (snippets/ftb-ev-words.liquid). The homepage PULL UP\n   script reads the same object, so the two cannot drift. Fallbacks are the old\n   wording. Values are escaped ONCE here because they only ever go into HTML. */\nvar EVW=(function(){ var o={}; try{ o=JSON.parse(root.getAttribute('data-ev-words')||'{}')||{}; }catch(_){ o={}; }\n  var d={upnext:'UP NEXT',now_heading:'HAPPENING NOW',rsvp:'RSVP',addcal:'Add to Calendar',confirmed:'\\u2713 Confirmed',\n    tonight:'TONIGHT',today:'TODAY',allday:'ALL DAY',allday_today:'ALL DAY TODAY',thru:'THRU',untitled:'Untitled event'};\n  var w={}; Object.keys(d).forEach(function(k){ var v=o[k]; w[k]=(typeof v==='string'&&v!=='')?v:d[k]; }); return w; })();\nfunction evwH(k){ var t=document.createElement('div'); t.textContent=EVW[k]; return t.innerHTML; }\nvar MON = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];\nvar MONF = ['JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER'];\nvar DOW = ['SUN','MON','TUE','WED','THU','FRI','SAT'];\nfunction esc(s){ var d=document.createElement('div'); d.textContent=(s==null?'':String(s)); return d.innerHTML; }\nfunction firstUrl(s){ if(!s) return ''; var m=String(s).match(/https?:\\/\\/[^\\s\"'<>]+/); return m?m[0]:''; }\nfunction allUrls(s){ if(!s) return []; var m=String(s).match(/https?:\\/\\/[^\\s\"'<>]+/g); return m||[]; }\nfunction isImgUrl(u){ return /\\.(jpe?g|png|webp|gif|avif)(\\?[^\\s\"'<>]*)?$/i.test(u||''); }\nfunction fmtTime(d){\nvar h=d.getHours(), m=d.getMinutes(), ap=h<12?'AM':'PM', hh=h%12; if(hh===0)hh=12;\nreturn hh+(m?(':'+(m<10?'0':'')+m):'')+' '+ap;\n}\nfunction timeRange(s,e){\nif(!s) return '';\nvar t=fmtTime(s);\nif(e){ var t2=fmtTime(e); var ap=t.split(' ')[1], ap2=t2.split(' ')[1];\nif(ap===ap2){ return t.replace(' '+ap,'')+'\u2013'+t2; } // same AM/PM: \"12\u20136 PM\"\nreturn t+'\u2013'+t2;\n}\nreturn t;\n}\n/* ALL-DAY AND MULTI-DAY EVENTS, his call 2026-10-28: \"we should also try to limit events\n   that go on for a month at a time. They shouldn't be listed everyday for a month.\"\n   [!] A DATE-ONLY STRING IS NOT A LOCAL DATE. Google sends an all-day event as\n   start.date \"2026-11-01\", and new Date(\"2026-11-01\") is MIDNIGHT UTC, which is 8 PM on\n   Oct 31 in New York. Every all-day event was rendering one day early, at \"8 PM\". Nothing\n   on the calendar used all-day events before this change, so nobody had seen it. pd()\n   reads a bare YYYY-MM-DD as local midnight; anything with a time goes through as before.\n   Google's all-day end date is EXCLUSIVE (a Nov 1 to Nov 30 run ends \"2026-12-01\"), so\n   lastDay() steps back one millisecond before anything prints it.\n   multiDay() needs BOTH a different calendar day AND more than 20 hours, so an overnight\n   night like karaoke (8 PM to 1 AM) stays a one-night event and does not read \"THRU\". */\nfunction pd(s){ var m=/^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(String(s||'')); return m ? new Date(+m[1],+m[2]-1,+m[3]) : new Date(s); }\nfunction endOf(e){ return e.endD || new Date(e.startD.getTime()+2*3600*1000); }\nfunction lastDay(e){ var x=endOf(e); return e.allDay ? new Date(x.getTime()-1) : x; }\nfunction dayKey(d){ return d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); }\nfunction multiDay(e){ return dayKey(lastDay(e))!==dayKey(e.startD) && (endOf(e)-e.startD)>20*3600*1000; }\nfunction whenLine(e){\nif(multiDay(e)){ var l=lastDay(e); return evwH('thru')+' '+MON[l.getMonth()]+' '+l.getDate(); }\nif(e.allDay){ return evwH('allday'); }\nreturn timeRange(e.startD,e.endD);\n}\nfunction addToCal(ev){\nfunction z(n){return (n<10?'0':'')+n;}\nfunction g(d){ return d.getUTCFullYear()+z(d.getUTCMonth()+1)+z(d.getUTCDate())+'T'+z(d.getUTCHours())+z(d.getUTCMinutes())+'00Z'; }\nfunction gd(d){ return d.getFullYear()+z(d.getMonth()+1)+z(d.getDate()); }\nvar s=ev.startD, e=endOf(ev);\nvar u='https://calendar.google.com/calendar/render?action=TEMPLATE'\n+'&text='+encodeURIComponent(ev.title)\n+'&dates='+(ev.allDay ? gd(s)+'/'+gd(e) : g(s)+'/'+g(e))\n+'&details='+encodeURIComponent(ev.desc||'')\n+'&location='+encodeURIComponent(ev.venue||'');\nreturn u;\n}\nfunction normalize(raw){\nvar out=[];\n(raw||[]).forEach(function(r){\nif(!r || !r.start) return;\nvar sd=pd(r.start); if(isNaN(sd)) return;\nvar ed=r.end?pd(r.end):null; if(ed&&isNaN(ed))ed=null;\nout.push({ startD:sd, endD:ed, allDay:/^\\d{4}-\\d{2}-\\d{2}$/.test(String(r.start)), title:r.title||EVW.untitled, desc:r.desc||'',\nvenue:r.venue||'', url:r.url||'', image:r.image||'', confirmed:!!r.confirmed, id:r.id||'' });\n});\nreturn out;\n}\nfunction parseGcal(items){\nreturn (items||[]).map(function(it){\nvar s=it.start&&(it.start.dateTime||it.start.date);\nvar e=it.end&&(it.end.dateTime||it.end.date);\nvar desc=it.description||'';\nvar conf=/#confirmed/i.test(desc)||/#confirmed/i.test(it.summary||'');\nvar img='', rsvp='';\nallUrls(desc).forEach(function(u){ if(!img && isImgUrl(u)){ img=u; } else if(!rsvp && !isImgUrl(u)){ rsvp=u; } });\nif(!img && it.attachments){ it.attachments.forEach(function(a){ if(!img && a && a.fileUrl && /^image\\//.test(a.mimeType||'')){ img=a.fileUrl; } }); }\nvar cleanDesc=desc.replace(/#confirmed/ig,'').replace(/\\bimage\\s*:/ig,'').replace(/https?:\\/\\/[^\\s\"'<>]+/g,'').replace(/\\s{2,}/g,' ').trim();\nreturn { start:s, end:e, title:(it.summary||'').replace(/#confirmed/ig,'').trim(),\ndesc:cleanDesc, image:img,\nvenue:it.location||'', url:rsvp, confirmed:conf, id:it.id||'' };\n});\n}\n/* maxResults 250, his call 2026-08-31. It was 50, which happened to be the exact number of\n   events the calendar held in the fetch window that day. timeMin is now minus 180 days, and\n   29 of the 50 slots were being spent on events already past, 26 of them old karaoke nights.\n   MEASURED before changing it: the 50th event was the karaoke night of 2026-10-09, so the\n   page was already rendering nothing that started later, and one more event would have\n   dropped Tour de Bronx. 250 is Google's own default page size.\n   [!] THERE IS STILL NO PAGE-TOKEN LOOP. If the calendar ever passes 250 events inside the\n   180 day window this truncates again in exactly the same way, silently, with no error in\n   the console and no gap visible on the page. Raise the number or add the loop. */\n/* timeMax +183 days, his call 2026-08-31, right after the maxResults raise above.\n   Lifting the 50 cap took the page from about 3 pages to 28. MEASURED off the calendar at that\n   moment: 166 upcoming events, 122 of them the weekly Judgement Free Karaoke, running out to\n   2028-12-29. 73% of the whole feed was one recurring event, and from roughly page 4 onward the\n   page was nothing else for two years. The 50 cap had been hiding that, not preventing it.\n   Six months forward brings the feed to about 70 upcoming and the pager to about 9 pages, and\n   nothing is lost: an event beyond the window simply appears once it comes inside it.\n   [!] timeMax BOUNDS THE FUTURE ONLY. The PAST toggle still runs off the timeMin on the line\n   above, so changing this number does not shorten the history the toggle can show. Raise the\n   183 if the calendar ever needs to advertise further ahead than six months. */\nfunction fetchGcal(id,key){\nvar url='https://www.googleapis.com/calendar/v3/calendars/'+encodeURIComponent(id)\n+'/events?key='+encodeURIComponent(key)\n+'&singleEvents=true&orderBy=startTime&maxResults=250'\n+'&timeMin='+encodeURIComponent(new Date(Date.now()-1000*60*60*24*180).toISOString())\n+'&timeMax='+encodeURIComponent(new Date(Date.now()+1000*60*60*24*183).toISOString());\nreturn fetch(url).then(function(r){ return r.ok?r.json():{items:[]}; })\n.then(function(j){ return parseGcal(j.items); })\n.catch(function(){ return []; });\n}\n/* PAGINATION - his call 2026-08-31: \"should match the pagination on the collections\n   pages. So, showing the number instead of saying Page 1 of 3.\"\n   This emits Broadcast's OWN markup from snippets/pagination.liquid, verbatim:\n   nav.pagination-custom, the __prev / __inner / __next structure, the is-hidden spans\n   for an unavailable arrow, and the two chevron SVGs. That is deliberate - it means this\n   pager inherits assets/pagination-custom.css and the 2026-08-30 mobile work in\n   ftb-mobile.css (38px boxes, the hit pads, no sideways scroll) with no styling of its own.\n   [!] pagination-custom.css is emitted by snippets/pagination.liquid, which only runs on\n   paginated templates. The Events page is a page template, so it was NOT loading it.\n   sections/ftb-events.liquid now loads it explicitly. If that tag is ever removed this\n   pager loses all of its styling.\n   The numbers are BUTTONS, not links, because paging here happens in the page and there is\n   no URL to point a link at. Broadcast colours and hovers `.pagination-custom a`, so the\n   handful of declarations that make a button render identically live in ftb-events.css. */\nfunction pageParts(cur, total){\nvar parts=[], i;\nif(total<=6){ for(i=1;i<=total;i++){ parts.push(i); } return parts; }\nparts.push(1);\nif(cur>3){ parts.push('\u2026'); }\nfor(i=Math.max(2,cur-1); i<=Math.min(total-1,cur+1); i++){ parts.push(i); }\nif(cur<total-2){ parts.push('\u2026'); }\nparts.push(total);\nreturn parts;\n}\nfunction pager(cur, total){\nvar AL='<svg aria-hidden=\"true\" focusable=\"false\" role=\"presentation\" class=\"icon icon-nav-arrow-left\" viewBox=\"0 0 24 24\"><path d=\"m15 6-6 6 6 6\" stroke=\"#000\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\nvar AR='<svg aria-hidden=\"true\" focusable=\"false\" role=\"presentation\" class=\"icon icon-nav-arrow-right\" viewBox=\"0 0 24 24\"><path d=\"m9 6 6 6-6 6\" stroke=\"#000\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\nvar s='<nav class=\"pagination-custom\" aria-label=\"Event pages\">';\ns+= cur>1\n? '<button type=\"button\" class=\"pagination-custom__prev\" data-ev-page=\"'+(cur-1)+'\" title=\"Previous\"><span>Previous</span>'+AL+'</button>'\n: '<span class=\"pagination-custom__prev is-hidden\"><span>Previous</span>'+AL+'</span>';\ns+='<div class=\"pagination-custom__inner\">';\npageParts(cur,total).forEach(function(p){\nif(p==='\u2026'){ s+='<span class=\"pagination-custom__sep\">\u2026</span>'; }\nelse if(p===cur){ s+='<span class=\"pagination-custom__page pagination-custom__page--active\" aria-current=\"page\">'+p+'</span>'; }\nelse { s+='<button type=\"button\" class=\"pagination-custom__page\" data-ev-page=\"'+p+'\" title=\"'+p+'\">'+p+'</button>'; }\n});\ns+='</div>';\ns+= cur<total\n? '<button type=\"button\" class=\"pagination-custom__next\" data-ev-page=\"'+(cur+1)+'\" title=\"Next\"><span>Next</span>'+AR+'</button>'\n: '<span class=\"pagination-custom__next is-hidden\"><span>Next</span>'+AR+'</span>';\nreturn s+'</nav>';\n}\n/* HOUSE STYLE: \"The Bronx\", always. His call 2026-08-31: \"In the Calendar, 'Bronx'\n   should always be 'The Bronx' When a venue doesn't have a name.\"\n   When a calendar entry carries a street address instead of a venue name, the part after\n   the first comma arrives as a bare \"Bronx\". MEASURED across the upcoming listing: two\n   events, 1125 Grand Concourse #106 and 161st Street and Grand Concourse.\n   This normalises the borough wherever it lands, the name slot or the address slot, so it\n   also covers a location that is nothing but \"Bronx\" and any future entry typed the same\n   way. It fires only when the WHOLE part is the bare word, so \"The Bronx Beer Hall\",\n   \"Bronx Council on the Arts\" and an already-correct \"The Bronx\" are left alone. */\nfunction boro(s){ return /^bronx$/i.test((s||'').trim()) ? 'The Bronx' : s; }\n/* THE ADDRESS IS A FULL POSTAL ADDRESS AND IT LINKS TO A MAP.\n   His call 2026-08-31: \"Full postal and link it to a map. Also, don't use The Bronx as a\n   default. The borough should be correct to the address. Sometimes Bronx events are held\n   outside of the borough.\"\n   MEASURED over all 13 distinct locations in the feed before writing this, not over the\n   page: 12 carry three or more comma-separated fields, 11 already carry a ZIP, 12 already\n   carry NY. The old code split on commas and rendered FIELD 2 ONLY, so the borough, the\n   state and the ZIP were being DISCARDED on 12 of 13 events. This is not new data. It is\n   data the page was throwing away.\n   ONE RULE COVERS BOTH SHAPES: field 1 goes on the bold line, everything after it goes on\n   the grey line. Where an entry has no venue name, field 1 IS the street, which is the case\n   he spotted: \"1125 Grand Concourse #106, Bronx, NY 10452\". The two-line shape survives\n   either way.\n   [!] NO BOROUGH IS EVER ASSUMED. It is read from the data or it is absent. One event in\n   the feed is at 20 Randall's Island, which is Manhattan, and he confirmed Bronx events are\n   sometimes held outside the borough. boro() only rewrites a field that IS the bare word\n   \"Bronx\" into house style; it never adds one. The section's \"Default venue\" setting was\n   deleted in the same change for the same reason.\n   The trailing bare state is dropped ONLY when an earlier field already carries STATE+ZIP,\n   so \"..., Bronx, NY 10452, NY\" loses the tail while \"..., Bronx, NY\" keeps its only state.\n   The map link is built from the ORIGINAL untouched location string, venue name included,\n   because Maps resolves a named venue better than a bare street.\n   [!] THE GUARD IS \"NOT ONLINE\", NOT \"HAS A STREET NUMBER\". The first version required a\n   field starting with a digit and that silently dropped the link on Walton Park, whose\n   address is \"E. 181st St. between Walton and Jerome Aves.\" - a real place Maps resolves\n   perfectly. Caught by reading the eight rendered rows after the push rather than trusting\n   the rule. Online events are excluded instead, because pointing Maps at \"Online, Zoom,\n   Bronx, NY\" would drop a pin somewhere arbitrary in the borough.\n   MEASURED at 390: the body column is 293px and the address renders at 13px, so the full\n   address averages 260px against 137px before, and 3 of 12 rows gain one 17px line. */\nfunction venueParts(raw){\nvar f=(raw||'').split(',').map(function(x){ return x.trim(); }).filter(Boolean);\nif(!f.length){ return null; }\nif(f.length>1 && /^(NY|New York|USA|United States)$/i.test(f[f.length-1]) && f.some(function(x){ return /^[A-Za-z]{2}\\s+\\d{5}/.test(x); })){ f=f.slice(0,-1); }\nvar online=/^(online|virtual|zoom|webinar|live\\s*stream)\\b/i.test(f[0]) || f.some(function(x){ return /^(online|virtual|zoom)$/i.test(x); });\nreturn { name:boro(f[0]), addr:f.slice(1).map(boro).join(', '),\nmap:online ? '' : 'https://www.google.com/maps/search/?api=1&query='+encodeURIComponent(raw) };\n}\nfunction addrHtml(v, cls){\nif(!v.addr){ return ''; }\nreturn v.map\n? '<a class=\"'+cls+' ftb-ev__maplink\" href=\"'+esc(v.map)+'\" target=\"_blank\" rel=\"noopener\" title=\"Open in Google Maps\">'+esc(v.addr)+'</a>'\n: '<span class=\"'+cls+'\">'+esc(v.addr)+'</span>';\n}\n/* ONE EVENT, ONE ADDRESS. His call 2026-11-02: \"when I click on the event it should take me\n   to the full description on the event page, not to the events outside link.\"\n   Every row, tile and the UP NEXT panel carries id=\"ev-<Google event id>\". The id is Google's\n   own and is per occurrence (a weekly karaoke night is ..._20261107T010000Z), so a link names\n   one night, not the series. The home page PULL UP rows link to /pages/events#ev-<id>.\n   [!] THE ROW DOES NOT EXIST WHEN THE PAGE LOADS, so the browser's own #hash jump finds\n   nothing. openHash() below finds the event in the feed, picks the right view and page,\n   draws, then scrolls it to just under the sticky header (--header-sticky-height, 149px at\n   1440 and 73px at 390, MEASURED 2026-11-02). An id that is not in the feed (ended, or past\n   the six month window) changes nothing and the page opens as normal. */\nfunction evId(e){ var x=String(e.id||'').replace(/[^A-Za-z0-9_-]/g,''); return x ? 'ev-'+x : ''; }\nfunction idAttr(e){ var x=evId(e); return x ? ' id=\"'+x+'\"' : ''; }\nfunction rowHtml(e){\nvar d=e.startD;\nvar conf=e.confirmed?'<span class=\"ftb-ev__confirmed\">'+evwH('confirmed')+'</span>':'';\n/* THE DATE COLUMN IS 96px (84px at 390) AND THE TIME LINE WAS nowrap, so \"THRU NOV 15\"\n   and a \"9:30\u201311:30 PM\" ran across the hairline. The line may now wrap, but only where\n   it should: spaces are non-breaking, the one break point is after the dash or after\n   THRU. \"THRU / NOV 15\", never \"THRU NOV / 15\". */\nvar tr=whenLine(e).replace(/ /g,'&nbsp;').replace('\u2013','\u2013<wbr>');\nvar thruNb=evwH('thru').replace(/ /g,'&nbsp;')+'&nbsp;'; if(tr.indexOf(thruNb)===0){ tr=evwH('thru')+' '+tr.slice(thruNb.length); }\nvar v=venueParts(e.venue);\nvar venueLine=v?('<div class=\"ftb-ev__venue-line\"><span class=\"ftb-ev__venue-name\">'+esc(v.name)+'</span>'+addrHtml(v,'ftb-ev__venue-addr')+'</div>'):'';\nvar acts=(e.url?'<a class=\"ftb-ev__act ftb-ev__act--rsvp\" href=\"'+esc(e.url)+'\" target=\"_blank\" rel=\"noopener\">'+evwH('rsvp')+'</a>':'')+'<a class=\"ftb-ev__act ftb-ev__act--cal\" href=\"'+esc(addToCal(e))+'\" target=\"_blank\" rel=\"noopener\">'+evwH('addcal')+'</a>';\nreturn '<div class=\"ftb-ev__row\"'+idAttr(e)+'>'\n+'<div class=\"ftb-ev__date\"><div class=\"ftb-ev__day\">'+(d.getDate()<10?'0':'')+d.getDate()+'</div>'\n+'<div class=\"ftb-ev__dow\">'+MON[d.getMonth()]+' \u00B7 '+DOW[d.getDay()]+'</div>'+(tr?'<div class=\"ftb-ev__time\">'+tr+'</div>':'')+'</div>'\n+'<div class=\"ftb-ev__body\"><span class=\"ftb-ev__row-title\">'+esc(e.title)+'</span>'+conf+venueLine\n+(e.desc?'<p class=\"ftb-ev__meta-line\">'+esc(e.desc)+'</p>':'')+'</div>'\n+'<div class=\"ftb-ev__actions\">'+acts+'</div>'\n+'</div>';\n}\n/* HAPPENING NOW TILES, his call 2026-10-28: \"ON NOW, should be HAPPENING NOW and should be\n   shaded a different color to show the urgency... Maybe it should be squares across the\n   top, that auto fill the space\", then \"the squares up top could fill with the photo as the\n   backdrop, but with a filter so it's easy to read the text on it\". He chose that, with a\n   solid orange tile as the fallback for an event with no art (2026-10-28).\n   One tile per live event. The status line says when: THRU NOV 15 for a run, TONIGHT\n   (starts 5 PM or later) or TODAY plus the hours for a one-off.\n   The image is the same first-image-URL the UP NEXT panel uses. It goes in as a CSS custom\n   property inside a double-quoted style attribute; allUrls() never captures a quote, a\n   bracket or whitespace, so the URL cannot break out of url('...') or the attribute. */\nfunction nowStatus(e){\nif(multiDay(e)){ var l=lastDay(e); return evwH('thru')+' '+MON[l.getMonth()]+' '+l.getDate(); }\nif(e.allDay){ return evwH('allday_today'); }\nreturn (e.startD.getHours()>=17?evwH('tonight'):evwH('today'))+' \u00B7 '+timeRange(e.startD,e.endD);\n}\nfunction tileHtml(e){\nvar v=venueParts(e.venue);\nvar acts=(e.url?'<a class=\"ftb-ev__tile-btn ftb-ev__tile-btn--solid\" href=\"'+esc(e.url)+'\" target=\"_blank\" rel=\"noopener\">'+evwH('rsvp')+'</a>':'')+'<a class=\"ftb-ev__tile-btn\" href=\"'+esc(addToCal(e))+'\" target=\"_blank\" rel=\"noopener\">'+evwH('addcal')+'</a>';\nreturn '<article'+idAttr(e)+' class=\"ftb-ev__tile'+(e.image?' ftb-ev__tile--photo\" style=\"--tile-img:url(\\''+esc(e.image)+'\\')\"':'\"')+'>'\n+'<p class=\"ftb-ev__tile-status\"><span class=\"ftb-ev__pulse\" aria-hidden=\"true\"></span>'+esc(nowStatus(e))+'</p>'\n+'<h4 class=\"ftb-ev__tile-title\">'+esc(e.title)+'</h4>'\n+(v?'<p class=\"ftb-ev__tile-venue\"><span class=\"ftb-ev__tile-venue-name\">'+esc(v.name)+'</span>'+(v.addr?(v.map?'<a class=\"ftb-ev__tile-addr\" href=\"'+esc(v.map)+'\" target=\"_blank\" rel=\"noopener\">'+esc(v.addr)+'</a>':'<span class=\"ftb-ev__tile-addr\">'+esc(v.addr)+'</span>'):'')+'</p>':'')\n+'<div class=\"ftb-ev__tile-btns\">'+acts+'</div>'\n+'</article>';\n}\n/* ON NOW, his call 2026-10-28: \"I like the on now block. it could also show events that\n   are happening that day even if it only happens once.\"\n   THREE BUCKETS, AND THEY PARTITION THE FEED - every event lands in exactly one:\n   ON NOW   starts before midnight tonight AND has not ended yet. Tonight's one-off and\n            day 12 of a month-long exhibit both live here, once, until they end.\n   UPCOMING starts tomorrow or later. UP NEXT is the first of these, so nothing that is\n            already in ON NOW can be featured a second time.\n   PAST     has ended. Before this change PAST meant \"started before today\", so a\n            month-long run fell into PAST on its second day while still open.\n   ON NOW renders above UP NEXT, on page 1 of Upcoming only, inside the featured slot, as the\n   HAPPENING NOW tiles below (renamed and re-shaped on his call the same evening). */\nfunction render(events, view){\nvar now=new Date(), today=new Date(now.getTime()); today.setHours(0,0,0,0);\nvar tomorrow=new Date(today.getTime()); tomorrow.setDate(tomorrow.getDate()+1);\nvar byStart=function(a,b){ return a.startD-b.startD; };\nvar onNow=events.filter(function(e){ return e.startD<tomorrow && endOf(e)>now; }).sort(byStart);\nvar up=events.filter(function(e){ return e.startD>=tomorrow; }).sort(byStart);\nvar past=events.filter(function(e){ return e.startD<tomorrow && endOf(e)<=now; }).sort(function(a,b){ return b.startD-a.startD; });\nvar set = view==='past' ? past : up;\nfeatEl.innerHTML=''; listEl.innerHTML='';\nvar isUp = view!=='past';\nif(!set.length && !(isUp && onNow.length)){ emptyEl.style.display=''; return; }\nemptyEl.style.display='none';\nvar listItems = isUp ? set.slice(1) : set.slice(0);\nvar totalPages = Math.max(1, Math.ceil(listItems.length/perPage));\nif(curPage>totalPages-1){ curPage=totalPages-1; }\nif(curPage<0){ curPage=0; }\nvar nowHtml='';\nif(isUp && curPage===0 && onNow.length){\nnowHtml='<section class=\"ftb-ev__now\" aria-label=\"'+esc(String(EVW.now_heading||'').charAt(0).toUpperCase()+String(EVW.now_heading||'').slice(1).toLowerCase())+'\"><h3 class=\"ftb-ev__month ftb-ev__month--now\">'+evwH('now_heading')+'<span class=\"ftb-dot\">.</span></h3><div class=\"ftb-ev__now-grid\">'+onNow.map(tileHtml).join('')+'</div></section>';\nfeatEl.innerHTML=nowHtml;\n}\nif(isUp && curPage===0 && set.length){\nvar f=set[0];\nvar d=f.startD;\nvar eb=evwH('upnext')+' <span>\u00B7</span> '+DOW[d.getDay()]+' '+MON[d.getMonth()]+' '+d.getDate()+' <span>\u00B7</span> '+whenLine(f);\nvar fv=venueParts(f.venue);\nvar fvenue=fv?('<p class=\"ftb-ev__feat-venue\"><span class=\"ftb-ev__feat-venue-name\">'+esc(fv.name)+'</span>'+addrHtml(fv,'ftb-ev__feat-venue-addr')+'</p>'):'';\nvar mediaSrc = f.image || featuredImage;\nvar media = mediaSrc ? '<div class=\"ftb-ev__feat-media\"><img src=\"'+esc(mediaSrc)+'\" alt=\"\"></div>' : '<div class=\"ftb-ev__feat-media\"></div>';\nvar btns=(f.url?'<a class=\"ftb-ev__btn ftb-ev__btn--solid\" href=\"'+esc(f.url)+'\" target=\"_blank\" rel=\"noopener\">'+evwH('rsvp')+'</a>':'')\n+'<a class=\"ftb-ev__btn ftb-ev__btn--out\" href=\"'+esc(addToCal(f))+'\" target=\"_blank\" rel=\"noopener\">'+evwH('addcal')+'</a>';\nfeatEl.innerHTML=nowHtml+'<div class=\"ftb-ev__feat\"'+idAttr(f)+'>'\n+'<div class=\"ftb-ev__feat-panel\"><p class=\"ftb-ev__eyebrow\">'+eb+'</p>'\n+'<h2 class=\"ftb-ev__feat-title\">'+esc(f.title)+'</h2>'\n+fvenue\n+(f.desc?'<p class=\"ftb-ev__feat-desc\">'+esc(f.desc)+'</p>':'')\n+'<div class=\"ftb-ev__feat-btns\">'+btns+'</div></div>'\n+media+'</div>';\n}\nvar pageItems = listItems.slice(curPage*perPage, curPage*perPage+perPage);\nvar html='', curMonth='';\nfor(var i=0;i<pageItems.length;i++){\nvar e=pageItems[i], d=e.startD, mk=MONF[d.getMonth()]+' '+d.getFullYear();\nif(mk!==curMonth){ curMonth=mk; html+='<h3 class=\"ftb-ev__month\">'+mk+'</h3>'; }\nhtml+=rowHtml(e);\n}\nif(totalPages>1){ html+=pager(curPage+1, totalPages); }\nlistEl.innerHTML=html;\nvar nav=listEl.querySelector('.pagination-custom');\nif(nav){ nav.addEventListener('click', function(evt){\nvar b=evt.target.closest('[data-ev-page]'); if(!b) return;\nvar n=parseInt(b.getAttribute('data-ev-page'),10); if(!n) return;\ncurPage=n-1; draw(); root.scrollIntoView({behavior:'smooth',block:'start'});\n}); }\n}\nvar ALL=[], curView='upcoming', curPage=0;\nvar perPage=parseInt(root.getAttribute('data-per-page')||'8',10); if(!perPage||perPage<1){ perPage=8; }\nfunction draw(){ render(ALL, curView); }\npills.forEach(function(p){\np.addEventListener('click', function(){\npills.forEach(function(x){ x.classList.remove('is-active'); x.setAttribute('aria-selected','false'); });\np.classList.add('is-active'); p.setAttribute('aria-selected','true');\ncurView=p.getAttribute('data-view'); curPage=0; draw();\n});\n});\nvar ids=(root.getAttribute('data-gcal-ids')||'').split(/[\\s,]+/).filter(Boolean);\nvar key=root.getAttribute('data-gcal-key')||'';\nvar jobs=[];\nif(key && ids.length){ ids.forEach(function(id){ jobs.push(fetchGcal(id,key)); }); }\nPromise.all(jobs).then(function(results){\nvar real=[]; results.forEach(function(arr){ real=real.concat(arr); });\nvar events=normalize(real);\nif(!events.length && showPlaceholders){\nvar ph=root.querySelector('[data-ev-placeholders]')||document.querySelector('[data-ev-placeholders]');\ntry{ events=normalize(JSON.parse(ph.textContent)); }catch(e){}\n}\nALL=events; if(!openHash()){ draw(); }\nwindow.addEventListener('hashchange', openHash);\n});\nfunction setView(v){\npills.forEach(function(x){ var on=x.getAttribute('data-view')===v; x.classList.toggle('is-active',on); x.setAttribute('aria-selected',on?'true':'false'); });\ncurView=v;\n}\nfunction openHash(){\nvar h=decodeURIComponent((location.hash||'').slice(1));\nif(!/^ev-/.test(h)){ return false; }\nvar now=new Date(), t=new Date(now.getTime()); t.setHours(0,0,0,0); t.setDate(t.getDate()+1);\nvar target=null; ALL.forEach(function(e){ if(!target && evId(e)===h){ target=e; } });\nif(!target){ return false; }\nvar byStart=function(a,b){ return a.startD-b.startD; };\nif(target.startD<t && endOf(target)>now){ setView('upcoming'); curPage=0; }\nelse if(target.startD>=t){\nvar up=ALL.filter(function(e){ return e.startD>=t; }).sort(byStart);\nvar i=up.indexOf(target); setView('upcoming'); curPage = i<1 ? 0 : Math.floor((i-1)/perPage);\n} else {\nvar past=ALL.filter(function(e){ return e.startD<t && endOf(e)<=now; }).sort(function(a,b){ return b.startD-a.startD; });\nsetView('past'); curPage=Math.floor(Math.max(0,past.indexOf(target))/perPage);\n}\ndraw();\nvar el=document.getElementById(h); if(!el){ return true; }\n/* [!] THE BROWSER ALSO JUMPS TO THE #ev- ID, on its own, when the page finishes loading, and\n   it aims for the very top edge, under the header. MEASURED 2026-11-02: a page-2 row was\n   carried from 165px down the screen to -0.2px, about half a second after this code placed\n   it. No script did that; scroll-margin-top is what makes the browser's jump and this one\n   land in the same place. Jump instantly, re-check after the header settles and when the\n   UP NEXT photo loads, and correct only past 2px. */\nfunction go(){\nvar off=(parseFloat(getComputedStyle(document.body).getPropertyValue('--header-sticky-height'))||0)+16;\nel.style.scrollMarginTop=off+'px';\nvar d=el.getBoundingClientRect().top-off; if(Math.abs(d)<=2){ return; }\nwindow.scrollTo({ top:Math.max(0, window.pageYOffset+d), behavior:'instant' });\n}\ngo(); setTimeout(go, 400); setTimeout(go, 1200);\n/* LANDED MARK, his call 2026-11-02 (option A): a 2px #ff4d00 outline 3px outside the box, held\n   2s, then faded over 0.6s and removed. The 3px gap keeps it visible around the orange\n   HAPPENING NOW tiles. Inline styles only, so no stylesheet is touched; the row's own\n   box-shadow/transform transition is kept and outline-color is added to it. */\nvar keepT=el.style.transition, rm=window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\nel.style.outline='2px solid #ff4d00'; el.style.outlineOffset='3px';\nel.style.transition=(getComputedStyle(el).transition||'all 0s')+', outline-color .6s ease';\n/* [!] THE 2s CLOCK STARTS WHEN THE PAGE HAS FINISHED LOADING, not when the outline is set.\n   MEASURED 2026-11-02 at 1440: outline set at 2.7s, page still loading until 7.5s with frames\n   arriving slowly, so a 2s hold from the moment it was set expired while the page was still\n   settling. Now it stays on through the load and fades 2s after it. */\nfunction hold(){ requestAnimationFrame(function(){ requestAnimationFrame(function(){\nsetTimeout(function(){ if(rm){ el.style.outline=''; } else { el.style.outlineColor='transparent'; } }, 2000);\nsetTimeout(function(){ el.style.outline=''; el.style.outlineOffset=''; el.style.transition=keepT; }, 2700);\n}); }); }\nif(document.readyState==='complete'){ hold(); } else { window.addEventListener('load', hold, {once:true}); }\nroot.querySelectorAll('img').forEach(function(im){ if(!im.complete){ im.addEventListener('load', go, {once:true}); } });\nreturn true;\n}\n})();\n"],
  "mappings": "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",
  "names": ["key", "e"]
}
