1412 Commits

Author SHA1 Message Date
Rajarshee Chatterjee ae8d055689 perf: Limit Chapter Neighbor Queries To One Row
Lint / ESLint (push) Has been cancelled
Tests / Jest (push) Has been cancelled
Type Check / TypeScript (push) Has been cancelled
2026-09-26 20:43:28 +05:30
trietng 1607f80a0a feat: Add Volume Button Navigation and Slide Animation Settings for Paged Reading (#2058)
* feat: volume navigation and disable animation settings for paged reading

* fix: transition style removal

* fix: pageReader incorrect initialization

* fix: remove unneeded check

* chore: update Vietnamese translations for paged reading settings
2026-09-26 20:40:43 +05:30
github-actions[bot] a0c20e209c chore: Release v2.1.4 v2.1.4 2026-09-26 07:14:58 +00:00
Rajarshee Chatterjee 648477931b feat: Add Version and Build Information to Error Fallback 2026-09-26 11:05:34 +05:30
Palloxin e42e8f66f2 fix: Improve Code Editor Newline Regex (#2021)
* Code Editor, New Lines regex improvement

* Update SimpleCodeEditor.tsx
2026-09-25 11:15:13 +05:30
Palloxin de5358727a fix: Restore Broken Preview to Previous State (#2004)
* Fix broken preview

* Optimized base64 image (reduced)

* fix image base64
2026-09-25 11:06:24 +05:30
Rajarshee Chatterjee 706459783f feat: Add Optional Continue Reading Buttons To Library 2026-09-23 18:55:51 +05:30
Patrick Loser 1ca9a679cf perf: Optimize Background Task Memory Usage and Lifecycle Management (#2059)
* fix: bound background task memory usage

* Fix background task cancellation and updates

* Update TaskActionReceiver.kt
2026-09-23 18:41:50 +05:30
Rajarshee Chatterjee 920f88aee4 fix: Resolve Jest CI Failures 2026-09-23 12:08:49 +05:30
Rajarshee Chatterjee cef3ae5bdf feat: Polish Statistics Screen Layout 2026-09-23 11:53:50 +05:30
Rajarshee Chatterjee 39c788e576 feat: Improve Genre Taxonomy Screen UX 2026-09-23 11:26:21 +05:30
Rajarshee Chatterjee d40713ac99 feat: Improve Custom Code UX 2026-09-23 10:41:38 +05:30
Rajarshee Chatterjee f53bed7190 chore: Update Translations (#1981)
* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* fix: Restore Overwritten Locale Translations

* New translations strings.json (Romanian)

[ci skip]
[ci skip]

* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* fix: Restore Overwritten Locale Translations
2026-09-22 10:06:03 +05:30
Rajarshee Chatterjee 0b9c415681 fix: Prevent Chapter Drawer Blank Flash On Open (Closes #2038) (#2048)
Opening the reader's chapter drawer flashed an empty panel before the
chapter list appeared, most visibly on slower devices.

Three things combined to cause it:

- The panel carried `backgroundColor: 'transparent'`, which overrode the
  opaque default `react-native-drawer-layout` applies to its own
  `styles.drawer`. Since `drawerStyle` is applied last in the panel's
  style array, the panel had no background at all, so the reader showed
  through it for every frame before the content painted. It now carries
  the drawer's own `theme.surface`, matching what the content already
  paints, so the panel is opaque from the first frame.

- The chapter list was mounted by the same handler that opened the
  drawer, so the slide-in animation (UI thread) ran while the list was
  still mounting and measuring (JS thread). The list is now mounted once
  the chapter has loaded and interactions have settled, before the
  drawer is first opened. A closed panel stays laid out -- it is only
  translated off-screen -- so the list measures and renders its first
  rows out of sight instead of during the animation.

- When the list mounted after the chapters arrived, it was scrolled to
  the current chapter with an animation even though `initialScrollIndex`
  had already placed it there, adding a second visible jump. That scroll
  is now skipped on the initial mount and kept for later chapter
  changes.


Claude-Session: https://claude.ai/code/session_01Et1ihq4SBUhfvxgWJisHTe

Co-authored-by: Claude <noreply@anthropic.com>
2026-09-22 09:15:02 +05:30
Rajarshee Chatterjee 38003c59e0 fix: Stop Bottom Nav Icons Trembling On Tab Press (Closes #2041) (#2047)
The focused tab indicator animated `width` directly, which triggered layout every frame — Yoga's per-node pixel rounding then shifted the icon and label inconsistently as the width swept through fractional values, causing a visible tremble. Fixed by giving the icon a fixed-size box and animating the indicator via `scaleX` on an absolutely positioned sibling instead, since transforms don't trigger layout.
2026-09-22 08:23:58 +05:30
Rajarshee Chatterjee f1119d8c30 feat: Add Always Ask Category Selection (Closes #537) 2026-09-16 10:14:29 +05:30
Rajarshee Chatterjee a5e2b4d4f0 feat: Add Crash Log Collection And Sharing (Closes #11) 2026-09-15 14:16:51 +05:30
Rajarshee Chatterjee a12cba030d fix: Skip Dash-Only TTS Dividers 2026-09-15 13:38:39 +05:30
Rajarshee Chatterjee 56d1140aad chore: Require Issue Templates 2026-09-14 08:44:15 +05:30
Rajarshee Chatterjee 0379141304 feat: Add Individual Task Cancellation (Closes #1985) 2026-09-11 18:41:51 +05:30
Rajarshee Chatterjee b6e9f7157d chore: Rename Feature Request Label 2026-09-08 07:03:28 +05:30
Rajarshee Chatterjee edb3df719f fix: Repair Invalid Default Category Names (Closes #2031) 2026-09-07 22:25:31 +05:30
Rajarshee Chatterjee 9bde3df74d fix: Prevent Novel Screen Empty State Flash (Closes #2034) 2026-09-07 21:13:47 +05:30
Rajarshee Chatterjee 2426e6fe3e chore: Lowercase Issue Template Labels 2026-09-07 20:49:59 +05:30
Rajarshee Chatterjee 93209abebd fix: Make Backup Restore Non-Destructive (Closes #2026) 2026-09-07 20:43:20 +05:30
Claude 158786ccd5 fix: Prevent Crash in parseChapterNumber When Chapter or Novel Name Is Missing
Guards against undefined/null chapterName and novelName so
parseChapterNumber no longer throws "Cannot read property
'toLowerCase' of undefined" when rendering the Updates screen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011WW3AHpNPxoRVsbAMVRX6T
2026-09-02 19:15:46 +00:00
Patrick Loser 77be5624f2 feat: Add URL Novel Search and Intent-Based Novel Opening (#1987)
* Add native share intent handling module

* Handle shared URLs via intent handler

* i18n: add global search and novel error strings

Generated with omp (AI coding agent)

* novel store: track bootstrap failures as user-facing errors

Bootstrap failures no longer surface raw plugin/DB errors; missing novels map to a custom not-found message. Generated with omp (AI coding agent)

* novel screen: render error view when bootstrap fails

Shows a custom error with a back action instead of a blank screen, and hides the appbar actions in the error state. Generated with omp (AI coding agent)

* global search: never auto-navigate or search URL text

URLs are handled by the screen's explicit submit flow; navigation and search stay out of the hook. Generated with omp (AI coding agent)

* global search: add animated open-novel FAB with clipboard offer

Submit or FAB tap opens a matching URL's novel; unmatched URLs toast. The FAB floats above the keyboard via keyboard-controller and slides in from the right. Generated with omp (AI coding agent)

* fix review issues

* fix rebase issue
2026-09-01 18:59:32 +05:30
Rajarshee Chatterjee 4b580c90ef fix: Prevent TTS From Speaking Surrounding Quotes (Closes #2008) 2026-08-29 11:41:59 +05:30
github-actions[bot] cb1a5d9e82 chore: Release v2.1.3 v2.1.3 2026-08-22 06:13:17 +00:00
Mohammad 7e20f7dccb feat: Increase Maximum Reader Text Size from 20 to 50 (#1998)
Increased maximum text size limit in Reader component, and settings page
2026-08-22 08:55:41 +05:30
Rajarshee Chatterjee 0fab0143b1 fix: Prevent Large EPUB Stalls And Optimize Imports
Closes #1932
Closes #2005
2026-08-22 08:41:48 +05:30
Rajarshee Chatterjee 5a0717d2c7 fix: Prevent Duplicate TTS Text From Nested Formatting (Closes #1994) 2026-08-18 11:50:06 +05:30
Patrick Loser 09652f9962 fix: Refetch Library After Category Update (#1988)
Add tests covering NovelScreenButtonGroup category assignment
flows to ensure the library is refreshed and the novel state
is updated when needed.
2026-08-18 09:28:07 +05:30
Rajarshee Chatterjee eef58f212f fix: Support Namespace-Prefixed EPUB Imports 2026-08-17 21:16:29 +05:30
Rajarshee Chatterjee 523aa90c19 fix: Include Novel Covers In Library Backups (Closes #1983) 2026-08-16 12:48:54 +05:30
Ahjie521 eb310f7821 feat: Add Empty Chapter Refresh in Reader (#1978)
* feat(reader): swipe down to re-fetch a chapter, never cache empty responses

- pull down at the top of a chapter to re-fetch it, recovering from
  transient empty responses without leaving the reader
- empty responses are evicted from the chapter cache so a refresh
  re-fetches instead of replaying the empty message
- add a refresh button to the reader's bottom bar and a 'Refresh
  chapter' link on the empty-chapter message
- register the typescript-eslint plugin and ignore assets/ in the
  eslint flat config so lint-staged can lint core.js

* feat(reader): move refresh option to appbar menu
2026-08-16 07:36:41 +05:30
Patrick Loser af2a224781 fix: Novel Screen Scroll Lag, Source Pagination Stalls, and Skeleton Overlap (#1971)
* fix

* Update pnpm-lock.yaml

* fix tests
2026-08-16 07:34:17 +05:30
Rajarshee Chatterjee 990cd4f2eb fix: Upgrade WorkManager for Repeated Library Updates (Closes #1972) 2026-08-11 15:58:51 +05:30
Rajarshee Chatterjee 3ac611f633 fix: Normalize EPUB SVG Images in Nitro Module (Closes #1622) 2026-08-11 14:51:50 +05:30
Rajarshee Chatterjee 909504a721 feat: Add Repository Enable And Disable Controls (Closes #1628) 2026-08-11 13:50:25 +05:30
Rajarshee Chatterjee 63349de1bb fix: Select All Chapters Across Lazy-Loaded Batches (Closes #1960) 2026-08-11 11:58:18 +05:30
Rajarshee Chatterjee c6679b7f41 fix: Draw Content Behind Android Navigation Bar (Closes #1260) 2026-08-11 11:53:03 +05:30
Ahjie521 15560b67b1 fix: Pass Plugin imageRequestInit Headers to Novel Detail Cover (#1977)
The novel detail header rendered its cover with a bare { uri } source,
so plugins whose cover CDN requires request headers (e.g. RanobeLib's
cover.cdnlibs.org, which 403s without a Referer) showed no cover on the
novel detail screen even though covers worked in browse/library lists.

Mirror the LibraryListView pattern: fetch getPlugin(novel.pluginId)?
.imageRequestInit and attach its headers to the cover source.
2026-08-11 08:26:12 +05:30
Alvan Noah 7883b28cd9 fix: Stop TTS During Incoming and Outgoing Phone Calls (#1976)
fix: TTS continues playing during incoming and outgoing phone calls

Implement audio focus handling for TTS playback on Android, including support for request and abandonment during playback and transient interruptions.

Closes #1975
2026-08-11 08:01:55 +05:30
Patrick Loser 64707409bb feat: Create Dedicated Custom Code Settings Page V2 (#1902)
* init

* text modification without webview rerender

* Fix SettingsReaderScreen

* remove unneeded

* solve ts issue

* add tests

* Add KeyboardProvider

* Update SimpleCodeEditor.tsx

* fix ts error

* add types package

* reworked SimpleCodeEditor

* Preserve highlightmode

* Update SimpleCodeEditor.tsx

* performance improvement

* simplified

* fix tsc

* fix alignment issues

* load current snippet into example view

* Merge branch 'master' into custom-code-clean

* fix type + lint

* Resolve can't read property id of undefined error

---------

Co-authored-by: Rajarshee Chatterjee <rajarshee.adm@gmail.com>
2026-08-11 07:09:52 +05:30
Rajarshee Chatterjee 7f1f76408b docs: Add AGENTS.md with Agent Setup, Commands, and Conventions (#1974) 2026-08-10 09:17:43 +05:30
Rajarshee Chatterjee 51560195ba fix: Soften Skeleton Loading Colors (Closes #1964) 2026-08-10 08:25:10 +05:30
Rajarshee Chatterjee 084dcccabc fix: Match Chapter Drawer Read Color (Closes #1973)
[skip ci]
2026-08-10 08:17:22 +05:30
Rajarshee Chatterjee 3ad6e372fd fix: Correct Translation Strings Across Locales 2026-08-10 08:16:32 +05:30
Ali 179feb56ee fix: Include All Chapters Beyond the 1000-Row UI Limit (#1938)
* chapter backup and restore fix

* Update .gitignore

Co-authored-by: Rajarshee Chatterjee <rajarshee.adm@gmail.com>

* test: update backup mocks for getAllNovelChaptersForBackup

---------

Co-authored-by: Rajarshee Chatterjee <rajarshee.adm@gmail.com>
2026-08-09 16:28:12 +05:30