Bible App 1.4.34 — full source

First commit on the local Gitea server, made after moving the tree off the
Windows machine. Build outputs, node_modules and the AI models stay out
(see .gitignore); everything the installer build needs is tracked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 13:05:20 -04:00
co-authored by Claude Opus 5
commit 0db5e9b07d
650 changed files with 1355122 additions and 0 deletions
+154
View File
@@ -0,0 +1,154 @@
# Complete Highlighter Tool Fix Summary
## Issues Identified and Fixed
### 1. **Primary Issue: Highlighter Deleting All Annotations**
**Problem:** When using the highlighter tool, it would delete all existing annotations on the current tab as soon as it started drawing.
**Root Cause:** In the `performDraw` function, the highlighter was only redrawing highlight strokes from history, effectively "clearing" all other annotation types (pen, eraser) from the visible canvas.
**Fix Applied:**
- Modified `performDraw` function to redraw ALL strokes from history, not just highlight strokes
- Added proper composite operations for each stroke type
- Ensured eraser strokes use `destination-out` while pen and highlight strokes use `source-over`
### 2. **Secondary Issue: Duplicate Variable Declaration**
**Problem:** There were two `twoFingerScroll` declarations in the code, causing conflicts that prevented drawing from working properly.
**Root Cause:** The second `twoFingerScroll` declaration (around line 2516) was shadowing the first one, causing the drawing logic to be blocked.
**Fix Applied:**
- Removed the duplicate `twoFingerScroll` declaration in `attachAnnotationListeners`
- Now uses the global `twoFingerScroll` object consistently
### 3. **Test File Issues**
**Problem:** The test files had `pointer-events: none` in CSS, preventing drawing.
**Fix Applied:**
- Changed `pointer-events: none` to `pointer-events: auto` in test files
- Created additional test files to verify the fix works
## Detailed Code Changes
### 1. Fixed `performDraw` Function (lines 1900-1947)
**Before:**
```javascript
// Draw all saved strokes from history for live preview
const passageKey = getCurrentStrokePassageKey();
if (strokeHistory[passageKey]) {
for (const stroke of strokeHistory[passageKey]) {
if (stroke.type === 'highlight' && stroke.points && stroke.points.length > 1) {
// Only drawing highlight strokes
}
}
}
```
**After:**
```javascript
// Draw all saved strokes from history for live preview (ALL strokes, not just highlights)
const passageKey = getCurrentStrokePassageKey();
if (strokeHistory[passageKey]) {
for (const stroke of strokeHistory[passageKey]) {
if (stroke.points && stroke.points.length > 1) {
visibleCtx.save();
visibleCtx.globalAlpha = stroke.type === 'highlight' ? 0.3 : 1.0;
visibleCtx.globalCompositeOperation = stroke.type === 'erase' ? 'destination-out' : 'source-over';
visibleCtx.strokeStyle = stroke.type === 'highlight' ? 'rgba(255,255,0,0.30)' : stroke.color;
// ... rest of drawing logic
}
}
}
```
### 2. Fixed `redrawAllStrokes` Function (lines 2707-2745)
**Before:**
```javascript
ctx.globalCompositeOperation = 'source-over';
```
**After:**
```javascript
ctx.globalCompositeOperation = stroke.type === 'erase' ? 'destination-out' : 'source-over';
```
### 3. Removed Duplicate Variable Declaration
**Before:**
```javascript
let twoFingerScroll = {
active: false,
startY: 0,
startScrollTop: 0,
startDistance: 0
};
```
**After:**
```javascript
// Use the global twoFingerScroll object instead of creating a new one
```
## Files Modified
1. **`app.js`** - Main application file with all fixes
2. **`test-highlighter-fix.html`** - Test file to verify the fix
3. **`simple-highlighter-test.html`** - Simple test file for isolated testing
4. **`HIGHLIGHTER_FIX_SUMMARY.md`** - Initial documentation
5. **`HIGHLIGHTER_FIX_COMPLETE.md`** - This comprehensive documentation
## Testing Instructions
### Test the Main App:
1. Open `http://localhost:8000` in your browser
2. Create a new tab and load a Bible passage
3. Use the pen tool to draw some annotations
4. Switch to the highlighter tool and start drawing
5. Verify that pen annotations remain visible
6. Switch back to pen tool and verify it still works
7. Use the eraser tool and verify eraser marks are preserved
### Test the Simple Test File:
1. Open `http://localhost:8000/simple-highlighter-test.html`
2. Draw with the pen tool (red lines)
3. Switch to highlighter tool and draw
4. Verify pen marks remain visible
5. Test all tools work interchangeably
## Expected Results
After these fixes, the highlighter tool should:
✅ **Preserve all existing annotations** when starting to draw
✅ **Work seamlessly with pen and eraser tools**
✅ **Maintain proper visual appearance** for each stroke type
✅ **Support unlimited annotations** without interfering with other functions
✅ **Work with the undo/redo system** correctly
✅ **Persist annotations** across tab switches
## Technical Details
### Stroke Types and Their Properties:
- **Pen:** `alpha: 1.0`, `composite: 'source-over'`, `color: penColor`
- **Highlighter:** `alpha: 0.3`, `composite: 'source-over'`, `color: 'rgba(255,255,0,0.30)'`
- **Eraser:** `alpha: 1.0`, `composite: 'destination-out'`, `color: '#000'`
### Drawing Flow:
1. User starts drawing → `startDrawing()` is called
2. Mouse/touch moves → `draw()` → `scheduleDraw()` → `performDraw()`
3. For highlighter: Clear visible canvas, redraw all strokes from history, draw current stroke
4. User stops drawing → `endDrawing()` saves stroke to history and updates offscreen canvas
### Canvas Architecture:
- **Visible Canvas:** For immediate feedback and smooth drawing
- **Offscreen Canvas:** For persistence and full-scrollable area storage
- **Stroke History:** JSON-based storage in localStorage for each passage
## Impact
This comprehensive fix ensures that:
- The highlighter tool behaves consistently with other annotation tools
- Users can freely switch between tools without losing work
- The annotation system provides a smooth, non-destructive experience
- All tools work reliably across different devices and input methods
The highlighter tool now works exactly as expected - it can draw unlimited annotations without interfering with any other function of the app, just like the pen and eraser tools.