Skip to content

A completely rewritten version of the app, with lots of new features#73

Merged
clash82 merged 76 commits intomasterfrom
dev
Apr 19, 2026
Merged

A completely rewritten version of the app, with lots of new features#73
clash82 merged 76 commits intomasterfrom
dev

Conversation

@clash82
Copy link
Copy Markdown
Member

@clash82 clash82 commented Apr 17, 2026

No description provided.

@clash82 clash82 changed the title A completely rewritten version of the app, with lots of new features. A completely rewritten version of the app, with lots of new features Apr 17, 2026
clash82 and others added 28 commits April 19, 2026 22:18
- Updates the media query for .chapter-comp-selectors to stack
  selectors vertically on screens under 768px for better readability
  and tap area.
- Added \SearchControllerTest\ to reach 100% coverage on new search logic.
- Fixed premature script exit in \ResponseTrait\ by throwing an exception when run in PHPUnit.
- Added \public_html/sw.js\ to \sonar-project.properties\ exclusions.
… navigation & tests

- Add floating action buttons (note + compare) on verse hover
- Replace note icon with consistent fill='none' SVG
- Update app link format to bib://bookChapter:verse
- Reduce note preview threshold to 80 chars
- Refactor app.scss into 13 logical partials
- Replace chevron-right/down icons for translation groups
- Smaller comparison title font on mobile
- Add swipe gesture navigation in comparison view
- Unify translation selector across comparison grid
- Add verse.test.js and comparisonGrid.test.js
…ble fix

- fix: mobile header selector spacing - add padding-top to first row
  on viewports < 575px so TranslationSelector matches verse row margin
- feat: swap Search and Chapter Comparison on mobile
  * Navigator (header): Search icon replaces Chapter Comparison button
  * BottomNavigation: Chapter Comparison replaces Search button
  CSS Grid (5 equal columns) replaces flex layout for perfect centering
- feat: show full translation name instead of ID in notes
  * NotesPanel badge now resolves translationId -> full name via
    translations[] prop passed from Bible -> NotesPanel
  * Verse note-preview label also shows full name via Reader -> Verse chain
  * New prop translationName in Reader.js and Verse.js
- fix: hide More/Less toggle when note text is short enough
  Previous logic joined global+translation note with \n separator
  causing the separator itself to trigger expandable=true.
  Now each note (global, translation) is checked individually.
- ux: bottom nav center button shows book sigla + chapter (e.g. Rdz 4)
  Uses existing getSigla() with intl.locale for correct language abbreviation
  instead of full book name which caused layout shift
- i18n: add chapterComparisonShort key (PL: Porownaj, EN: Compare, DE: Vergleich)
  Used in BottomNavigation label to keep button text concise
- test: update verse.test.js testNotePreviewThreshold to match new
  two-argument isNoteExpandable logic with additional edge cases
- ChapterComparison component improvements (ComparisonGrid.js)
- SelectionGrid minor updates
- useScrollDirection, useSwipeNavigation, useVersesCache refinements
- _notes.scss style updates
- tests: navigation.test.js and notes.test.js updated test coverage
- Replace <div> with <button> in SelectionGrid and TranslationSelector for reliable mobile taps
- Replace <div> group labels with <button> in TranslationSelector (accessibility)
- Add full PropTypes validation to TranslationSelector
- Fix header spacing on Firefox/Brave (padding-bottom: 0.35rem instead of 0)
- Fix verse-actions hidden on Brave desktop (add max-width to media query)
- Reorganize bottom nav grid: compact arrows (44px), flexible center
- Add Zen Mode setting (disable hide-on-scroll navigation)
- Pin comparison header + primary translation (sticky on mobile)
- Fix ComparisonGrid PropTypes for bookId/chapterId (accept string|number)
- Add button CSS resets for .tile, .translation-item, .translation-group-label
This commit improves performance significantly on mobile platforms.

- Add React.memo to Reader and Navigator to prevent full re-renders on scroll
- Extract inline functions inside Bible render to useCallback
- Change 'isNextChapterAvailable' functions to boolean values for Navigator
- Extract inline styles in Verse.js to SCSS classes to reduce GC pressure
- Change handlePopState to avoid stale closures with changeSelectedChapter ref
- Add safety upper limit to LCS diff in ComparisonGrid to avoid freezing on very long verses
This commit updates React related packages to the latest stable
version and adapts the mounting method to use the concurrent
createRoot API.
…vices

- Prevent JS main thread blockage by terminating handleTouchMove
  loops in Verse early when long press is canceled.
- Stop evaluating touchEndX/Y on global touchmove in useSwipeNavigation
  if touchStartX is null (prevents running JS on every scroll pixel natively).
- Add will-change: transform to animated UI layout parts (bottom-nav,
  headers) moving their animations directly to the compositor layer to
  prevent huge repaints on scroll.
- Removed Backdrop-filter: blur(16px) on screens max-width: 991.98px for
  .comparison-overlay and .chapter-comp-overlay to massively reduce GPU load.
- Added has-fullscreen-overlay class to Body when opening SelectionGrid,
  ComparisonGrid, or ChapterComparison to hide <main>, header and .bottom-nav
  using content-visibility: hidden and opacity: 0.
- Applied content-visibility: auto to .tile, .comparison-box-secondary,
  .chapter-comp-row, and .chapter-comp-mobile-verse to improve scrolling
  and rendering performance of large lists.
- Set will-change: transform and replaced Box-shadow with Border-bottom for
  .comparison-pinned-area to reduce paint time during scroll on mobile devices.
… editor positioning

- Replace content-visibility:hidden with visibility:hidden + transition-delay
  for body.has-fullscreen-overlay to prevent blank screens when opening
  chapter selector or verse comparator on slower mobile devices
- Use faster fadeIn animation (0.15s) instead of slideUpFade (0.4s) on mobile
  for selection-overlay to reduce the gap between background hiding and
  overlay appearing
- Add missing dark mode text colors for chapter comparison title and
  translation selectors
- Fix note editor modal being clipped/shifted on mobile by:
  - Replacing left:50%/transform:translate(-50%,-50%) centering with
    inset:0/margin:auto (more reliable across mobile browsers)
  - Removing container padding from premium-modal mixin (children manage
    their own padding)
  - Adding box-sizing:border-box to note-editor-textarea
  - Removing duplicate .note-editor-modal definition from
    _translation-selector.scss that was overriding fixes
- disable already selected translations in comparison dropdowns
- collapse translation groups by default (except favorites)
- dynamic unpinning of primary verse box on mobile when too tall
- reduce comparison modal font sizes for mobile
- remove bottom nav labels for notes and comparison buttons
- narrow notes and comparison nav buttons
- increase notes form spacing
- soften dark mode text color for readability
- shorten back-to-books label to 'Wróć'
… positioning

- Add safeStorage module wrapping localStorage calls with try/catch
  to prevent SecurityError crashes in restricted environments
- Replace all direct localStorage access across components with
  safeLocalStorage wrappers (Bible, ChapterComparison, ComparisonGrid,
  FontSizeControl, Notes, SearchPanel, SideMenu, WelcomePopup,
  migrateOldNotes)
- Remove redundant try/catch blocks around safeLocalStorage calls
  in ComparisonGrid and SideMenu
- Service Worker: bump cache to v3, implement network-first strategy
  for JS/CSS assets to prevent stale bundles after deployment,
  add ignoreSearch fallback for cache matching
- Fix verse-actions tooltip clipping under sticky header for first
  verse: CSS :first-child rule with correct specificity forces
  actions below; JS updateActionsPlacement uses direct DOM classList
  manipulation (synchronous) instead of React setState (async)
- Wrap chapter index computation in useMemo (ChapterComparison)
- Add null check for #root container and try/catch for migrateOldNotes
  in app.js startup
- Bypass HTTPS redirect for 192.168.* in .htaccess (local dev)
- Remove outdated mobile-performance-review doc
- Add error.log to .gitignore
clash82 and others added 26 commits April 19, 2026 22:18
- Fixed ARIA roles and prop-types in UI components
- Refactored useFocusTrap and useKeyboardNavigation for stability
- Resolved test duplication logic and undefined checks
- Standardized duplicate selector suppression on generated CSS
- Add AboutModal.js component and assets/docs/about.txt content
- Add About button to SideMenu with i18n support (pl/en/de)
- Remove bookSigla.js (sigla logic moved to /books API endpoint)
- Add sigla.test.js unit tests
- Fix _notes.scss contrast for WCAG compliance
- Minor a11y and linting fixes in Reader, SearchPanel, SelectionGrid,
  TranslationSelector, WelcomePopup, and Bible
… results

- BookSelector.js, ChapterSelector.js: add missing PropTypes validation
- ChapterSelector.js: use optional chaining (chapters?.length)
- useVersesCache.js: use optional chaining (structure?.[book])
- WelcomePopup.js: suppress jsx-a11y warning on backdrop overlay div
- TranslationSelector.js: suppress jsx-a11y warnings on hover wrapper div
- Reader.js: suppress jsx-a11y warning on event-delegated main element
- Notes.js: suppress jsx-a11y warnings (role=button/dialog on li/div)
- SearchPanel.js: fix ghost click on mobile - tap on search result no
  longer triggers verse selection in Reader behind the panel
@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
1.5% Coverage on New Code (required ≥ 80%)
B Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@clash82 clash82 merged commit 20dca8d into master Apr 19, 2026
16 of 17 checks passed
@clash82 clash82 deleted the dev branch April 19, 2026 20:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants