.empty-hero rebuilt as flex column. #bpfFltTitle + #bpfFltCtas injected (2×2 grid: Open Now / Nearby / Festival Info / Full Programme). Full-screen #bpfWelcomeOverlay with .bpf-wo-* class tree, photo background, "Witness" title, countdown, chips.window.openProgramme exposed via #emptyResetBtn proxy. Filter strip: contextual copy line + taller strip (170px). Address hidden from venue hero → popup only. Filter reset re-shows welcome overlay.#bpfFltCopy moved inside #bpfFltTitle (grandchild of .empty-hero → immune to V369's direct-child hide rule). #bpfFltTitleTxt span created. Edition chip repositioned above title.#bpfFltCtas { flex-direction: row } + .bpf-flt-row { display: contents } → all 4 buttons in one row. Kicker "WITNESS — THE 11TH EDITION" added. Per-filter copy texts. Active filter button shows "↩ Home". (Layout later corrected by V412.).bpf-v382-* class system. WITNESS at 72px, font-weight: 900, gradient text (white→amber→orange). Stats tiles: 15 Venues / 40+ Events / 10 Days. Primary CTA: radial-gradient coral button. Glass secondary buttons. Countdown "Opens in X days" in lead line.bpf2023-poster.jpg photo background introduced in #bpfWelcomeOverlay. Topbar gap corrected (searchbar/controls stay at 72px).justify-content: flex-end). Filter strip: "Full Programme" CTA renamed to "Welcome" (opens overlay).height: auto eliminates 69px dead zone below CTAs. Welcome overlay JS guard: if V382 WOW content is stripped by base app, rebuilds it from buildV387WelcomeHTML()..sh-chip: 10.5px, visible border. Searchbar: darker icon + edge. Search results: top: 113px (right below searchbar bottom).localStorage bookmarks, #savedBtn wired). Venue sort order numbers (01, 02…). Multiple micro-refinements: spacing, colours, chip geometry..prog-item grid replaced with new structure: .prog-item-row1 (title + time flex), .prog-item-author-r, .prog-item-row3 (chips), .prog-item-detail-r (expandable detail). .pi-chip colour-coded type chips. Expand/collapse via click on row..fi-get-involved ghost element removed (V406) with guard to prevent V400's 800ms re-injection timer (V407). Multiple layout tweaks.inset: 130px 22px 0 22px. Programme sheet: max-height: calc(100% − 130px). Navigation modal backdrop: backdrop-filter: none (removed blur, kept solid overlay)..prog-item-time etc. (original classes no longer in DOM after V399). JS MutationObserver also targeted old class names. Broke X close button position. Corrected by V410.position: absolute, specificity 0,2,0). Corrected V399 class names throughout CSS. Saved panel: large thin number from v.sortOrder, no "No." prefix. Inline venue navigation bypassing broken bpfGoToVenue chain. AT/WITH detail lines in programme. Partners text chips injected in Festival Info (later upgraded by V411).flex-direction: row regression). Editorial title upgrade (kicker 7px / title 24px 800). Buttons: 12px radius, correct tier styling.inset:0, overrides V370 inset). WITNESS at 100px. Photo background + dramatic red radial. Stats: floating glass cards. Primary CTA: italic gradient coral. Close button: 34px circle..empty-hero > * { position: relative }.
| # | Issue | Severity | Fix path |
|---|---|---|---|
| B1 | Grabber visible but non-functional. Visible affordance in all states, does nothing when dragged. Creates false expectation of drag-to-dismiss or expand. | UX | Hide in mode-empty; or wire touch events → sheet expand/collapse toggle |
| B2 | Popup stays visible when sheet is expanded. Both overlay the same area, visual noise when user drags sheet up. | Visual | .app.sheet-expanded #popup { display: none } — 1 CSS rule |
| B3 | CSS specificity debt. V344→V412 = 68 V-blocks, each using !important escalation. Rules contradict each other (V374 then V412 on filter layout, V409 then V410 on programme, etc.). File is fragile and hard to reason about. |
Technical | Consolidation pass into a single clean stylesheet — before next edition, not urgent for October |
| B4 | Programme "View on Map" button — bpfGoToVenue chain unreliable. V410 JS added inline navigation bypass via direct markerMap access; needs user testing to confirm it works across all venue ID types (string vs. number from Airtable). |
Functional | Test in browser; if still broken, add explicit String(id) + Number(id) key lookup with MO fallback |
| B5 | Welcome overlay "Welcome" button in filter strip — V385 renamed "Full Programme" → "Welcome"; V387 re-wires the click handler. Depends on overlay DOM being present. Could fail on first load if overlay hasn't been built yet. | Functional | Guard: if #bpfWelcomeOverlay not in DOM, call window._bpfReShowWelcome() |
| B6 | Partners section — placeholder brands (eMAG, Kaufland, etc.) are fictitious. Need real confirmed partners and brand colours from BPF team before October. | Content | Update V411 JS BRANDS array with real confirmed partners |
.prog-cal-btn rendered in each expanded programme item. V410 styles it as a dark filled button (#0b1221)..bpf-v382-lead. Switches copy post-festival.bpf2023-poster.jpg full-bleed photo with dark gradient overlay. Red radial glow at top-right corner. V412 upgraded to full-bleed inset:0.localStorage. Saved panel accessible via #savedBtn. Shows venue number (large thin, from sortOrder), name, type, and "View ↗" navigation button..prog-item-row1/row3, -r class variants, expandable detail panel, colour-coded type chips. Left accent bar (red when open) added in V412..festival-info-footer. Each box has brand background colour + white logo text + gloss overlay.v.sortOrder.padStart(2,'0') instead of raw DB IDs. Large thin number (40px, weight 200) in saved panel.backdrop-filter: none replaced with solid rgba(8,12,28,0.50). Cleaner, faster rendering on mobile.renderSheet wrappernavigator.share() → venue name + address + URL. Opens native iOS/Android share sheet. Drives organic distribution during the festival. Needs P20 (deep links) first.display: none in mode-empty?venue=12 pre-selects a venue on load. ?event=45 opens programme to that event. Enables shareable links + bi-directional navigation with In-Light.URLSearchParams on DOMContentLoaded + matching state.selectedVenueId before first renderAllev.title, ev.author across all venues' events arrays.sh-hero-btmL.tileLayer swap on the map instance.bpf-today-lineshowPopup + renderSheet!important. Before the next edition (2027), a single rewrite would eliminate all specificity debt. Not urgent for October 2026.&display=swap to the Google Fonts URL. 2-second fix, prevents font-block on slow connections.markerMap key lookup covers string + number IDs.app.sheet-expanded #popup { display: none }v.openHours from Airtable (confirm field name)mode-empty (.app.mode-empty .sheet-grabber { display: none }) and optionally in mode-selected minimised. Or wire to expand toggle..app.sheet-expanded #popup { opacity: 0; pointer-events: none; transition: opacity .2s } — single CSS rule.?venue=ID from URLSearchParamsstate.selectedVenueId = ID before first renderAll(true)navigator.share({ title, url })venueMatchesSearch() to scan v.events[].title and v.events[].author.bpf-v382-body)BRANDS array with real confirmed sponsors + actual brand colours from brand guidelinesL.tileLayer swap to Carto Dark Matter when new Date().getHours() >= 20&display=swap to Google Fonts URL (2 min, P26)