Skip to content

Latest commit

 

History

History
882 lines (437 loc) · 39.4 KB

CHANGELOG.md

File metadata and controls

882 lines (437 loc) · 39.4 KB

Change Log

All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.

30.2.0 (2026-10-20)

Features

  • core: give a spine item's loaded document (689e50d)

Bug Fixes

  • core: end a spine item's loaded document when it is destroyed (269edce)
  • core: resolve a cfi only into its item's loaded document (9968556), closes #499

30.1.2 (2026-10-20)

Bug Fixes

  • enhancer-search: fold case outside the BMP when matching (571a4a1)
  • enhancer-search: match the search text literally (cc19223)

30.1.1 (2026-10-19)

Note: Version bump only for package @prose-reader/root

30.1.0 (2026-10-19)

Features

  • enhancer-koreader: open a reader at a KOReader progress (66aa7cc), closes #567

30.0.0 (2026-10-19)

⚠ BREAKING CHANGES

  • enhancer-koreader: reader.koreader.cfiToXPointer(cfi) is replaced by reader.koreader.cfiToProgress(cfi), which returns the same xpointer for an EPUB and a page number, such as "12", for a PDF or a comic archive. reader.navigation.goToXPointer(xpointer) is replaced by reader.navigation.goToKoreaderProgress(progress), and the { type: "xpointer" } navigation target and XPointerNavigationTarget by { type: "koreaderProgress" } and KoreaderProgressNavigationTarget. The form follows the manifest's mediaType: a book of unknown type, application/octet-stream, such as one opened from an archive with no filename, no encodingFormat and no META-INF/container.xml, has no progress, nor has a plain ZIP the app does not give a comic's media type.

Features

  • enhancer-koreader: give the KOReader progress of any book (4c10a15), references #535
  • koreader: tell the form of a book's progress (3c169c5)

Bug Fixes

  • front: center the landing footer on a phone (f76f438)
  • front: set the landing footer's name and license on one baseline (4b01cd2)

29.0.0 (2026-10-19)

⚠ BREAKING CHANGES

  • archive-reader: getArchiveOpfInfo(archive), which returned the first .opf record as { data, basePath }, is replaced by the asynchronous getArchiveOpfRecord(archive), which returns the record of the package document the container file lists. readArchiveOpf(archive) still gives the parsed package document with its basePath.

Features

  • front: renovate the landing page, as a page of its own (afd7827)

Bug Fixes

  • archive-reader: leave out a container file's elements of other namespaces (ddd22c4)
  • archive-reader: read the package document the container file lists (1c7145a)
  • front: center the mark on the name in the landing header and footer (8e477d9)
  • front: draw the landing wordmark from the brand logo (323f278)
  • front: show the reader setup without getResource on the landing page (2829e49)

28.2.0 (2026-10-19)

Features

  • streamer: make the archive key optional (e8fad96)

28.1.0 (2026-10-19)

Features

  • archive-reader: export the resolution of a book's references (6526b47)
  • draw the prose mark, and show it in the readme (e372fc7)
  • front: serve the prose mark as the favicon (0cd1d58)

Bug Fixes

  • center the mark on the name in the wordmarks (dcfb409)
  • streamer: find a resource's declared media type by its record (01ac289)
  • streamer: rebase an EPUB manifest item as its spine item (dc51a27)

28.0.0 (2026-10-19)

⚠ BREAKING CHANGES

  • archive-reader: getSpineItemFilesFromArchive is removed from @prose-reader/archive-reader. Resolve the reading order with resolveArchiveReadingOrder(archive) and find each item's record with getArchiveFileRecordByUri(archive, item.uri).

Bug Fixes

  • archive-reader: find the nav document and the NCX by their record (cbb391b)
  • archive-reader: keep a reference's query and fragment out of its path (939001f)
  • archive-reader: resolve escaped dot segments as a browser does (07b9cd6)
  • archive-reader: resolve the dot segments of toc links (7dbdae7)

Code Refactoring

  • archive-reader: remove getSpineItemFilesFromArchive (a21d1fe)

27.0.0 (2026-10-19)

⚠ BREAKING CHANGES

  • streamer: Manifest.spineItems[].containerUri is required. A manifest built by hand states the uri of the archive record each spine item shows. Manifests generated by the streamer carry it. A manifest saved before this release lacks it: generate it again.

Features

  • streamer: carry each spine item's archive record in the manifest (269ad72), references #413

Bug Fixes

  • archive-reader: resolve an escaped href to the record it names (36886cf)
  • enhancer-pdf: render the page each spine item names, past the tenth (8008a98)
  • streamer: name each audiobook track after its own archive record (c3bfbd4)

26.0.0 (2026-10-19)

⚠ BREAKING CHANGES

  • streamer: Manifest.mediaType is required. A manifest built by hand states the media type of the book it stands for, application/octet-stream when it is none. Manifests generated by the streamer carry it. A manifest saved before this release lacks it: generate it again.

Features

  • archive-reader: resolve the media type of the book file (cfd4a08)
  • streamer: carry the book's media type in the manifest (a3aa009)

25.1.0 (2026-10-10)

Features

  • koreader: compute the digests KOReader files reading positions under (c550d66)
  • shared: move the md5 out of @prose-reader/koreader (a7f37ee)

Bug Fixes

  • start every watcher in start and start:lib (e527d17)

25.0.1 (2026-10-10)

Bug Fixes

  • declare the MIT license in every published package (fefd424)

25.0.0 (2026-10-10)

⚠ BREAKING CHANGES

  • gestures: @prose-reader/enhancer-gestures requires gesturx 2, and Node >=22.12 when loaded on Node. Apps on gesturx 1 upgrade it alongside; its API is unchanged. import and bundler builds are unaffected.

Features

  • gestures: require gesturx 2 (4697012)

24.0.0 (2026-09-27)

⚠ BREAKING CHANGES

  • core: DocumentRenderer no longer has setDocumentContainer() or detach(). A custom renderer returns its document's element from onCreateDocument(), which becomes documentContainer, and no longer detaches it in onUnload(): DocumentRenderer removes it from the dom once onUnload() has run.

Bug Fixes

  • core: let the renderer's lifecycle own its document container (45f80eb)

23.0.0 (2026-09-27)

⚠ BREAKING CHANGES

  • core: SpineItemState.error and a renderer's error are renamed loadError.
  • core: SpineItemState.isLoaded and isError are replaced by loadStatus: DocumentLoadStatus, "idle" | "loading" | "loaded" | "unloading" | "error": isLoaded is loadStatus === "loaded" and isError is loadStatus === "error". A renderer's state is renamed loadStatus. SpineItemsObserver.itemLoad$, itemUnload$ and itemLoadFailure$ are replaced by itemLoadStatusChange$, emitting { item, loadStatus }. SpineItem.loaded$ and unloaded$, and DocumentRenderer.loaded$, unloaded$ and isLoaded$, are removed: watch loadStatus instead.
  • core: SpineItemState and a renderer's state are unions on loadStatus: loadError is undefined unless loadStatus is error.

Bug Fixes

  • core: deliver load status changes as they happen, and defer only the layout (73f3721)
  • core: lay out after a load status reaches every subscriber, on load ends only (6a299d2)

Code Refactoring

  • core: hold a load error only with the error status, and test the selection and writing mode (b4be71c)
  • core: name the reason a load failed loadError, and what ends a load (002f4d8)
  • core: one load status for a spine item, not two flags and three streams (a5656f8)

22.0.2 (2026-09-27)

Bug Fixes

  • core: hold one document at a time in a renderer (bb20d76), closes #497
  • core: release on destroy while the renderer's state is still observed (f74ff11)

22.0.1 (2026-09-27)

Bug Fixes

  • core: load the picture of an SVG image in a document loaded from a blob (8729c53), closes #408

22.0.0 (2026-09-27)

⚠ BREAKING CHANGES

  • navigation: ReadingPosition.state is replaced by ReadingPosition.status, "pending" | "success": "final" is "success", and "standIn" and "targetPlace" are "pending". A pending value stands in at its spine item's start when reader.cfi.isRootCfi says its cfi names only the item. A navigation entry's anchor is an InternalNavigationAnchor, which keeps state.
  • core: ReadingPosition.status gains "error": the navigation's spine item failed to load, and the value stays until the next navigation. load() no longer retries a renderer or spine item in error: it loads again after unload(). isSettled pagination results can describe an item in error.

Features

  • core: end a navigation into a spine item that fails to load in error (0a4d495)
  • navigation: say whether the reading position is found, not how much of it (ed9312b)

21.0.2 (2026-09-27)

Bug Fixes

  • navigation: measure an element without text from the offset in it (1f49c1e)
  • navigation: place the boundary after an element's last child where its contents end (12fe453)

21.0.1 (2026-09-27)

Bug Fixes

  • core: keep a failed load in the renderer's state, not in its streams (16512cb)
  • core: release what a failed load created only once (c2f5c30)

21.0.0 (2026-09-27)

⚠ BREAKING CHANGES

  • enhancer-koreader: reader.navigation.readingPositionXPointer$ is removed. Convert readingPosition$'s cfi with reader.koreader.cfiToXPointer, which returns undefined for a place in a chapter that is not loaded, or a cfi naming nothing in the book. rxjs is no longer a peer dependency of @prose-reader/enhancer-koreader.

Features

  • enhancer-koreader: convert a cfi to an xpointer on demand, not the reading position as a stream (3c8d019)
  • front: offer the spread mode's scopes in the demo, as the font size's (b4da63b)
  • react-reader: manage the spread mode through props, as the font size (80f3b02)

Bug Fixes

  • gestures: release the navigation however a pan that moved the page ends (e05f5b8)
  • navigation: find the page holding text at the left edge of its document (e4d68fc)
  • navigation: place a node that isn't rendered where the content after it is (6d5cbd5)
  • navigation: release the lock of a pan stopped while it takes it (1ce57d0)
  • react-reader: keep the app's setting value over the one the reader holds when met (d747b4e)

20.0.1 (2026-09-26)

Bug Fixes

  • navigation: move the reading position once a locked navigation lands (6baa902), references #392 #392

20.0.0 (2026-09-26)

⚠ BREAKING CHANGES

  • navigation: ReadingPosition.isFinal is replaced by ReadingPosition.state, "standIn" | "targetPlace" | "final"; isFinal is state === "final". The NavigationAnchor type is removed: a navigation entry's anchor is a ReadingPosition.

Features

  • navigation: give the reading position its state, not only whether it is final (9f6afe2)

19.0.0 (2026-09-26)

⚠ BREAKING CHANGES

  • navigation: a navigation to a cfi reports its chapter's start as the reading position until the chapter is loaded, rather than the cfi as asked. A cfi whose path leads to nothing in its chapter, or into a spine item without a document, is reported as the page it lands on.

Bug Fixes

  • navigation: report where the reader is, the same way for every target (97ba59f), closes #465

18.0.0 (2026-09-26)

⚠ BREAKING CHANGES

  • navigation: ReadingPosition gains isFinal, which code building one must set. readingPosition$ emits once more when a value becomes final, even with the same cfi and progress.

Features

  • navigation: say whether the reading position is final (49ed7f2)

Bug Fixes

  • navigation: stop a selector waiting for a document its item never gets (e697b87)

17.0.4 (2026-09-26)

Note: Version bump only for package @prose-reader/root

17.0.3 (2026-09-26)

Note: Version bump only for package @prose-reader/root

17.0.2 (2026-09-26)

Note: Version bump only for package @prose-reader/root

17.0.1 (2026-09-26)

Bug Fixes

  • cfi: read a text assertion spanning lines (0823177)

17.0.0 (2026-09-26)

⚠ BREAKING CHANGES

  • cfi: parse throws for strings it used to read in part, such as a cfi with text after its closing parenthesis or without one, or with a step or an offset missing its number.
  • navigation: a navigation to a spine item the book does not have is ignored rather than clamped to its first or last item, and a navigation to an empty cfi is ignored rather than going to the first item.

Bug Fixes

  • cfi: throw for a string that is only partly a cfi (a071e27)
  • navigation: ignore a navigation whose target names nothing in the book (5203b99), closes #465

16.0.1 (2026-09-26)

Bug Fixes

  • enhancer-audio: select the track a book opens on (5dba3ae)

16.0.0 (2026-09-26)

⚠ BREAKING CHANGES

  • navigation: reader.navigation.readingPosition$ emits { cfi, percentageEstimateOfBook } instead of the cfi, and the readingPosition of @prose-reader/react-native's ReaderState follows it.

Features

  • navigation: report how far into the book the reading position is (bd3971f)

Bug Fixes

  • core: keep progression estimates within the book whatever the weights (fca46fa)
  • enhancer-audio: fail a refused play instead of waiting for canplay (96f2dc0)
  • metadata-fetcher-api: serve the playground from a checkout under a dot-directory (d55e3e8)
  • navigation: take a target's progression from the page holding it (e3b5681)

15.0.1 (2026-09-26)

Note: Version bump only for package @prose-reader/root

15.0.0 (2026-09-26)

⚠ BREAKING CHANGES

  • core: shouldUseSpreadModeForViewport is removed from @prose-reader/core. Call reader.viewport.wouldSpreadAt(size) instead, which reads the book and the spreadMode setting from the reader. Context.update accepts only rootElement and hasVerticalWriting.

Features

  • core: ask the reader about spreads instead of free functions (33d9b41)
  • react-reader: add a layout dialog to the quick menu (8a3ce75), closes #424

Bug Fixes

  • deps: declare the rxjs versions each package needs (1b31ae0)
  • deps: raise the rxjs floor to 7.5.5, the first to export its types (eecd5af)
  • enhancer-pdf,enhancer-audio: constrain options only to what they read (8b7bcc0)

14.1.0 (2026-09-25)

Features

  • enhancer-koreader: navigate to xpointers, and report the reading position as one (aea1d36)

Bug Fixes

  • enhancer-koreader: follow the target option, and pin the reopen report (dd67cd6)
  • enhancer-koreader: require the rxjs it is written against (2458bc0)

14.0.0 (2026-09-25)

⚠ BREAKING CHANGES

  • core: the cfi option of createReader is removed. Pass target: { type: "cfi", value: cfi } instead. ReaderLoadOptions of @prose-reader/react-native takes target in place of cfi the same way.

Features

  • core: open the reader at any navigation target (370d3c2)

13.0.5 (2026-09-25)

Bug Fixes

  • core: open at the initial cfi without reporting the start of the book (fd1ea00)

13.0.4 (2026-09-25)

Note: Version bump only for package @prose-reader/root

13.0.3 (2026-09-25)

Bug Fixes

  • demo: declare haruko-comic.zip right to left (1f6b4e2)
  • demo: declare sample.cbz left to right (c24b6f7), closes #449
  • demo: label sous-le-vent as French and the webtoons as reflowable (bff329e)

13.0.2 (2026-09-25)

Bug Fixes

  • gestures: make the drag listener the only thing stopping the browser's own drag (a9e23d7)
  • gestures: stop the browser's own drag inside the book, so a moving press still pans or taps (80fb239)

13.0.1 (2026-09-25)

Note: Version bump only for package @prose-reader/root

13.0.0 (2026-09-25)

⚠ BREAKING CHANGES

  • navigation: the core NavigationTarget no longer has url; the reader createReader returns still takes it, through the url enhancer. node is a new target type. After goToUrl to an element, the reading position is that element's cfi rather than the first character of its page. A url outside the book is ignored instead of going to the first item.

Bug Fixes

  • navigation: keep a selector waiting for its document without an anchor (f6a33d4)
  • navigation: state what a selector may assume, and survive one that throws (7ac3133)

Code Refactoring

  • navigation: move url navigation into a core enhancer, on a generic node target (e4b2a22)

12.0.0 (2026-09-24)

⚠ BREAKING CHANGES

  • navigation: UserNavigationEntry.direction is removed, and InternalNavigationEntry.directionFromLastNavigation no longer includes "anchor".

Bug Fixes

  • core: keep a forwarded pointer event's button, pointer and modifier keys (aed8733), closes #240 #240
  • gestures: require gesturx 1.11.1, where only the primary button starts a gesture (#439) (a162710)

Code Refactoring

  • navigation: resolve targets in one step, in a fixed consolidation order (#436) (912b9a3)

11.0.0 (2026-09-24)

⚠ BREAKING CHANGES

  • navigation: ask for one typed target per navigation (#434)

Code Refactoring

  • navigation: ask for one typed target per navigation (#434) (62b9d52)

10.0.0 (2026-09-24)

⚠ BREAKING CHANGES

  • layout: the spreadMode setting is now "auto" | "always" | "never", defaulting to "auto", instead of a boolean. "always" still shows no spread for a book whose rendition:spread is none, which the EPUB specification forbids, or whose rendition:flow is scrolled-continuous. The computedSpreadMode computed setting is removed: read what the reader shows from reader.viewport.value.isSpread, or follow it with reader.viewport.watch("isSpread"). shouldEnableSpreadModeForViewport and shouldUseComputedSpreadModeForViewport are replaced by shouldUseSpreadModeForViewport, which takes the setting. react-reader's wouldRotationUseComputedSpreadMode is renamed wouldRotationUseSpreadMode and takes the setting too.

Features

  • metadata-fetcher-api: cap concurrent lookups, leave rate limiting to the deployment (#425) (a0d78ea)

Bug Fixes

  • layout: decide spread mode in the viewport's layout, so a resize that switches it lays out once (#398) (260c332)

9.0.0 (2026-09-24)

⚠ BREAKING CHANGES

  • react-native: bridgeReader's createReader factory receives { manifest, cfi } instead of the manifest, and load from useCreateReader takes { manifest, cfi? } instead of the manifest.
  • react-native: pagination, context and readingPosition in the bridge state are null, not undefined, until the reader of the book last loaded reports them. The web side reports through report(load, state) instead of setPagination and setContext.

Features

  • react-native: relay the reading position to native, and let load reopen at one (#422) (13fb0f9), closes #415

8.0.1 (2026-09-24)

Note: Version bump only for package @prose-reader/root

8.0.0 (2026-09-24)

⚠ BREAKING CHANGES

  • navigation: paginationBeginCfi is removed from navigation entries and "pagination" from triggeredBy; navigation$ emits every restoration; EnhancerPaginationInto is renamed EnhancerPaginationInfo.

Code Refactoring

  • navigation: derive the reading position and resolve pagination on navigations only (#392) (5f34d62), closes #390

7.0.4 (2026-09-24)

Bug Fixes

  • core: stop a link the browser never fetches from holding its chapter (#406) (aaa698d), closes #400

7.0.3 (2026-09-24)

Note: Version bump only for package @prose-reader/root

7.0.2 (2026-09-24)

Bug Fixes

  • zoom: lay the reader out when zooming instead of only re-measuring the viewport (#399) (4e0fe57)

7.0.1 (2026-09-23)

Bug Fixes

  • layout: stop laying out after every settings change, and lay out for the settings that move the pages (#387) (c1808cf)

7.0.0 (2026-09-23)

⚠ BREAKING CHANGES

  • navigation: reader.navigation.state$ no longer emits canTurnLeft and canTurnRight.

Bug Fixes

  • react-native: release replaced readers and order expo archives, with real tests (#394) (fcff364)

Code Refactoring

  • navigation: drop canTurnLeft and canTurnRight from the navigation state (#393) (b441ae6)

6.0.0 (2026-09-23)

⚠ BREAKING CHANGES

  • pagination: EnhancerPaginationInto is renamed EnhancerPaginationInfo. ChapterInfo is now recursive: the toc has no depth limit, and the builder already produced chains deeper than the four hand-unrolled levels the type described, through casts.

Documentation

  • pagination: document the pagination surface that exists (#391) (46a0e14), closes #390

5.0.0 (2026-09-23)

⚠ BREAKING CHANGES

  • react-native: @prose-reader/react-native requires Expo SDK 57; its expo-file-system peer is ^57.0.0.

Features

  • react-native: settle the library and its demo on expo sdk 57 (#386) (fa9448f)

4.0.2 (2026-09-23)

Note: Version bump only for package @prose-reader/root

4.0.1 (2026-09-23)

Note: Version bump only for package @prose-reader/root

4.0.0 (2026-09-23)

⚠ BREAKING CHANGES

  • pagination: PagesState gains layoutRequest, which reaches reader.layout$ values, and SpineLayout.layout$ emits the number of the request it laid out for.

Bug Fixes

  • pagination: keep settlement only while the layout is current and the page is ready (#379) (d4059dd), closes #369

3.0.0 (2026-09-23)

⚠ BREAKING CHANGES

  • pagination: anchor navigation on settled results and drop navigationId (#369)

Code Refactoring

  • pagination: anchor navigation on settled results and drop navigationId (#369) (1229ccb)

2.0.3 (2026-09-22)

Bug Fixes

  • demo: make the react native demo bundle again (#375) (6fa2cad)

2.0.2 (2026-09-22)

Bug Fixes

  • release: give lerna the edges its graph is missing (#372) (d8323ff)

2.0.1 (2026-09-22)

Bug Fixes

  • build: annotate the exported types declaration emit cannot infer, and reattach the apps to the workspace (#371) (6091f84)

2.0.0 (2026-09-22)

⚠ BREAKING CHANGES

  • deps: consumers reaching these packages through require() now need Node >=22.12, where require(esm) landed unflagged. import is unaffected on any Node that runs them, as is any bundler build. Documented on the streamer's Node page.

Features

Bug Fixes

1.374.2 (2026-09-21)

Note: Version bump only for package @prose-reader/root

1.374.1 (2026-09-21)

Note: Version bump only for package @prose-reader/root