26 april 2026 1 månader sedan
Dependency Upgrades Next.js 16.1.6 → 16.2.4 + @next/third-parties matched React + React DOM 19.2.4 → 19.2.5 Framer Motion → Motion (rebrand, same 12.38.0; imports now use motion/react) Tailwind CSS + @tailwindcss/postcss 4.2.2 → 4.2.4 Biome 2.3.13 → 2.4.13, Playwright 1.58 → 1.59, postcss 8.5.8 → 8.5.10 lenis 1.1.6 → 1.3.23, resend 6.8 → 6.12.2 @types/node 20 → 22 (matches Node 22 runtime) Removed unused deps: @formspree/react, react-intersection-observer, @types/sharp (sharp ships its own types now) Dead Code & Asset Cleanup Deleted Layout.tsx (was a duplicate of AppShell) Removed unused components: burger/, header/, curtain/, image-marquee/, text-marquee/ Trimmed 7 unused exports from lib/partners.ts (getPartnersByType, getBijeloDugmeMembers, getAllCountries, getActors, getShows, getMemorialPartners, isMemorial) Purged WSL :Zone.Identifier artifacts from public/images Net diff for the pass: −1,677 lines (658 added, 2,335 removed) Shared Helpers (Consolidation) New lib/seo.ts with SITE_URL, SITE_BRAND, ORGANIZATION_ID, ogLocaleFor, alternatesFor — replaces hardcoded "https://kaponi.se" strings in metadata + JSON-LD New lib/og-image.tsx with renderSiteOg() and renderEventOg(event) — collapses 4 near-identical OG/Twitter image routes (190–280 lines each) into 10-line shims New lib/calendar.ts with buildGoogleCalendarUrl(...) — replaces inline string-concat blobs in event page client Accessibility Polish Added type="button" to 12+ buttons across modal, navbar, theme toggle, view toggle, language switcher, FAQ, partners filter aria-hidden="true" on decorative SVGs throughout (logo, modal close, error icon, social icons) Footer social links: <ul><li> structure with screen-reader labels (replaced role="list"/role="listitem" pattern) Renamed shadowed Error component to ErrorPage; added keyboard focus handlers (was mouse-only) Fixed CSS specificity ordering on footer hover states; removed duplicate display rule in burger CSS SEO & AEO Refinements Sitemap lastModified bumped to 2026-04-24 robots.txt now enumerates 11 AI crawlers — added ChatGPT-User, Perplexity-User, Google-Extended, ClaudeBot, anthropic-ai, Applebot-Extended, CCBot Sitemap exports host directive Homepage MusicEvent JSON-LD references ORGANIZATION_ID, omits empty offers, adds addressCountry: "SE" Dropped stale validFrom: "2026-01-01" placeholder from event offers Tooling & Lint New biome.json scopes checks (excludes .next, kaponi-old-site, scripts/, visual-audit/screenshots) Formatter disabled inside biome check to avoid churn — still runnable on demand via pnpm format Disabled opinionated rules clashing with intentional patterns (JSON-LD index keys, progressive-enhancement min-height: 100vh/100dvh, tab-pattern buttons) parseInt now passes radix in /api/contact payload size guard String concatenations replaced with template literals where flagged Testing New tests/events.test.ts (node:test, zero extra deps): 14 cases Covers formatEventDate (all 3 locales + fallback + empty + weekday math) Covers getDaysUntilEvent (past/future), getEventUrgency (manual badge priority, 30-day window, past, far-future) Covers buildGoogleCalendarUrl encoding + optional details pnpm test script wired up: node --test --import tsx tests/**/*.test.ts20 april 2026 1 månader sedan
New Event: Jala Brat & Buba Corelli GOAT Tour Helsingborg, 31 oktober 2026 at HBG Arena Square-cropped tour poster with age restriction note Updated to public ticket URL on the official event page Title later expanded to the full tour name for brand consistency /jalabuba Vanity Short Link /jalabuba and /jala-buba 308-redirect to the event detail page Redirect respects the visitor's preferred locale (sv/en/bs) via proxy middleware Lets us share a memorable link in physical promo and Stories presentedBy Label New optional Event.presentedBy field (string | LocalizedString) Renders as a small accent-colored pill above the artist name on event cards and detail pages Used to split the long Jala/Buba tour title cleanly ("MUSIC WEEK PRESENTS") Hidden in horizontal list variant of the card to keep that layout compact Ticket Copy Cleanup Dropped Tickster vendor name from ticket copy — phrasing is now vendor-agnostic Updated across sv/en/bs translations so future ticket providers swap in cleanly9 april 2026 2 månader sedan
New Event: Balkan Afterparty Helsingborg, 2 maj 2026 at The Tivoli Afterparty paired with the Aleksandra Prijović concert earlier that night WebP poster + blur placeholder, Google Maps link, full 3-locale descriptions Door times and ticket URL added (Tivoli doors ~23:30) Praktisk Info Section New practicalInfo field on Event type lets each event override the generic "doors open" text Aleksandra: Doors 19:00, concert 21:00 Afterparty: Doors ca 23:30 Section width and padding aligned with the content area; background image toned down for readability Event List Polishing Reordered: Aleksandra first, Afterparty second (chronological match for the same night) Tickster importer now matches events by URL, not artist name — eliminates duplicate afterparty rendering Removed past Senidah events (Stockholm Apr 3, Malmö Apr 4, Göteborg Apr 5) as they passed Build Stability Removed auto Tickster scrape from `next build` so the build no longer fails on Tickster outages Manual `pnpm update-events` preserves curated event metadata when refreshing from Tickster4 april 2026 2 månader sedan
Event Updates Removed past Senidah Stockholm (Fållan, Apr 3) event Göteborg event: added full trilingual descriptions (sv/en/bs), mapsUrl, ticketInfo, ticketTip Fixed artist diacritics: "Adi Sose" → "Adi Šoše" for Göteborg event Build script now preserves manually curated event data instead of overwriting on Tickster sync Partners (Temporarily Hidden) Partners section hidden from homepage, navbar, header, and footer Partner pages removed from sitemap until images and full info are ready Partner routes still functional but not linked — will re-enable later SEO & AEO Fixes Fixed founding date inconsistency in schema (1985 → 1983) on partners page Fixed changelog canonical URL to be locale-aware (/sv/changelog) Added dns-prefetch for Tickster and Google Maps domains Removed unused NEXT_PUBLIC_CMS_API_TOKEN env variable from config Cleaned up stale deploy timestamp comments from next.config Accessibility & i18n Theme toggle aria-label now uses i18n translations (sv/en/bs) instead of hardcoded Swedish Added nav.switchToLight and nav.switchToDark translation keys for all locales Code Quality Fixed rate limit memory leak in contact API (cleanup when >100 entries) Removed unused PartnersIcon export from NavIcons Removed unused trackExternalLink function from analytics21 mars 2026 2 månader sedan
Cinematic Hero Experience New full-bleed cinematic hero backgrounds for partner pages (heroEnvironment field) Film-grade gradient overlay with depth parallax on hover Cinematic mode with white text on dark overlay, glassmorphism genre tags Responsive cinematic hero for all breakpoints AEO - Answer Engine Optimization New shortBio field for factual AI-citable answer capsules per partner Answer capsule section rendered at top of partner pages (speakable schema) Created /llms.txt for AI crawler discovery (ChatGPT, Perplexity, Claude) Explicitly allowed GPTBot, PerplexityBot, GoogleOther, Claude-Web in robots.txt Smart meta descriptions that break at sentence boundaries instead of mid-word Enriched Schema Markup (SEO) Added knowsAbout, hasOccupation, memberOf (Kaponi Live) to JSON-LD Added performerIn linking events to artist schema Added speakable specification for voice assistants and AI citation Added birthDate/deathDate for memorial partners Extended sameAs with Apple Music, Wikipedia, MusicBrainz support Custom OG images per partner (1200x630 social cards) Spotify Integration Embedded Spotify player section on partner pages (spotifyArtistId field) Premium styled player with shadow and rounded corners Lazy-loaded iframe for performance Cinematic Quote Break New artistQuote field for featured quotes from partners Full-width atmospheric section with cinematic background overlay Large decorative quotation marks with author attribution Responsive typography scaling Data Model Extensions Added shortBio (LocalizedString) - AEO answer capsule Added heroEnvironment (string) - cinematic hero background path Added ogImage (string) - custom social sharing card per partner Added artistQuote (LocalizedString) - cinematic quote break Added spotifyArtistId (string) - embedded Spotify player Added appleMusicUrl, wikipediaUrl, musicbrainzId to SocialLinks All 11 partners populated with shortBio and spotifyArtistId Dino Merlin and Zdravko Colic have artistQuote examples Custom 404 Page Branded not-found page with glassmorphism design Multi-language support (sv/en/bs) with auto-detection from URL Large 404 display with Clash Display font CTA buttons to Events and Partners pages Back navigation button Fade-in animations Critical SEO Fixes Added partner pages to sitemap (was completely missing - 11 partners x 3 locales = 33 URLs) Added events listing page to sitemap Added contact page to sitemap Updated sitemap lastModified dates Featured partners get higher sitemap priority (0.85 vs 0.7) Added Organization + Breadcrumb schema to partners listing page Added MusicEvent schema for upcoming events on homepage (drives Google event carousels) RSS Feed & Image Optimization Created /feed.xml RSS feed for all upcoming events Added RSS feed link tag to layout head Enabled AVIF image format in next.config (smaller files, better quality) Optimized device/image sizes for responsive delivery Added dns-prefetch for Spotify embeds Added proper Content-Type headers for llms.txt22 januari 2026 4 månader sedan
Contact Form with Resend Replaced Formspree with Resend for email delivery Created reusable ContactForm component used on both contact page and homepage New API route (/api/contact) with proper TypeScript types Professional HTML email template with Swedish text Reply-to set to sender's email for easy responses Footer Light Mode Fix Footer now has dark background in both themes (matching navbar) White logo visible on dark background in light mode Consistent premium dark aesthetic across all themes All text colors adjusted for dark background Events Grid Placeholder Placeholder card now renders inside grid (flows with event cards) Responsive: shows on 3-col when needed, hides on 2-col when even count Compact circular social buttons with platform-specific hover colors Instagram gradient, Facebook blue, TikTok black with cyan glow Generic "Coming soon" text (sv/en/bs) instead of specific date TypeScript & React 19 Added proper TypeScript interfaces for API routes React 19 compatible JSX imports Lazy Resend initialization to avoid build-time errors22 januari 2026 4 månader sedan
Simplified Navigation Navbar now has 3 main links: Hem, Konserter, Kontakt All nav items are now page links (no scroll-to-section) Added Home icon for homepage link Translations for all 3 locales (sv/en/bs) Dedicated Contact Page New /contact page with professional layout Contact info cards (email, phone) with hover effects Social media links (Instagram, Facebook, TikTok) Contact form with Formspree integration Full SEO metadata and ContactPage schema Light/dark mode support Layout Architecture Created AppShell component for persistent navbar/footer Navbar and footer now in root layout (no re-rendering on navigation) Smoother page transitions without layout flashing Removed redundant Layout wrapper from all pages Events Page Polish Redesigned view toggle (Kort/Lista) with minimal pill style List view date now subtle text instead of colored pill Cleaner, more custom-fitted controls21 januari 2026 4 månader sedan
URL-based Locale Routing Migrated from localStorage to URL-based routing (/sv/, /en/, /bs/) Proxy middleware for automatic locale detection and redirects LocaleLink component for seamless locale-aware navigation hreflang metadata and sitemap alternates for SEO Backward compatibility: /event/123 redirects to /sv/event/123 Event Page Redesign Premium "Praktisk information" section with animated gradient orbs Interactive info cards: Location (Maps), Date (Calendar), Age (Modal) Replaced accordion with clean inline tabs (Om eventet, Biljetter) Frosted glass card effects with hover animations Calendar integration: click date to add to Google Calendar Maps integration: click venue to open in Google Maps UI Modernization Squircle corners throughout (softer than pills) New CSS radius variables (--radius-xs through --radius-full) Navbar redesign: underline style, dividers between items Consistent radius values across all components Light Mode Improvements Dark navbar always (better contrast) Dark footer with inverted logo Event page praktisk info cards work in both themes Contact form TextArea light mode styles Analytics & Performance Added Vercel Analytics (privacy-friendly, no cookies) Scroll to top on event page mount Smooth scroll before card navigation Localized Content Event dates now fully localized (sv/en/bs formats) Unique event descriptions per venue (Stockholm, Malmö, Göteborg) Simplified language across all translations Denis-style copywriting: direct, humble, no marketing fluff SEO Fixes Sitemap: meaningful lastModified dates Added sizes attribute to images for responsive loading Changelog page: proper layout with SEO metadata Organization schema: added telephone field MusicEvent offers: AggregateOffer with price range (395-895 SEK)20 januari 2026 4 månader sedan
Scroll Text Fill Animation Restored scroll-triggered text fill effect on section titles Now uses framer-motion useScroll for cross-browser support Works in all browsers (Chrome, Safari, Firefox, Edge) Text fills in as you scroll down, unfills when scrolling back up Smooth spring-based animation with configurable viewport thresholds Event Card Images Fixed gray gap between card image and content section Images now use height: 100% with object-fit: cover Ensures images fill container fully regardless of aspect ratio Performance Removed expensive SVG goo filters for better scroll performance19 januari 2026 4 månader sedan
Framework Upgrade Upgraded Next.js from 16.1.1 to 16.1.3 Includes security fixes and Turbopack improvements Better file system caching for faster builds Render-Blocking CSS Fix Enabled experimental inlineCss feature CSS now inlined in <style> tags instead of <link> tags Eliminated 580ms render-blocking CSS requests LCP improved from 4.4s to 2.9s (-34%) Speed Index improved from 16.5s to 1.2s (-93%)19 januari 2026 4 månader sedan
Source Image Compression Hero background: 56KB → 49KB (quality 35) Showcase image: 118KB → 54KB (54% smaller, resized to 1000px) Next.js Image Optimization Reduced default image quality from 75 to 60 Applies to all images served via /_next/image19 januari 2026 4 månader sedan
Hydration Error Fix Fixed React error #418 (text content mismatch) Urgency badges now calculate client-side only Prevents time-based hydration mismatches between server/client Further Image Compression Showcase image: 237KB → 118KB (50% smaller) Hero background: 64KB → 56KB (additional 12% savings) Reduced quality to 45 without visible degradation19 januari 2026 4 månader sedan
Image Optimization Resized event images from 1080x1080 to 700x700 (55% smaller files) Converted AVIF images to WebP for better compatibility Compressed hero background from 96KB to 64KB (33% savings) Converted showcase image from JPG to optimized WebP JavaScript Bundle Added browserslist targeting only modern browsers (last 2 versions) Eliminates polyfills for Array.at, Object.fromEntries, etc. Estimated 14KB savings in legacy JavaScript CSS Optimization Enabled experimental optimizeCss with critters Critical CSS inlining reduces render-blocking time19 januari 2026 4 månader sedan
WCAG Contrast Compliance Fixed hero "Köp biljetter" button: dark text on peach background (4.5:1+) Fixed footer nav titles: upgraded from tertiary to secondary text color Fixed footer copyright: improved contrast for readability Fixed Facebook button: darkened background for better white text contrast Screen Reader Accessibility Added aria-labels to all navbar links (visible when labels hidden on mobile) Icon-only navigation now has discernible names for assistive technology19 januari 2026 4 månader sedan
Critical LCP Fix Identified hero subtitle as LCP element (not the image) Removed Framer Motion animations causing 2.6s render delay Converted to CSS-only slide animation (transform only, no opacity) Text now visible immediately in DOM for faster LCP Image Size Optimization Fixed featured image: added sizes="120px" (was loading 1080x1080) Reduced event card dimensions from 800x1000 to 400x500 Updated sizes attribute for accurate responsive loading19 januari 2026 4 månader sedan
LCP Optimization Converted hero image from JPEG (153KB) to WebP (96KB) Added preload hint for hero image in document head Added sizes attribute for responsive image loading FCP Optimization Fixed Author-Semibold font missing display: swap Added preconnect hints for GTM and Meta Pixel domains Added dns-prefetch for Google Analytics Deferred Lenis smooth scroll via dynamic import Image Compression Compressed about.webp from 2.9MB to 75KB (97% smaller) Added lazy loading and sizes to below-fold images19 januari 2026 4 månader sedan
Modal Stability Fixed AgeRestrictionModal event listener churn with useCallback CookieConsent now uses createPortal for proper isolation Consolidated dual AnimatePresence into single with mode="wait" Eliminated modal blinking on rapid open/close Image Layout Stability Removed style override that caused EventImage dimension conflicts Added aspect-ratio: 4/5 to imageContainer matching 800:1000 ratio Fixed imageFallback aspect-ratio mismatch (was 1, now 4/5) Eliminated layout shift when switching between image states19 januari 2026 4 månader sedan
React Compiler Enabled React Compiler for automatic memoization Improved rendering performance across all components Fixed modal blinking issues on event cards Reduced unnecessary re-renders throughout the app19 januari 2026 4 månader sedan
GDPR Cookie Consent Added GDPR-compliant cookie consent banner for EU/Sweden Frosted glass effect with elegant backdrop blur X button in top right corner to dismiss "Read more" link opens detailed cookie info modal Modal explains essential, analytics, and marketing cookies Banner appears after 300px scroll or 4 seconds delay User preference saved in localStorage Translations in Swedish, English, and Bosnian Analytics only load after user accepts cookies Google Tag Manager Integrated GTM using @next/third-parties for optimal performance Server-side rendering compatible implementation Consent-aware loading respects user privacy choices Meta Pixel (Facebook) Added Meta Pixel for conversion tracking PageView tracking on all pages InitiateCheckout event on "Buy Tickets" clicks Lead event on newsletter signups Contact event on form submissions Custom Event Tracking Created analytics utility library (lib/analytics.ts) Buy Tickets clicks tracked with artist/venue/date data Event page views tracked with ViewContent event Newsletter signups tracked as Lead conversions Contact form submissions tracked Social media clicks tracked (Instagram, Facebook, TikTok) Age restriction modal views tracked Language changes tracked Cookie consent responses tracked18 januari 2026 4 månader sedan
Event Cards Entire event card is now clickable to navigate to event details Added keyboard accessibility (Enter/Space to activate) Buy ticket button works independently without navigating Age restriction modal button works independently Header & Navigation Added language switcher to header on all pages Navigation links now work from event pages back to homepage sections Fixed cross-page navigation using absolute paths Social Media & SEO Added TikTok social link in footer Improved hero image alt text for accessibility Added Organization, WebSite, and FAQPage JSON-LD schemas Added hreflang language alternates for international SEO Created browserconfig.xml for Windows tiles17 januari 2026 4 månader sedan
Full Translation Support All 18 hardcoded Swedish text strings now translated Date formatting uses correct locale (sv, en, bs) Back link, headings, buttons all translated Dynamic event descriptions with artist/venue/city Accessibility Improvements Focus indicators for keyboard navigation on all interactive elements Screen reader support with aria-hidden on decorative icons Touch targets increased to minimum 44px height Color contrast improved for venue and date text Better image alt text: "{Artist} concert at {Venue} in {City}" SEO Enhancements Enhanced JSON-LD schema with @id, endDate, eventStatus Added BreadcrumbList schema (Home > Concerts > Event) Open Graph URL property for better social sharing Mobile Navigation Simplified mobile menu to 2 items (Events, Contact) Changed to elegant 8px rounded corners (from pill shape) More compact padding for cleaner look15 januari 2026 4 månader sedan
i18n Implementation Full website available in Swedish, English, and Bosnian Language switcher with country flags in navigation User language preference saved and remembered Instant switching without page reload Single Event Pages Individual pages for each concert at /event/[id] Rich event details with artist, venue, city, date Large hero image with professional imagery Direct ticket purchase button linking to Tickster Age restriction modal with clear information10 januari 2026 5 månader sedan
Navigation & Header Glass-morphism floating navbar with blur effect Smooth animations and transitions when scrolling Mobile-optimized icon-based navigation Active state indicators for current section Dark/Light theme toggle with preference saving Homepage Sections Animated hero with countdown to next concert Event cards with urgency badges (Selling Fast, Few Left) Experience section showcasing brand values Accordion-style FAQ section Newsletter signup with Formspree integration Contact form with validation Design System Clash Display for headlines Satoshi for body text General Sans for UI elements Peach Fuzz accent color (Pantone 2024 inspired) Premium shadows and glass morphism effects5 januari 2026 5 månader sedan
Performance Static Site Generation (SSG) for fast loading Next.js automatic image optimization Code splitting for minimal JavaScript Lenis library for smooth scrolling SEO Optimization Meta tags for title, description, keywords Open Graph for social media previews Twitter Cards optimization Automatic sitemap generation robots.txt configuration Accessibility (WCAG) Visible focus indicators for keyboard navigation ARIA labels for screen reader support Minimum 44px touch targets for mobile Reduced motion support for user preferences Proper color contrast throughout20 december 2025 5 månader sedan
Complete Rebuild Migrated from legacy site to Next.js 16 React 19 with TypeScript Framer Motion for professional animations Tailwind CSS utilities with CSS Modules Formspree for form handling Lucide React icon library Responsive Design Mobile-first approach Optimized layouts for tablets Full desktop experience