Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
159 commits
Select commit Hold shift + click to select a range
643250a
test(core): probe what laying a chapter out as one continuous strip c…
Ringyuki Oct 26, 2026
944c668
perf(inline): a closer a forced break follows is not tried trimmed at…
Ringyuki Oct 26, 2026
f2c8912
test(core): the strip cost probe's filter runs one of its two probes
Ringyuki Oct 26, 2026
49634af
fix(parley): a ligature is measured by its own run, a forced break co…
Ringyuki Oct 26, 2026
d2d7128
chore(oracle): corpus-ab runs the probe binary it is given and names …
Ringyuki Oct 26, 2026
09046bd
docs: note the line breaking fixes
Ringyuki Oct 26, 2026
83ba52e
test(inline): count paragraph builds and line breakings, and pin inte…
Ringyuki Oct 26, 2026
9826ff6
fix(inline): a forced line ends before a text index, so a rewound lin…
Ringyuki Oct 26, 2026
377a3e8
chore(oracle): corpus-ab and the fragment probe narrow to a paragraph…
Ringyuki Oct 26, 2026
8be821b
perf(inline): decide each line's edges as it is broken and build the …
Ringyuki Oct 26, 2026
1185a3b
test(inline): pin rewound note lines against Chromium, and split ruby…
Ringyuki Oct 26, 2026
2aa179a
perf(inline): lines that decide nothing stand as the build broke them…
Ringyuki Oct 26, 2026
84c8854
refactor(inline): the line-by-line pass is the only line-decision driver
Ringyuki Oct 26, 2026
6b1ed13
chore(test): pin the browser oracle to Chromium 156, run as the full …
Ringyuki Oct 26, 2026
d41c35c
fix(selection): word movement steps past spaces to the next word's en…
Ringyuki Oct 27, 2026
0178e0f
fix(inline): break lines as current Blink does, trimming closers acro…
Ringyuki Oct 27, 2026
211f3e4
test(reader): wait for the selection highlight to paint before readin…
Ringyuki Oct 27, 2026
8d0d21e
chore(corpus-oracle): keep both sides' lines in the A/B report on req…
Ringyuki Oct 27, 2026
f64a705
chore(test): measure against Chromium with no smart minimum font size…
Ringyuki Oct 27, 2026
c4b7557
perf(paint): join each inline flow's text once per paint instead of o…
Ringyuki Oct 27, 2026
6395587
style(paint): rustfmt the flow text cache
Ringyuki Oct 27, 2026
c9da426
test(flutter): blit paint-parity lists at their own ratio
Ringyuki Oct 27, 2026
005bf04
feat(scroll): lay a chapter out as one strip and paint and record it …
Ringyuki Oct 27, 2026
8030901
test(scroll): gate seams on what each window draws and report how the…
Ringyuki Oct 27, 2026
5b82e93
fix(block): place a box positioned in the root of a continuous layout…
Ringyuki Oct 27, 2026
19a0019
feat(scroll): a scrolled revision pages each chapter as the windows o…
Ringyuki Oct 27, 2026
ef91f8a
feat(scroll): the reader protocol carries a scrolled layout, each win…
Ringyuki Oct 27, 2026
255aff2
feat(scroll): a whole-book table warms each scrolled chapter page by …
Ringyuki Oct 27, 2026
d15acb3
feat(scroll): a scrolled chapter's strip is laid out without its text…
Ringyuki Oct 27, 2026
94882e7
feat(scroll): a book whose pages progress right to left scrolls leftw…
Ringyuki Oct 27, 2026
50165d1
docs(scroll): the scrolled layout, its target offset and its windows …
Ringyuki Oct 27, 2026
a2f7656
test(scroll): lower vertical-rl seams and stack leftward windows side…
Ringyuki Oct 27, 2026
c4e75a2
feat(reader): a reader asks for the scrolled spread mode, each chapte…
Ringyuki Oct 27, 2026
50d30d7
test(walk): a scrolled lane compares each chapter's windows with Chro…
Ringyuki Oct 27, 2026
9f488d5
fix(flutter): the page source takes each request id before the call t…
Ringyuki Oct 27, 2026
925f673
feat(scroll): a located page says where the locator's line starts in …
Ringyuki Oct 27, 2026
68b1a2a
feat(reader): a scrolled reader publishes its windows end to end, whe…
Ringyuki Oct 27, 2026
31f3017
feat(kit): a scrolled book's windows on the device grid, and the phys…
Ringyuki Oct 27, 2026
95af068
feat(kit): scrolled windows keep a picture each at their own size and…
Ringyuki Oct 27, 2026
c99f006
feat(kit): a scroll controller shows a scrolled book's windows end to…
Ringyuki Oct 27, 2026
30d82d6
feat(reader): a scrolled view holds the window after the active one's…
Ringyuki Oct 27, 2026
9cc630e
feat(demo): a scrolled reading page that opens a book as one strip of…
Ringyuki Oct 27, 2026
312c593
feat(kit): a resting scroll view says where the reader reads, the lin…
Ringyuki Oct 27, 2026
0231dfb
feat(kit): a scroll view puts a located line at its reading line
Ringyuki Oct 27, 2026
89de28d
feat(kit): a scroll view finds the window and content point under a v…
Ringyuki Oct 27, 2026
33c9f72
feat(demo): the scrolled reading page follows links into the book and…
Ringyuki Oct 27, 2026
af93091
feat(flutter): a scrolled book's windows on the device grid, by the r…
Ringyuki Oct 27, 2026
2b3642e
feat(flutter): a scroll reader view shows a scrolled book's windows e…
Ringyuki Oct 27, 2026
2feac75
feat(flutter): a resting scroll reader says where the reader reads, a…
Ringyuki Oct 27, 2026
0d1d36d
docs(scroll): scrolled reading in the reader API, the kit and the rel…
Ringyuki Oct 27, 2026
eef73fb
test(vertical): probe the client rects and carets Chromium gives vert…
Ringyuki Oct 27, 2026
a60a757
feat(vertical): a vertical page's records, carets and keys read where…
Ringyuki Oct 27, 2026
09c8764
test(vertical): the rects probe keeps the user agent's paragraph margins
Ringyuki Oct 27, 2026
c1c4fdb
feat(kit): a scrolled view selects text across its windows and draws …
Ringyuki Oct 27, 2026
bd32288
feat(flutter): a scrolled view says what is under a point and draws a…
Ringyuki Oct 27, 2026
1bf29b3
feat(kit): a scrolled view mirrors the text on screen for screen read…
Ringyuki Oct 27, 2026
37676af
feat(react): useRitoScrollReader owns a scrolled reader and its view,…
Ringyuki Oct 27, 2026
a391332
test(vertical): the engine's records of the probe's page and a compar…
Ringyuki Oct 27, 2026
5e69649
feat(kit): a Shift chord moves a scrolled selection's focus and the s…
Ringyuki Oct 27, 2026
8bca0f6
feat(kit): a touch held still selects in a scrolled view and the fing…
Ringyuki Oct 27, 2026
0946477
feat(react): a scrolled reader can be let go without unmounting
Ringyuki Oct 27, 2026
e0f4413
feat(reader): the app reads a book scrolled from its layout setting
Ringyuki Oct 27, 2026
994cd6b
feat(reader): search a book read scrolled, its result shown and highl…
Ringyuki Oct 27, 2026
ad4486d
feat(reader): where a book is read scrolled is saved as its reading p…
Ringyuki Oct 27, 2026
023dc2b
feat(reader): a book read scrolled shows its annotations under the se…
Ringyuki Oct 27, 2026
45680cf
feat(reader): the selection read scrolled can be kept as a highlight
Ringyuki Oct 27, 2026
1c02929
feat(reader): a note reference tapped in a book read scrolled opens t…
Ringyuki Oct 27, 2026
e892db6
feat(kit): a scrolled view says where page rects are on it
Ringyuki Oct 27, 2026
e640d0d
feat(reader): an image tapped in a book read scrolled opens in the li…
Ringyuki Oct 27, 2026
cdd32ed
docs(scroll): the release note names the view's rect mapping
Ringyuki Oct 27, 2026
b125ed5
feat(kit): a scrolled selection's ends are handles an app can draw an…
Ringyuki Oct 27, 2026
526a178
feat(react): a scrolled view's selection handles, the page reader's p…
Ringyuki Oct 27, 2026
389cef2
feat(reader): a book read scrolled shows selection handles for touch
Ringyuki Oct 27, 2026
e4a1145
feat(reader): a book read scrolled takes the typography settings
Ringyuki Oct 27, 2026
49b3b9c
fix(kit): a scrolled view rests once per place, and a touch tap lets …
Ringyuki Oct 27, 2026
1087bf6
fix(kit): a scrolled view counts presses from the mouse event, as the…
Ringyuki Oct 27, 2026
adf6e7c
feat(react): selection handles turn with a caret across a vertical line
Ringyuki Oct 27, 2026
18b6b15
fix(kit): a scrolled window just painted is drawn on the view, not in…
Ringyuki Oct 27, 2026
05f2b9b
fix(kit): a tap on a scrolled link hits the link, not its text run
Ringyuki Oct 27, 2026
7c40420
fix(reader): the scrolled bar is opaque and the contents follow the w…
Ringyuki Oct 27, 2026
be35fb1
test(scroll): acceptance probes for the scroll page and the app's scr…
Ringyuki Oct 27, 2026
63b48ee
tools(walk): lay the truth out under another locale, minimum font siz…
Ringyuki Oct 27, 2026
8f38139
tools(walk): the scrolled lane reads a vertical chapter's windows lef…
Ringyuki Oct 27, 2026
3b948f4
tools(walk): count the beyond-floor pixels outside drawn images apart
Ringyuki Oct 27, 2026
fabed14
fix(layout): a first-line ruby reaches into the margin and the leadin…
Ringyuki Oct 27, 2026
292420c
fix(layout): a ruby paragraph's first line keeps one geometry whateve…
Ringyuki Oct 27, 2026
634afd5
fix(layout): a ruby overhangs only text on its own line, and a rewoun…
Ringyuki Oct 28, 2026
acd0fb7
feat(style): text-orientation and text-combine-upright reach the engi…
Ringyuki Oct 28, 2026
32763f0
feat(layout): block layout reads each box's edges and sizes in its wr…
Ringyuki Oct 28, 2026
2b9bda0
fix(paint): a vertical-rl page paints box backgrounds, borders and ru…
Ringyuki Oct 28, 2026
4b946fa
fix(layout): a vertical line hangs from its central baseline and each…
Ringyuki Oct 28, 2026
a4670e6
tools(walk): a vertical chapter's truth pages are the column boxes CS…
Ringyuki Oct 28, 2026
44e1324
fix(layout): a vertical ruby line reaches into the space before it an…
Ringyuki Oct 28, 2026
132c9b4
fix(layout): an image down a vertical column sizes on its physical ax…
Ringyuki Oct 28, 2026
5f36140
feat(paint): a vertical line's upright glyphs draw in their face's ve…
Ringyuki Oct 28, 2026
8088241
tools(digest): describe an artifact's fonts field by field, so a face…
Ringyuki Oct 28, 2026
e529e1b
fix(layout): an image in a vertical line sits on the central baseline…
Ringyuki Oct 28, 2026
3c02b74
fix(layout): a vertical line's upright characters shape top to bottom…
Ringyuki Oct 28, 2026
3097a26
feat(layout): a text-combine-upright item sets as one horizontal stri…
Ringyuki Oct 28, 2026
6d5960d
fix(layout): a vertical line's upright punctuation trims to its verti…
Ringyuki Oct 28, 2026
ddd9740
feat(layout): a block's minimum and maximum block size bound it, min-…
Ringyuki Oct 28, 2026
91caa68
feat(layout): an inline box in a writing mode not its parent's lays o…
Ringyuki Oct 28, 2026
f4e9ccb
tools(walk): a chapter whose body alone turns vertical pages from the…
Ringyuki Oct 28, 2026
e5012be
docs(changeset): orthogonal inline boxes and block size bounds in the…
Ringyuki Oct 28, 2026
bdc96ad
fix(layout): an empty block that takes block space hands the annotati…
Ringyuki Oct 28, 2026
8e11051
tools(walk): a vertical truth column is captured from the document's …
Ringyuki Oct 28, 2026
b86054d
fix(browser): the canvas reader decodes the GIF, WebP and BMP images …
Ringyuki Oct 28, 2026
9c32e07
fix(layout): an empty block hands on the margin collapsed above it as…
Ringyuki Oct 28, 2026
d11f8a9
fix(layout): a block's fixed or minimum block size that its fragmenta…
Ringyuki Oct 28, 2026
28d367f
feat(style): text-emphasis and its prefixed spellings reach the engin…
Ringyuki Oct 29, 2026
b8ba189
feat(layout): emphasis marks reach past their lines and paint where C…
Ringyuki Oct 29, 2026
bb8b0b6
fix(layout): an upright glyph from a face without vertical metrics ad…
Ringyuki Oct 29, 2026
b7cec29
fix(layout): an ideographic space overflowing a line hangs past its e…
Ringyuki Oct 29, 2026
074cf89
fix(layout): a short ruby is one unit a line never breaks inside, as …
Ringyuki Oct 29, 2026
0d03c57
fix(layout): lines break where Chromium breaks them, each text item u…
Ringyuki Oct 29, 2026
83bd58a
fix(layout): an inline block stands on its line by its margin box, as…
Ringyuki Oct 29, 2026
80aecb3
fix(layout): a no-break space takes a justification share, as Chromiu…
Ringyuki Oct 29, 2026
5862528
fix(layout): a line's last glyph is measured as Chromium reshapes the…
Ringyuki Oct 29, 2026
07e7378
fix(layout): an inline table moves to the next page whole, as Chromiu…
Ringyuki Oct 29, 2026
635b1af
fix(style): a chapter opened from its archive takes only the styleshe…
Ringyuki Oct 29, 2026
3e89ecb
fix(layout): adjacent CJK punctuation trims by Chromium's classes for…
Ringyuki Oct 29, 2026
db2b589
fix(layout): a wide ruby's base aligns to a justified line's edges, a…
Ringyuki Oct 29, 2026
ce66af7
fix(paint): vertical ruby text moves with its ruby box rounded to a w…
Ringyuki Oct 29, 2026
5c5c2f8
fix(layout): a line holding only an image lends the ruby after it the…
Ringyuki Oct 29, 2026
3b326b5
fix(layout): a justified item ends on the grid ceiling of its exact a…
Ringyuki Oct 29, 2026
d2f5cb5
feat(paint): vertical text draws its underline and overline beside th…
Ringyuki Oct 29, 2026
34957de
fix(paint): a ligature paints as one cluster from its start, as the f…
Ringyuki Oct 29, 2026
03b361e
fix(paint): an image snaps the rect object-fit placed it in, keeping …
Ringyuki Oct 29, 2026
71e75a4
chore(walk): dump the truth's client rects of chosen elements in one …
Ringyuki Oct 29, 2026
cc9afc4
fix(layout): a box that breaks across pages keeps the rest of the pag…
Ringyuki Oct 29, 2026
3ad0c07
fix(layout): a block clearing the floats before it keeps its top marg…
Ringyuki Oct 29, 2026
6791cfe
fix(layout): a missing image without alt lays out as the broken-image…
Ringyuki Oct 30, 2026
a08aef9
fix(layout): margins collapsing through nested wrappers join as one s…
Ringyuki Oct 30, 2026
bdb5a60
fix(layout): an inline-block lays out as Chromium's atomic inline wha…
Ringyuki Nov 2, 2026
8bf96f0
fix(layout): a block starting past the page end breaks before it and …
Ringyuki Nov 2, 2026
99c9512
fix(paint): an image down a vertical column paints placed by its obje…
Ringyuki Nov 2, 2026
1adda36
chore(walk): lay the truth out in the engine's CSS viewport and paint…
Ringyuki Nov 2, 2026
4c0ba13
fix(layout): fixed, minimum and maximum block sizes truncate onto the…
Ringyuki Nov 2, 2026
c97805f
chore(walk): read an svg image's natural size from its load alone, so…
Ringyuki Nov 2, 2026
74d925f
fix(layout): an inline box right after a forced break starts the next…
Ringyuki Nov 2, 2026
d476ddc
fix(layout): an image or inline-block aligned middle centres half its…
Ringyuki Nov 2, 2026
4f3f219
feat(kit): a page controller hands its reader to another view and tak…
Ringyuki Nov 3, 2026
5df33ac
fix(kit): a scroll view stays on the window the reader reads through …
Ringyuki Nov 3, 2026
36c5e01
feat(react): useRitoScrollView reads a page controller's book scrolle…
Ringyuki Nov 3, 2026
4d76977
fix(reader): scrolled reading takes the pages' reader instead of open…
Ringyuki Nov 3, 2026
2af0cce
fix(kit): a scroll view mounted again where it is keeps its strip and…
Ringyuki Nov 3, 2026
2d72ea7
chore(reader): headless checks reach the scroll view as they reach th…
Ringyuki Nov 3, 2026
22f25e6
feat(react): useScrollSelectionHandles follows a scrolled view's sele…
Ringyuki Nov 3, 2026
297897b
feat(reader): a scrolled selection has the paged reader's floating to…
Ringyuki Nov 3, 2026
b8666e4
fix(reader): an annotation whose note was emptied shows the edit hint…
Ringyuki Nov 3, 2026
10dc4d5
feat(kit): a scroll view says which of the app's highlights a tap or …
Ringyuki Nov 3, 2026
d18b104
feat(reader): a highlight read scrolled opens to edit on a tap and sh…
Ringyuki Nov 3, 2026
2565abe
fix(react): useAnnotations starts from the records a controller alrea…
Ringyuki Nov 4, 2026
0f493c7
fix(reader): annotations read scrolled are found again in each layout…
Ringyuki Nov 4, 2026
80617e5
feat(kit): a scroll view says how far a page moves its strip, as the …
Ringyuki Nov 4, 2026
c269e0a
feat(reader): the book read scrolled has the paged reader's context m…
Ringyuki Nov 4, 2026
ecc7c29
ci(deploy): the reader's sharded demo is packed before the build, so …
Ringyuki Nov 4, 2026
9f8c520
chore(deps): vite 6.4.5, and happy-dom 21 declared by the packages wh…
Ringyuki Nov 4, 2026
9702822
fix(browser): a software WebGL renderer the performance caveat lets t…
Ringyuki Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .changeset/annotations-start-from-controller.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/react': patch
---

`useAnnotations` starts from the records the controller already holds: those its annotation storage loaded before the hook listened were told by no event, so a book opened again listed no annotations until the next change (a scrolled view, which draws them from that list, showed none).
5 changes: 5 additions & 0 deletions .changeset/atom-line-annotation-space.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A ruby line after a line holding only an image (an illustration paragraph) reaches only into the space under the image, as Chromium measures that line's content by the image, instead of half the image line's height.
5 changes: 5 additions & 0 deletions .changeset/atom-vertical-align-middle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An image or inline-block styled `vertical-align: middle` centres on its line as Chromium places it: its box moves by half its ascent less its descent, less half its parent's x-height, so its middle sits half the parent's x-height above the parent's baseline, down a vertical line too. calibre's centred plate pages, a page-wide spacer and a full-height block both aligned middle, now stand where Chromium draws them.
5 changes: 5 additions & 0 deletions .changeset/block-sizes-on-layout-grid.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A box's fixed, minimum and maximum block size sits on the LayoutUnit grid, truncated as Chromium stores a used size: paragraphs held to `min-width: 1.6em` down a vertical page stack 25.59375px apart instead of 25.6, so their excess no longer piles up over a page and moves where the next page's lines start.
5 changes: 5 additions & 0 deletions .changeset/box-edges-as-tags.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An inline element's start and end margin, border and padding take their width as Chromium's open and close tags do: a line that breaks where the element opens sends that start to the next line with the element's content, instead of leaving it on the line above or pushing the character before it down; nested elements each add their own, an empty element takes its width, vertical text reads the top and bottom sides, and percentage padding resolves against the containing block.
5 changes: 5 additions & 0 deletions .changeset/break-before-past-page-end.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A block whose start lands past the end of the page, after a line or plate taller than the page, opens the next page however small it is, as Chromium breaks before it: a page-break `<div>` after an over-wide plate no longer hangs off the bottom of the plate's page.
5 changes: 5 additions & 0 deletions .changeset/broken-box-keeps-the-page.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A box that breaks across pages paints as Chromium slices it: the fragment that breaks before or inside a child (or between a paragraph's lines) keeps the rest of the page, and no fragment strokes a border on an edge the break cut. A bordered box whose illustration moves to the next page draws its side borders down to the page bottom above it, with no bottom border there and no top border where it resumes.
5 changes: 5 additions & 0 deletions .changeset/broken-image-without-alt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A missing image with no `alt` attribute lays out as Chromium's 16px broken-image icon, as one with alt text does; only an empty `alt` collapses. A missing image in a short line no longer leaves every line after it a pixel high.
5 changes: 5 additions & 0 deletions .changeset/canvas-image-formats.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

The browser reader decodes GIF, WebP and BMP images as well as PNG and JPEG — every format Core sizes — instead of painting their placeholder.
5 changes: 5 additions & 0 deletions .changeset/chromium-line-breaking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

Lines break where Chromium breaks them in every language. Each text item reads the ICU line rules its content language (`lang`) and `line-break` value select, as Chromium's ICU does: Chinese text, and Japanese and Korean text under `line-break: normal` or `loose`, reads the curly double quotes as brackets and may start a line with 〜 or ゠ (Japanese breaks only by default otherwise); `loose` also breaks before iteration marks and centered punctuation and between inseparables; a quotation mark breaks only between East Asian characters; and a number keeps its prefix and postfix together only as a number does. `word-break: break-all` and `keep-all` add and withhold breaks per text item as Blink does, and `line-break: anywhere` applies only to its own text. A line broken before spaces ends after them (a space followed by an ideographic space ends the line after the space), and a no-break space never hangs past the line's end. `-webkit-line-break` and `-epub-word-break` (and `-epub-text-transform` and `-epub-caption-side`) reach the engine as the properties Chromium aliases them to.
5 changes: 5 additions & 0 deletions .changeset/clearing-block-keeps-its-margin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A block with content that clears the floats before it keeps its top margin inside its container, as Chromium settles the container's position above a block cleared past adjoining floats: floats opening a box no longer move down by the margin of the paragraph that clears them.
5 changes: 5 additions & 0 deletions .changeset/closers-before-a-break.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A chapter written as one long `<br>`-broken paragraph no longer has its text shaped again for every wrapped line that ends in a closing bracket or quote before a `<br>`; what is laid out is unchanged.
5 changes: 5 additions & 0 deletions .changeset/closers-trim-across-elements.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A closing bracket or quote that overflows a line by half its width is trimmed to keep it on the line when the line crosses an element boundary and when the closer ends its element, as Chromium does since version 153: such a line no longer sends a whole note or the run after an annotated name down to the next line, and a trimmed closer keeps the end padding of the box it closes.
5 changes: 5 additions & 0 deletions .changeset/column-images-snap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An image in a vertical line paints placed by its `object-fit` and snapped to whole CSS pixels, as an image in a horizontal line does: a plate centred down a column no longer lands a pixel off.
5 changes: 5 additions & 0 deletions .changeset/contain-snaps-after-placement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An image letterboxed by `object-fit: contain` is placed in its unsnapped box and the placed rect snaps to whole pixels, as Chromium snaps it: a thin rule image scaled into a fractional box now rasters on the one row the browser draws it on instead of smearing across two. A raster placed under a pixel tall or wide keeps one pixel where its start rounds, as the browser keeps it, instead of reaching the hosts as an empty image they reject; only one thinner than four LayoutUnits paints nothing.
5 changes: 5 additions & 0 deletions .changeset/han-kerning-classes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

Adjacent CJK punctuation trims by Chromium's punctuation classes for every bracket and quote: the CJK double prime quotes (`〝〞〟`) and any other fullwidth bracket trim like `「」`, a fullwidth opener after a narrow one (`(「`) and a fullwidth closer before a narrow one (`」)`) trim, the middle dots `·` and `‧` make their neighbours trim as `・` does, and each of these closers can trim at a line end.
5 changes: 5 additions & 0 deletions .changeset/inline-block-margin-box.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An inline block stands on its line by its margin box, as Chromium lays it out: its margins, borders and padding surround its content, take their room along the line and push its last line's baseline down, so the line it rides grows by them (a translation wrapped in `display: inline-block; margin: 8px 0` sits 8px clear of the text above and below it).
5 changes: 5 additions & 0 deletions .changeset/inline-blocks-as-atomic-inlines.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An element styled `display: inline-block` lays out as Chromium's atomic inline whatever its tag: it takes its own `width` and `height` (a percentage across a vertical line resolving against the page when the line's own size is open, as Chromium's orthogonal fallback does), an empty one still stands on its line at its size, and one holding blocks lays them out inside it. calibre's centred-plate pages now land on the page Chromium shows them on, with the plate centred across it.
5 changes: 5 additions & 0 deletions .changeset/inline-box-after-forced-break.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An inline-block right after a forced break starts the next line when a box measures its content's widest line, as Chromium measures it: a shrink-to-fit table column holding `text<br><inline-block>` takes the wider of the two lines instead of their sum, and an inline box opening there brings its padding along.
5 changes: 5 additions & 0 deletions .changeset/inline-table-monolithic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

An inline table (`display: inline-table`) moves to the next page whole when it does not fit what is left of the page, as Chromium fragments an atomic inline, instead of breaking between its rows like a block table.
5 changes: 5 additions & 0 deletions .changeset/justified-item-exact-advance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

On a justified line, each inline item (a ruby pair, a styled span, the text between them) ends at the 1/64px ceiling of its exact advance, its glyphs' fixed-point advances plus its justification shares, as Chromium snaps an item's width; a share that lifts an item only slightly past a grid point no longer leaves it on the point below.
5 changes: 5 additions & 0 deletions .changeset/justify-no-break-space.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A justified line spreads the gap after a no-break space with the other word gaps, as Chromium treats the no-break space as a space when it justifies (a numbered item such as "2. Particular care…" with a no-break space after its number no longer keeps that gap narrow), and a no-break space ending a justified line counts as content instead of hanging.
5 changes: 5 additions & 0 deletions .changeset/ligature-joins.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A ligature paints as one cluster from its start, and the cluster after it joins when the whole ligature steps by its glyph's advance, so the GPU pen and the canvas pen both draw the ligature the font forms: an embedded face's contextual pair of em dashes no longer paints as two isolated dashes a pixel above the browser's joined bar.
5 changes: 5 additions & 0 deletions .changeset/line-breaker-defects.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A `<br>` breaks the line under `line-break: anywhere` and after a preserved space, a paragraph shaped as one run longer than 64 KiB lays out instead of failing, a ligature is measured by its own glyphs in any run, a line rewound to the start of an item keeps an inline image that comes before it, an ideographic space (or another space separator) that overflows a line hangs past its end where the line may break after it, as Chromium hangs it, and a short ruby (a base of at most four glyphs under an annotation of at most eight) moves to the next line whole instead of breaking inside its base, as Chromium keeps it.
5 changes: 5 additions & 0 deletions .changeset/line-end-reshape.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A line's last glyph is measured as Chromium reshapes a line's end: where the shaper marks the break after it unsafe (a kern pair with the space that hangs after it, as Tinos kerns "A" and "’" against the space, or with the next line's first character), the glyph takes the advance it shapes to alone. A line that fits only with that kerning breaks before the glyph, as Chromium breaks it, and a justified line spreads the slack its unkerned end leaves, in Latin text as in CJK.
5 changes: 5 additions & 0 deletions .changeset/lines-decided-as-broken.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A paragraph's line edges (a closer trimmed to fit, a punctuation pair a break separates, a ruby base split across lines) are decided one line at a time as the line is broken, so a paragraph is built at most twice however many lines decide; a pair trim a later line moved away from its break is applied again, as Chromium applies it.
5 changes: 5 additions & 0 deletions .changeset/margin-sets-through-wrappers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

Margins collapsing through several plain wrappers join as one set, the largest positive plus the most negative, as CSS collapses adjoining margins: a negative margin deep in a chain of wrappers no longer cancels against only the nearest one, which left a title page's heading lower than in the browser.
6 changes: 6 additions & 0 deletions .changeset/one-reader-paged-and-scrolled.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@ritojs/kit': minor
'@ritojs/react': minor
---

A book read in pages and scrolled is one reader: switching between them lays the open book out again instead of opening it a second time. The page controller's `suspend()` hands its reader to another view (its canvas off the page, its page buffers let go, no painting, turns, keys or layouts answered, while its annotations, search and stored position stay and its layout calls still lay the reader out), `resume()` takes it back as laid out then, and `suspended` says which. `useRitoScrollView(controller, { active, paged, scroll })` in `@ritojs/react` runs the switch: the reader laid out scrolled and shown from where the pages were, then paged again from where the view was read. A scroll view has its windows as soon as it is made, so it can be moved before it is mounted, and through every new layout it stays on the window the reader reads, which a chapter laid out alone and the whole book number differently (switching to scrolled used to land at the book's start once the whole book was laid out).
5 changes: 5 additions & 0 deletions .changeset/ruby-line-edge-alignment.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

In a justified paragraph, a ruby whose annotation is wider than its base sets its base against the line's start when it opens a line, and against the line's end when it ends a justified line, as Chromium aligns ruby at line edges; elsewhere the base stays centered under its annotation.
5 changes: 5 additions & 0 deletions .changeset/ruby-overhang-at-line-edges.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A ruby whose annotation is wider than its base overhangs the text before it only when that text is on its own line, as Chromium lays it out: a ruby opening a line starts its annotation at the line's start. A justified, centered or right-aligned line that ends where the next element's first character did not fit aligns as Chromium aligns it, counting each ruby on it at its full width, so such a line ending at a ruby is not stretched.
5 changes: 5 additions & 0 deletions .changeset/ruby-reaches-above-the-line.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A paragraph's first-line ruby reaches into the space above the line before the line grows, as Chromium lays it out: the collapsed margin above the paragraph and the space under the previous paragraph's last line, not across a top border or out of a paragraph that is its own formatting context; a ruby line that opens a page takes its whole height there.
5 changes: 5 additions & 0 deletions .changeset/scroll-highlight-hits.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/kit': minor
---

A scroll view says which of the app's highlights the pointer is on, the one drawn on top: its `tap` event carries `highlight` (the highlight's `id` and its `bounds` in screen coordinates), and the new `highlightHover` event tells the one under a resting mouse each time it changes or the strip moves it, null once the mouse leaves or presses, so an app opens an annotation's editor on a tap and shows its tooltip on hover in a scrolled view as a page view's `annotationClick` and `annotationHover` let it.
5 changes: 5 additions & 0 deletions .changeset/scroll-page-length.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/kit': minor
---

A scroll view's `pageLength` says how far a page moves its strip, as PageDown and PageUp move it (the view's length along the axis less two lines), so an app's own page commands — a menu's Previous and Next Page — move it as the keys do.
5 changes: 5 additions & 0 deletions .changeset/scroll-selection-handles-hook.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/react': minor
---

`useScrollSelectionHandles(controller)` gives a scrolled view's selection ends where the view shows them, following the strip as it moves, with `focusEdge` naming the focus: what a toolbar over a scrolled selection stands on, as `useSelection`'s `focusRect` is for pages. `ScrollSelectionHandles` is built on it.
5 changes: 5 additions & 0 deletions .changeset/scroll-view-selects-in-the-app.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/kit': patch
---

Text selection works in a scroll view a React host mounts through a ref: mounting the view again where it already is no longer lays the strip out again, which ended every drag and double press and, with each rest re-rendering the host, laid the strip out on every frame. While a selection is being made the whole-book layout waits, as it does for the page controller, so a layout landing mid-drag does not end the gesture.
7 changes: 7 additions & 0 deletions .changeset/scrolled-reading.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@ritojs/core': minor
'@ritojs/kit': minor
'@ritojs/react': minor
---

Scrolled reading: a reader created with `spread: 'scrolled'` lays each chapter out as one continuous strip read through windows the size of the viewport, one window a spread, down the screen, or leftwards for a book whose spine's `page-progression-direction` is `rtl` (its vertical-rl chapters run leftwards as strips; a chapter whose text runs across the book's axis is paginated, each page one window). `getScrollLayout()` gives the windows end to end (axis, window length, each chapter's first spread, window count and extent), a located page's `blockOffset` says where the locator's line starts in its window, and a target the size of a window paints that window alone. The kit's `createScrollController(reader, canvas, { physics, input })` shows the windows end to end on one canvas at whole device pixels, keeps each window's picture while it is near, tells the reader which window is under the reading line, reports where the reader reads at rest and what a tap is on, and moves by `defaultScrollPhysics` or any `ScrollPhysics` an app gives; an app drives it itself with `grab`, `follow`, `release`, `scrollTo`, `scrollBy`, `scrollToSpread` and `scrollToLocator`. The view selects text with a mouse drag or a touch held still across windows (word and paragraph presses, scrolling on near the ends) and moves the selection's focus with Shift chords, following it off screen, draws the selection over each window and finds it again in a new layout (`selection` event, `selectionRects`, `clearSelection`), and `setHighlights` draws an app's search matches or annotations as page rects over the same windows (`viewRects` maps page rects onto the view, `canvas` is what it draws on); with `a11y` it mirrors the text on screen for screen readers once the strip rests. Its `scroll` event says how far through the book the strip is (`progress`, with the view's own length as `viewport`). `useRitoScrollReader` in `@ritojs/react` owns a scrolled reader and its view for a component (`containerRef`, `load`, `unload`, and `progress`, `position` and `selection` as state), and `ScrollSelectionHandles` draws its selection handles for touch input; the kit view gives the handles (`selectionHandles`, `beginSelectionHandleDrag`) in the page controller's shapes.
5 changes: 5 additions & 0 deletions .changeset/software-webgl-canvas-pen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

Where WebGL is a software rasterizer (SwiftShader, llvmpipe — a machine with no GPU), the canvas pen paints every page and the GPU only copies it in, as it already did where the browser refused WebGL for a performance caveat: Chromium creates a context on SwiftShader all the same, and the GPU pen there blended text a level or two off the canvas.
5 changes: 5 additions & 0 deletions .changeset/text-emphasis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': minor
---

Emphasis marks paint as Chromium paints them. `text-emphasis-style`, `text-emphasis-color`, `text-emphasis-position` and the `text-emphasis` shorthand (with their `-webkit-` spellings, and the `-epub-` spellings of all but the position) reach the engine; a character that takes a mark gets one, set in its face at half its size, outside its em box on the side the position names (a vertical line's right unless it says left), an upright mark centred on it down the column. Marks over a line push it down by what the room under the previous line's text does not absorb, marks under one grow its box, and the next line rises into that growth by the room above its own text.
5 changes: 5 additions & 0 deletions .changeset/unlinked-stylesheets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ritojs/core': patch
---

A chapter lays out under the stylesheets it links and embeds and no others, as a browser applies them: a chapter without a `<link>` no longer takes every stylesheet the package lists (a book's unlinked note and plate pages keep their default paragraphs and image layout where its stylesheet indents and frames the other chapters).
7 changes: 7 additions & 0 deletions .changeset/vertical-records.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@ritojs/core': minor
'@ritojs/kit': minor
'@ritojs/react': minor
---

A vertical-rl page's targets, outline, range rectangles and carets are where its columns are drawn, in the same page-content space as a horizontal page's, paged or scrolled; a scrolled window's records move with its pixels by the device rows it is drawn from. A caret's `geometry` gains `width`: it is the segment across its line, `width` 0 on a horizontal line and `height` 0 down a vertical one, and the kit projects it with that shape. `ReaderTextCaret.writingMode` (`ReaderWritingMode`) is the mode of the caret's line, and the kit's keyboard selection reads an arrow key on a `vertical-rl` focus as the key a quarter turn from it, as the browser does (down moves along the line, left to the next line). The React selection handles hang their knobs off the right and left ends of a caret across a vertical line, as they hang them over and under one across a horizontal line.
Loading
Loading