All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- iOS long-press browser defaults (context menu, text selection) interfering with chord playback
- Replaced inline styles with CSS utility classes for better CSP compliance
- Enhanced context menu prevention with JavaScript event handlers at multiple levels (individual elements, SVG container, and document-wide)
- Added UnoCSS utilities for iOS touch interaction fixes (
touch-none,no-touch-callout,no-user-select) - Created
ios-touch-fixshortcut combining all iOS touch utilities - Updated Instrument component to use CSS classes instead of inline styles
- Added
oncontextmenuevent prevention to all interactive path elements and SVG container - Implemented global context menu prevention in layout component for comprehensive coverage
- Critical mobile bug where first chord would play indefinitely in chord mode
- Improved touch event handling by switching to pointer events API
- Enhanced stopChord function to properly clean up all active oscillators
- Removed CSS transition delays for instant visual feedback on touch
- Added failsafe mechanisms including 5-second timeout and global pointer up listeners
- Replaced mouse/touch events with unified pointer events for better cross-device compatibility
- Made audio cleanup more robust with try-catch error handling
- Simplified touch tracking logic for more reliable performance
- Key center position setting - choose between top (12 o'clock) or bottom (6 o'clock) orientation
- Visual indicator dot showing the current key center position
- Enharmonic chord labeling based on selected key - shows correct sharp/flat notation per music theory
- Improved mobile ergonomics with bottom position as default for one-handed use
- Default key center position is now bottom (6 o'clock) for better mobile accessibility
- Chord labels dynamically adjust to show appropriate enharmonics (e.g., F# in key of G, Gb in key of F)
- Hamburger menu icon updated for better visual clarity
- Corrected SVG positioning calculations for both top and bottom orientations
- Touch-responsive chord and note playback - sounds play for the duration of key press
- Continuous audio playback with startChord() and stopChord() methods in audio store
- Full touch event support (touchstart, touchend, touchcancel) for mobile devices
- Mouse leave event handling to stop playback when cursor exits chord/note
- Chords and notes now play continuously while pressed instead of fixed 1.5 second duration
- Improved audio responsiveness with faster attack (10ms) and release (50ms) times
- Added touch-none CSS class to prevent touch scrolling interference during playback
- Responsive mobile UI with hamburger menu for settings panel
- HamburgerButton component for mobile navigation
- Touch-friendly mobile layout adjustments
- Mobile-optimized settings panel that slides in from the left
- Footer branding update with Fifths logo
- Settings panel now hides on mobile and is accessible via hamburger menu
- Improved responsive breakpoints for better mobile experience
- Enhanced UnoCSS configuration with additional utility classes
- Updated footer link styling for better visual hierarchy
- App meta tags updated with theme color matching primary brand color
- Mobile layout issues with settings panel overlapping content
- Touch interaction improvements for mobile devices
- playChordByNotes wrapper function for playing chords using note names instead of frequencies
- Root Bass voicing option combining bass root note with first inversion (e.g., C3, E4, G4, C5)
- Individual Notes mode for playing single chromatic notes instead of chords
- Key Center selector to rotate the circle and place any note/chord at 12 o'clock position
- Octave selector for individual notes mode (octaves 1-7)
- Oscillator type selection changed from radio buttons to dropdown for consistency
- Circle of Fifths visualization now supports both chord mode and individual notes mode
- Default key center is C (appears at 12 o'clock position)
- Professional audio engine with singleton AudioContext pattern
- Master volume control with real-time adjustment
- Reactive audio state management using Svelte 5 runes
- Documentation folder structure (/docs) for better organization
- Audio context analysis documentation
- Proper audio resource cleanup and memory management
- Extended frequency generation for octaves 1-7 (119 total notes)
- Rich chord voicings: standard, spread, rich, and bass-enhanced
- Chord voicing selector component with 4 voicing options
- In-memory frequency and chord generation for serverless deployment
- Chrome DevTools Vite plugin for enhanced debugging
- Comprehensive JSDoc documentation for all utility functions
- Refactored components: CircleOfFifths renamed to Instrument
- Extracted oscillator controls into SettingsPanel component
- Implemented Svelte 5 state stores for settings and performance
- Updated branding from "Chord Player" to "Fifths"
- Moved documentation files to organized /docs folder
- Audio context now reused instead of recreated for each chord
- Frequency generation moved from build-time to runtime (serverless-friendly)
- Renamed utils.ts to circleGeometry.ts for clarity
- Improved function naming: shiftOctave → transposeNoteByOctaves/shiftFrequencyByOctaves
- Browser AudioContext limit exhaustion issue
- Memory leaks from uncleaned audio nodes
- Svelte module compilation errors with $effect and $derived usage
- Unused utility functions (calculateFrequency, analyzeFrequencyPrecision, shiftFrequencyByOctaves)
- Build-time file generation scripts (now computed in-memory)
- Server-side data loading for chord data via
+page.server.tsand+layout.server.ts - Modular type system with dedicated type files:
Chord.tsfor chord and chord datum interfacesLink.tsfor navigation link typesNote.tsfor note type definitionsOscillator.tsfor oscillator state types
- LinkButton component replacing ButtonLink
- Server-side chord data processing with
chordsData.server.ts
- Data architecture refactored from client-side stores to server-side data loading
- Component naming: ButtonLink renamed to LinkButton
- Type organization: Split monolithic
types.tsinto individual type modules - CircleOfFifths component updated to use server-loaded chord data
- Error page updated for improved error handling
- Layout structure migrated from client-side to server-side
- Client-side chord store (
chordsStore.ts) - Monolithic types file (
types.ts) - PreFooter component (unused)
- ButtonLink component (replaced by LinkButton)
- Client-side layout file (
+layout.ts)
- Migrated from Svelte 4 to Svelte 5 with runes API
- Converted all components from Pug to native Svelte syntax
- Replaced pnpm with Bun as package manager
- Replaced ESLint/Prettier with Biome for formatting and linting
- Replaced Tailwind CSS/PostCSS with UnoCSS
- Upgraded all dependencies to latest versions (SvelteKit 2.x, Vite 6.x)
- Flattened component structure (removed atomic design hierarchy)
- Switched from Vitest/Playwright to Bun's native test runner
- CLAUDE.md for AI assistant guidance
- Biome configuration for code quality
- Vercel deployment configuration with security headers
- cspell configuration for spell checking
- Pug templating and dependencies
- ESLint, Prettier and their configuration files
- Playwright testing framework
- PostCSS and Tailwind CSS
- Nested component directory structure (atoms/molecules/organisms)
- Oscillator voice selection (sine, triangle, square, sawtooth)
- Visual feedback for active chord
- Circle of Fifths SVG visualization
- Updated default voice to sine wave
- Improved audio fade out to prevent clicks
- Initial release
- Basic Circle of Fifths implementation
- Web Audio API integration for chord playback
- Major and minor chord support
- Responsive design with Tailwind CSS