Dharma Bums
View LiveOverview
Front-end development for Dharma Bums, a bistro and live-music venue outside New Hope, PA, built around Kerouac's "a nod to the past, a simpler time, when people gathered to listen to music and read poetry over good food and drink."
I worked on the front-end within Mind Your Design's team, building out the Craft CMS templates, the Alpine.js interaction layer and the modular page-builder system that lets the client assemble pages from reusable blocks (gallery, FAQ, quotes, split views) without touching code.
Server-rendered filtering
The events section was the most interesting technical problem on the site. Rather than shipping the event catalogue to the browser and filtering client-side, I built it around Sprig, Craft's Twig-based AJAX component library: clicking an event-type filter fires a partial request back to Craft, which re-queries and re-renders just that fragment server-side. Alpine handles the UI state on top; active-button styling, syncing the hidden filter input - and Sprig's s-replace-url attribute keeps the browser history in sync with each filter change, so back/forward navigation lands on the right filtered view instead of resetting to "all events."
Stack and image pipeline
Built on Craft CMS with Twig, Sprig for partial reloads, Blitz for page caching, SEOmatic for SEO, Solspace Calendar for events, and Neo powering the modular page-builder field. Alpine.js (with the collapse, focus, intersect and persist plugins) and Tailwind carry the interactivity and styling with a minimal dependency footprint. A shared picture component generates responsive, retina-aware WebP sources with JPEG/PNG fallbacks per image, and the Tailwind config defines brand colours in both sRGB and display-p3 via a @supports feature query, so the warmer golds and rust tones render truer on wide-gamut displays without breaking anywhere else.
Accessibility as a build constraint, not a pass
Focus management runs through most of the interactive components rather than being an afterthought: the mega-menu traps focus and closes on Escape with focus returned to the trigger button, ARIA aria-expanded/aria-hidden/tabindex states track visibility on the mobile nav, and the FAQ accordion dispatches a custom event so opening one question closes any other that's open, all driven by Alpine's x-id and $dispatch rather than manual DOM queries. The welcome modal persists its dismissed state via Alpine's persist plugin so returning visitors aren't re-shown it every visit.