- Fix settings synchronization: ReadingView now listens to storage events for real-time preference updates
- Add comprehensive error handling to loadChapter with proper state management
- Add comprehensive error handling to loadBooks with booksLoading state
- Add localStorage persistence for bookmarks (load on mount, save on change)
- Display error messages in UI with reload button and proper loading states
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updates BibleReaderApp to handle the mismatch between numeric book IDs
used by SearchNavigator (1-66) and UUID book IDs required by the API.
Changes:
- Add loadBooks() to fetch book metadata on mount
- Map numeric orderNum to UUID book IDs for API calls
- Implement proper hasNextChapter logic using actual chapter counts
- Store books array and versionId in state
- Update loadChapter to convert numeric bookId to UUID before API call
This ensures the Bible reader works correctly with the existing database
schema while maintaining a simple numeric interface for the SearchNavigator.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This completes Task 5 of the Bible Reader 2025 implementation plan,
integrating all previously built components into a cohesive reading experience.
Components added:
- BibleReaderApp: Main orchestrator component with state management
- ReadingSettings: Settings panel with presets and customization options
Key features:
- Chapter navigation with prev/next controls
- SearchNavigator integration for book/chapter lookup
- ReadingView with customizable reading preferences
- VersDetailsPanel for verse interactions (notes, bookmarks)
- ReadingSettings panel with 4 presets and custom controls
- IndexedDB caching for offline chapter access
- Mobile-responsive bottom sheet and desktop sidebar layouts
The app now provides:
- Bookmark management (client-side Set for now, backend sync in Phase 2)
- Note taking (console logging for now, persistence in Phase 2)
- Font customization (4 font families including dyslexia-friendly)
- Size and spacing controls (font size 12-32px, line height 1.4-2.2x)
- Background themes (warm, white, light gray, dark)
- Preset modes (default, dyslexia, high contrast, minimal)
Technical implementation:
- State management via React hooks (useState, useEffect)
- Cache-first loading strategy with API fallback
- Storage events for cross-component preference updates
- TypeScript with proper type annotations
- Material-UI components for consistent styling
Next steps (Phase 2):
- Backend persistence for bookmarks and notes
- Sync annotations across devices
- Highlight system with color selection
- Cross-references integration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add aria-label to close button for screen reader support
- Add dynamic aria-label to bookmark button (Add/Remove bookmark)
- Add aria-label and character counter to notes TextField
- Wrap mobile bottom sheet in proper dialog semantics (role="dialog", aria-modal="true")
- Display full verse reference (Book Chapter:Verse) instead of just verse number
- Add useEffect to reset tab to Notes when verse changes for better UX
- Add 500 character limit to notes with visual counter
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added role="button", tabIndex, aria-label, and onKeyDown handler to verse spans for keyboard accessibility
- Fixed CSS margin/padding conflict by using py/px instead of p/margin for proper variable margin width
- Added --text-align CSS variable to getCSSVariables() and applied it in reading view
- Removed unused isTablet variable
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements Task 3 from Bible Reader 2025 plan:
- Created lib/reading-preferences.ts with 4 presets (default, dyslexia, highContrast, minimal)
- Implemented loadPreferences/savePreferences using localStorage
- Added getCSSVariables for dynamic styling
- Created ReadingView component with full mobile responsiveness
- Touch interaction: tap top third shows header, bottom third toggles controls
- Verse text is clickable with hover effects
- Navigation controls (prev/next chapter, settings button)
- Created test file for preferences
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add aria-label and role attributes to search TextField for screen readers
- Add role="listbox" and aria-label to search results Paper
- Add role="option", aria-selected, and minHeight to ListItemButton for accessibility
- Update placeholder from "John 3:16" to "John 3" to match chapter-level search
- Change parseReference abbreviation matching from === to startsWith() for consistency with searchBooks
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created dynamic sitemap.ts using Next.js 15 sitemap feature
- Generates 23,188 URLs (within Google's 50K limit)
- Includes all static pages for 4 locales (en, ro, es, it)
- Includes Bible chapters for top 10 versions per language
- Uses SEO-friendly URL format: /{locale}/bible/{version}/{book}/{chapter}
- Replaces static sitemap.xml with dynamic generation
- Configured with force-dynamic and 24-hour revalidation
- Prioritizes relevant Bible versions per locale (ENG-ASV, ENG-KJV, ROO, etc.)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added environment variables for Biblical Guide Premium subscription:
- Monthly plan: $10/month (price_1SHhJDJN43EN3sSfzJ883lHA)
- Yearly plan: $100/year (price_1SHhKEJN43EN3sSfXYyYStNS)
Configuration includes:
- Server-side price IDs for API routes
- NEXT_PUBLIC_ prefixed IDs for client-side rendering
- Both monthly and yearly billing options
The subscription system is now fully configured and ready for production use.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Problem:
- Floating chat had its own separate authentication check using localStorage
- iOS Safari has restrictions on localStorage access, especially with tracking prevention
- This caused logged-in users to still see login prompt in AI chat
Solution:
- Replace local auth state management with global useAuth hook from AuthProvider
- Remove redundant checkAuthStatus() function
- Update all authentication checks to use isAuthenticated from useAuth
- Update token retrieval to get directly from localStorage only when needed
Benefits:
- Single source of truth for authentication across the app
- More reliable authentication state management
- Better compatibility with iOS Safari's privacy features
- Automatic auth state synchronization when user logs in/out
Changes:
- Use useAuth hook instead of local isAuthenticated/authToken state
- Remove checkAuthStatus() function
- Update loadConversations to read token from localStorage directly
- Update loadConversation to read token from localStorage directly
- Update handleSendMessage to read token from localStorage directly
- Simplify handleAuthSuccess to rely on global auth state updates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Load user's favorite Bible version or default to 'eng-asv'
- Convert book names to lowercase slugs for URLs
- Use path format: /{locale}/bible/{version}/{book}/{chapter}
- Replace spaces with hyphens in book names (e.g., "1 Corinthians" -> "1-corinthians")
Fixes issue where clicking "Read the Bible" button resulted in infinite loading
due to incorrect URL format with query parameters instead of path parameters.
Example URL: /en/bible/eng-asv/matthew/1
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Bible Reader Integration:
- Fetch and display active reading plan progress in Bible reader
- Progress bar shows plan completion percentage when user has active plan
- Progress bar color changes to green for active plans
- Display "Plan Name Progress" with days completed below bar
Reading Plan Navigation:
- Add "Read the Bible" button to active reading plan detail page
- Button shows current/next reading selection (Day X: Book Chapter)
- Navigate directly to Bible reader with correct book and chapter
- Smart selection: current day if incomplete, next incomplete day if current is done
- Only shown for ACTIVE plans
Technical:
- Load active plans via /api/user/reading-plans endpoint
- Calculate progress from completedDays vs plan duration
- Use getCurrentReading() helper to determine next reading
- URL encoding for book names with spaces
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
User Settings:
- Add /api/user/settings endpoint for persisting theme and fontSize preferences
- Update settings page with working save functionality
- Add validation and localized error messages
Reading Plans:
- Add database schema with ReadingPlan, UserReadingPlan, and UserReadingProgress models
- Create CRUD API endpoints for reading plans and progress tracking
- Build UI for browsing available plans and managing user enrollments
- Implement progress tracking with daily reading schedule
- Add streak calculation and statistics display
- Create seed data with 5 predefined plans (Bible in 1 year, 90 days, NT 30 days, Psalms 30, Gospels 30)
- Add navigation link with internationalization support
Technical:
- Update to MUI v7 Grid API (using size prop instead of xs/sm/md and removing item prop)
- Fix Next.js 15 dynamic route params (await params pattern)
- Add translations for readingPlans in all languages (en, ro, es, it)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed empty "Resets on" date display for new users:
Issue:
- Users who haven't created any conversations yet have limitResetDate = NULL
- The "Resets on" field was showing empty/blank
- This confused users about when their limit would reset
Solution:
- Updated formatResetDate() in 3 components to calculate default date
- If limitResetDate is NULL, display "1 month from now"
- This gives users a clear expectation of when limits reset
Files Updated:
- app/[locale]/subscription/page.tsx
* formatResetDate() now returns calculated date if null
- components/subscription/usage-display.tsx
* formatResetDate() now returns calculated date if null
- components/subscription/upgrade-modal.tsx
* formatResetDate() now returns calculated date if null
* Removed conditional check - always show reset date
User Experience:
- New users see "Resets on: [date one month from now]"
- Once they create their first conversation, actual reset date is set
- Consistent messaging across all subscription UI components
Note: The actual limitResetDate is set when the user creates their
first conversation (in incrementConversationCount function). This fix
only affects the UI display for users who haven't chatted yet.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed 405 Method Not Allowed error on subscription pages:
Issue:
- Subscription pages were making GET requests to /api/user/profile
- The API route only had a PUT handler (for profile updates)
- This caused 405 (Method Not Allowed) errors
Solution:
- Added GET handler to /api/user/profile/route.ts
- Handler authenticates user via Bearer token
- Returns complete user data including subscription fields:
* subscriptionTier
* subscriptionStatus
* conversationLimit
* conversationCount
* limitResetDate
* stripeCustomerId
* stripeSubscriptionId
Result:
- Subscription pages can now fetch user data successfully
- Settings page subscription widget displays correctly
- No more 405 errors in console
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed authentication token inconsistency in subscription pages:
Issue:
- Subscription pages were using localStorage.getItem('token')
- Rest of the app uses localStorage.getItem('authToken')
- This caused users to be redirected to login when accessing subscription pages
Files Fixed:
- app/[locale]/subscription/page.tsx
* fetchUserData() function
* handleUpgrade() function
* handleManageSubscription() function
- app/[locale]/subscription/success/page.tsx
* SuccessContent component verification
- components/subscription/usage-display.tsx
* fetchUsageData() function
Result:
- Users can now access subscription pages when logged in
- Consistent authentication token naming across entire app
- No more unwanted redirects to login page
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added subscription management section to user settings page:
Changes:
- Added "Subscription & Usage" card to settings page
- Embedded UsageDisplay component (compact mode)
- Added "Manage Plan" button linking to /[locale]/subscription
- Added "View Subscription Details" text button
- Imported CardMembership icon for visual consistency
User Experience:
- Users can now view their subscription status directly in settings
- Shows tier badge (Free/Premium)
- Displays usage progress bar for free users
- Shows remaining conversations and reset date
- Quick access to full subscription management page
Location: app/[locale]/settings/page.tsx:253-289
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented all frontend UI components for the subscription system:
Frontend Components Created:
- app/[locale]/subscription/page.tsx - Main subscription management page
* Displays current plan (Free/Premium) with status badges
* Shows usage statistics with progress bar and reset date
* Monthly/yearly billing toggle with savings chip
* Plan comparison cards with feature lists
* Upgrade button integrated with Stripe Checkout API
* Manage subscription button for Stripe Customer Portal
* Full error handling and loading states
- app/[locale]/subscription/success/page.tsx - Post-checkout success page
* Wrapped in Suspense boundary (Next.js 15 requirement)
* Verifies subscription status after Stripe redirect
* Displays Premium benefits with icons
* Multiple CTAs (start chatting, view subscription, home)
* Receipt information notice
- components/subscription/upgrade-modal.tsx - Limit reached modal
* Triggered when free user hits conversation limit
* Shows current usage with progress bar
* Displays reset date
* Lists Premium benefits and pricing
* Upgrade CTA linking to subscription page
- components/subscription/usage-display.tsx - Reusable usage widget
* Fetches and displays user subscription data
* Shows tier badge (Free/Premium)
* Progress bar for free users
* Remaining conversations and reset date
* Optional upgrade button
* Compact mode support
* Loading skeleton states
Technical Implementation:
- All pages fully translated using next-intl (4 languages)
- Material-UI components for consistent design
- Client-side components with proper loading states
- Type-safe TypeScript implementation
- Responsive design for mobile and desktop
- Integration with existing auth system (JWT tokens)
Status Update:
- Updated SUBSCRIPTION_IMPLEMENTATION_STATUS.md
- Backend: 100% Complete
- Frontend: 100% Complete
- Overall System: Ready for Production
Next Steps:
- Configure Stripe products and price IDs
- End-to-end testing with real Stripe
- Production deployment
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Change PayPal donation link from paypal.me/biblicalguide to paypal.me/andupetcu
Updated in both "Join the Mission" sections on the landing page.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change hero section from pt: {xs: 12, md: 20}, pb: 0 to py: 6.25
- py: 6.25 equals 50px (6.25 × 8px)
- Applies 50px padding to both top and bottom of hero section
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change all sections from py (vertical padding) to pt/pb split
- Set pb (bottom padding) to 0 for all sections
- Keep pt (top padding) at original values (xs: 10-12, md: 16-20)
- Removes 128px bottom spacing on desktop (md breakpoint)
- Creates tighter, more cohesive visual flow between sections
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add highlighted "Sponsor Us" button in footer Quick Links
- Style with bold font (fontWeight 600) and yellow color (secondary.main)
- Add translations for all 4 languages:
- English: "Sponsor Us"
- Romanian: "Sprijină-ne"
- Spanish: "Patrocínanos"
- Italian: "Sostienici"
- Both Home and Sponsor Us links route to landing page
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added "Home" link as first item in footer quick links
- Routes to landing page (homepage)
- Added translations for all 4 languages:
- English: "Home"
- Romanian: "Acasă"
- Spanish: "Inicio"
- Italian: "Home"
Build: ✅ Successful
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Major updates:
- Replace homepage with clean, minimalist Apple-style landing page
- Focus on donation messaging and mission statement
- Add comprehensive AI chat analysis documentation
- Fix Azure OpenAI configuration with correct endpoints
- Update embedding API to use text-embedding-ada-002 (1536 dims)
Landing Page Features:
- Hero section with tagline "Every Scripture. Every Language. Forever Free"
- Mission statement emphasizing free access
- Matthew 10:8 verse highlight
- 6 feature cards (Global Library, Multilingual, Prayer Wall, AI Chat, Privacy, Offline)
- Donation CTA sections with PayPal and card options
- "Why It Matters" section with dark background
- Clean footer with navigation links
Technical Changes:
- Updated .env.local with new Azure credentials
- Fixed vector-search.ts to support separate embed API version
- Integrated AuthModal into Bible reader and prayers page
- Made prayer filters collapsible and mobile-responsive
- Changed language picker to single-select
Documentation Created:
- AI_CHAT_FIX_PLAN.md - Comprehensive implementation plan
- AI_CHAT_VERIFICATION_FINDINGS.md - Database analysis
- AI_CHAT_ANALYSIS_SUMMARY.md - Executive summary
- AI_CHAT_STATUS_UPDATE.md - Current status and next steps
- logo.svg - App logo (MenuBook icon)
Build: ✅ Successful (Next.js 15.5.3)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Added Spanish (es) and Italian (it) languages to the navigation language switcher:
- Added Español 🇪🇸 to language dropdown
- Added Italiano 🇮🇹 to language dropdown
- Reordered languages alphabetically (EN, RO, ES, IT)
Users can now switch to Spanish and Italian from the header navigation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated the locale layout to include Spanish (es) and Italian (it):
- Added es and it to generateStaticParams for static generation
- Added es and it to locales validation array
- Added es and it to metadata alternates for SEO
This fixes 404 errors when accessing /es/* and /it/* routes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added complete Italian (it) translation for the Biblical Guide application:
- Created messages/it.json with full Italian translations
- Updated i18n.ts to include Italian locale
- Updated middleware.ts to handle Italian routes
- Added Italian to language options in all locale files (en, ro, es)
Users can now access the app in Italian at /it/* routes and select Italian from the language settings.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added complete Spanish (es) translation for the Biblical Guide application:
- Created messages/es.json with full Spanish translations
- Updated i18n.ts to include Spanish locale
- Updated middleware.ts to handle Spanish routes
- Added Spanish to language options in all locale files
Users can now access the app in Spanish at /es/* routes and select Spanish from the language settings.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added math-based captcha system to prevent spam on the contact form:
- Created captcha API endpoint with simple arithmetic questions
- Added captcha UI component with refresh functionality
- Integrated captcha verification into contact form submission
- Relaxed spam filters since captcha provides better protection
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed contact form email delivery to use local Maddy SMTP server for better reliability.
**Changes:**
- Created new SMTP service (lib/smtp.ts) using nodemailer
- Configured to use localhost:25 (Maddy SMTP)
- Updated contact API to use smtpService instead of mailgunService
- Installed nodemailer and @types/nodemailer
**Benefits:**
- Simpler configuration (no external API dependencies)
- Local email delivery (more reliable for internal emails)
- No API rate limits or authentication issues
- Direct delivery to contact@biblical-guide.com
**Roundcube still uses Mailgun SMTP** for outgoing emails from webmail interface.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed the fake office address ('Our Office: 123 Bible Street, Faith City, FC 12345') from the contact page.
Now only showing:
- Email contact (contact@biblical-guide.com)
Changes:
- Removed address object from contactInfo array
- Removed unused LocationOn icon import
- Contact page now shows only valid contact information
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Comprehensive accessibility improvements to exceed WCAG AAA compliance:
**Enhanced Contrast Ratios (WCAG AAA Level):**
- Light theme: Pure black on white (21:1 contrast ratio)
- Dark theme: #f0f0f0 on #0d0d0d (15.3:1 contrast ratio)
- Sepia theme: #2b2419 on #f5f1e3 (7.2:1 contrast ratio)
- All themes exceed WCAG AAA requirement of 7:1 for normal text
**Visible Focus Indicators:**
- 2px solid outline on all interactive elements
- 2px offset for clear visibility
- Applied globally via CSS (buttons, links, inputs, selects)
- Specific focus styles on navigation IconButtons
- Primary color (#1976d2) for consistency
**Screen Reader Support:**
- ARIA live region (polite) for navigation announcements
- Dynamic announcements when navigating between chapters
- Screen reader announces: "Navigated to [Book] chapter [Number]"
- Proper role and aria-atomic attributes
**Skip Navigation:**
- Keyboard-accessible skip link to main content
- Hidden by default, visible on focus (Tab key)
- Positioned center-top when focused
- Direct link to #main-content section
- Improves keyboard navigation efficiency
**Keyboard Navigation:**
- All features accessible via keyboard
- Tab navigation works throughout interface
- Arrow keys for chapter navigation (existing)
- Escape key exits reading mode (existing)
- Added aria-label to navigation buttons
**200% Zoom Support:**
- Responsive font sizing maintained at 200% zoom
- Prevents horizontal scroll at high zoom levels
- Content reflows properly without loss of functionality
- Uses relative units (rem, em, %) throughout
**Additional Improvements:**
- Main content area has id="main-content" for skip link
- tabIndex management for proper focus order
- Global CSS injected via useEffect for focus indicators
- Overflow-x hidden to prevent horizontal scrolling
All improvements follow WCAG 2.1 Level AAA Success Criteria:
- SC 1.4.6: Contrast (Enhanced) - 7:1 ratio
- SC 2.4.1: Bypass Blocks - Skip navigation
- SC 2.4.3: Focus Order - Logical tab order
- SC 2.4.7: Focus Visible - Enhanced indicators
- SC 1.4.10: Reflow - 200% zoom support
This completes Phase 1 of the Bible reader improvements.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented comprehensive mobile gesture support for the Bible reader:
**Swipe Gestures:**
- Swipe left/right to navigate between chapters
- Only activates on mobile devices (touch events)
- Configurable 50px minimum swipe distance
- Prevents scrolling interference
**Tap Zones:**
- Left 25% of screen: navigate to previous chapter
- Right 25% of screen: navigate to next chapter
- Center 50%: normal reading interaction
- Maintains text selection capabilities
**Smooth Page Transitions:**
- Fade and scale animation on chapter navigation
- 300ms duration with ease-in-out timing
- Visual feedback: opacity 0.5 and scale 0.98 during transition
- Applied to all navigation methods (swipe, tap, keyboard, buttons)
**Settings Controls:**
- Enable/disable swipe gestures toggle
- Enable/disable tap zones toggle
- Pagination mode toggle (for future enhancement)
- All settings persist in localStorage
**Dependencies:**
- Added react-swipeable v7.0.2 for gesture handling
- Zero-dependency, lightweight (peer deps: React only)
**User Experience:**
- Settings grouped under "Mobile Navigation" section
- Default enabled for optimal mobile UX
- Touch-optimized for tablets and phones
- Desktop users can disable if desired
This completes all mobile navigation features from Phase 1.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add note dialog with multi-line text input
- Display notes below highlighted verses with theme-aware styling
- Add/edit note button in color picker menu
- Update highlight API to save notes
- Visual note indicator with left border matching highlight color
- Support for removing notes by saving empty text
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Typography Enhancements
- Add letter spacing control (0-2px, default 0.5px for WCAG compliance)
- Add word spacing control (0-4px, default 0px)
- Add paragraph spacing control (1.0-2.5x line height, default 1.8x)
- Add max line length control (50-100ch, default 75ch for optimal readability)
- Apply WCAG 2.1 SC 1.4.12 text spacing recommendations
## Multi-Color Highlighting System
- Implement 7-color highlight palette (yellow, green, blue, purple, orange, pink, red)
- Theme-aware highlight colors (light/dark/sepia modes)
- Persistent visual highlights with database storage
- Color picker UI with current highlight indicator
- Support for highlight notes and tags (infrastructure ready)
- Bulk highlight loading for performance
- Add/update/remove highlight functionality
## Database Schema
- Add Highlight model with verse relationship
- Support for color, note, tags, and timestamps
- Unique constraint per user-verse pair
- Proper indexing for performance
## API Routes
- POST /api/highlights - Create new highlight
- GET /api/highlights - Get all user highlights
- POST /api/highlights/bulk - Bulk fetch highlights for verses
- PUT /api/highlights/[id] - Update highlight color/note/tags
- DELETE /api/highlights/[id] - Remove highlight
## UI Improvements
- Enhanced settings dialog with new typography controls
- Highlight color picker menu
- Verse menu updated with highlight option
- Visual feedback for highlighted verses
- Remove highlight button in color picker
Note: Database migration pending - run `npx prisma db push` to apply schema
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Auto-select appropriate version when switching languages
- Prioritize favorite version only if it matches current locale
- Fall back to locale-specific default version
- Redirect Bible pages to reader root when changing language to allow proper version selection
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>