Commit Graph
3914 Commits
Author SHA1 Message Date
aiongg ee5ea72aea Merge pull request #1857 from Silvertree2010/fix/h2736-iso-date-parser-accepts-any-char
Reject ISO timestamps without ':' between hour and minute
2026-11-03 12:58:13 -05:00
Dylan M. Taylor ad3b32fbf6 hyphenation: linear heuristic, cache misses outside the lock (#2185)
* hyphenation: linear heuristic, cache misses outside the lock

The syllable heuristic built each word suffix as a String to test it, which is
quadratic in the word's length; it now uses prefix sums of vowels and UTF-8
lengths. Mapping a word's break points to glyphs scanned the word for each
point; both are indexed once per word. A word not in the hyphenation cache is
worked out without holding the cache's global mutex.

* hyphenation: compare the word ending with ends_with
2026-11-03 11:07:41 -05:00
Dylan M. Taylor f1bdec7fee compose cache: compact neighbour signatures, resolve each anchored host once (#2186)
A cached story copied every wrap neighbour's whole signature and item list into
its entry; stories on one spread share its wrapping items, so entries grew with
all of theirs together. A neighbour's signature now goes in as its hash and its
items are kept once each.

Anchored-frame placement asked for the host's composition once per frame, and
again at every level a host was reached from. Each host is now asked for once
per placement pass, and the cache and the uncached path remember the hosts they
resolved for the whole traversal.
2026-11-03 07:05:57 -05:00
Dylan M. Taylor 386b600572 compose: index lookups that were quadratic in a paragraph, line or table (#2180)
- Footnote references on a line are deduplicated with a set instead of
  searching the references collected so far.
- Nested styles stream the paragraph up to their delimiter with one character
  of lookahead instead of copying the rest of the paragraph for each style,
  and a delimiter's characters are indexed once per style.
- Shaping resolves which nested/GREP style is on top with one sweep over the
  overlay boundaries instead of scanning every overlay for each stretch.
- Column rules group crossing lines by paragraph through an index.
- Table fragments index each row's top once instead of searching the rows
  for every cell.
2026-11-03 06:48:12 -05:00
aiongg e55982fed7 Merge pull request #1951 2026-11-03 05:56:43 +00:00
Brandon Thomas b90a1bbb23 Merge remote-tracking branch 'origin/main' into HEAD 2026-11-02 23:25:39 -05:00
Brandon Thomas 58149665d9 Merge remote-tracking branch 'origin/main' into HEAD 2026-11-02 23:24:47 -05:00
Brandon Thomas ab96d42696 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	docs/ui-parity.md
2026-11-02 23:24:47 -05:00
Brandon Thomas 312eefac9b Merge pull request #1493 from Hamza0101/fix/overset-export-warnings
An export says what text its pages had no room for (#1465)
2026-11-02 23:24:29 -05:00
Brandon Thomas 7526fe2d43 Merge pull request #1993 from Silvertree2010/fix/h3886-striped-and-wavy-strokes-draw-a
Keep stroke styles from joining the subpaths of a compound path
2026-11-02 23:24:17 -05:00
Brandon Thomas 1e2d75d0b0 Merge pull request #2125 from Tom-R-Main/openbytes-title
File import: keep native and IDML bytes out of the INDD converter
2026-11-02 23:24:12 -05:00
Brandon Thomas a4a4cd6ee9 Merge pull request #2141 from Silvertree2010/fix/h5392-data-merge-record-range-accepts
Reject signed record numbers in data merge record ranges
2026-11-02 23:24:08 -05:00
Brandon Thomas 3eb8091bac Merge pull request #2142 from TrevorBrown-dev/fix/variables-numeric-text
M3: a Custom text variable defined with a number shows its digits (#2093)
2026-11-02 23:23:59 -05:00
Brandon Thomas 94fb5b074c Merge pull request #2153 from Silvertree2010/fix/h5779-pathdata-bounds-ignores-single-a
Include single-anchor subpaths in PathData::bounds
2026-11-02 23:23:55 -05:00
Brandon Thomas af9706176a Merge pull request #2165 from 4waymedia/fix/links-status-by-date
Links: an unchanged linked image is not read again on every poll (#2164)
2026-11-02 23:23:46 -05:00
Brandon Thomas add101f2bd Merge pull request #2160 from 4waymedia/fix/color-picker-clipped
Dialogs: the Color Picker opens at its full height (#2129)
2026-11-02 23:23:42 -05:00
Brandon Thomas ae86d466f7 Merge pull request #2162 from 4waymedia/feat/color-picker-remembers-component
Color Picker: reopens on the component it was left on
2026-11-02 23:23:37 -05:00
Brandon Thomas f87f232724 Merge pull request #2169 from ljkx/indent-to-here
Text: Indent to Here indents the paragraph's later lines to the character (#2080)
2026-11-02 23:23:33 -05:00
Brandon Thomas 0cdac69e66 Merge pull request #2174 from Silvertree2010/fix/2173-bug-report-designcraft-export-ta
Keep style export tags and classes on IDML import and export
2026-11-02 23:23:28 -05:00
Brandon Thomas fc9fbfda4c Merge pull request #2176 from Silvertree2010/fix/2175-bug-dotted-paragraph-border-prod
Space dotted paragraph border dots evenly
2026-11-02 23:23:24 -05:00
Brandon Thomas 462062e99b Merge pull request #2190 from JonRC/type-char-missing-font-warning
type.char: warn when the font family or style isn't available (#2189)
2026-11-02 23:23:20 -05:00
Brandon ThomasandClaude Opus 5.5 4c2296491e Links: key the image check cache on the resolved file, not the link text
A relative link names another file once the document is saved elsewhere,
so a status remembered for the old file must not answer for the new one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:09:34 -05:00
JonRC 6abeb8a1ca type.char: warn when the font family or style isn't available (#2189)
A fontFamily the app doesn't have was applied with a null result, so a
script that asked for Courier Prime exported the PDF in the substitute
and exited 0. The font is still applied, since documents can carry
missing fonts and Find Font and preflight list them, but type.char now
returns {"warnings": ["Missing font: Courier Prime (using Source Sans 3)"]},
or "Missing font style: ..." for a style the family doesn't have, in
preflight's words. Other calls still return null.
2026-11-03 01:00:19 -03:00
Dylan M. Taylor 74eab18d16 Assets: index placed files by content so importing many graphics stays linear (#2181) 2026-11-02 22:51:17 -05:00
ljkx 70a76b15c5 Text: test that a list number's Indent to Here wins over one in the drop cap (#2080)
The drop cap is set at the indent and the list number beside it, so the
number's character is the later one on the line and sets the indent.
Pin that with a test, and say so where the character is looked up.
2026-11-03 04:44:04 +01:00
ljkx 8013118a44 Text: Indent to Here in a drop cap or a list label indents the later lines too (#2080)
The character was looked up among the line's body glyphs, so one inside
the drop cap was missed, and one in a list number's ^i matched the first
body glyph (after the label's tab) instead of itself. Find it among the
placed glyphs, which include the drop cap's and the label's.
2026-11-03 03:53:41 +01:00
ljkx d0271a562f Text: Indent to Here beside a drop cap isn't indented by the drop cap again (#2080)
The lines after an Indent to Here start at the character, which already sits past the drop cap, but the lines beside the drop cap still added its width on top. They no longer do. Adds tests for the drop cap, for Indent to Here after a tab (the usual hanging number) and for a right-to-left paragraph, and documents how the indent behaves beside a text wrap.
2026-11-03 01:59:37 +01:00
Paul Gemignani 7d0f141b52 Links: an unchanged linked image is not read again on every poll (#2164)
links.list decided a placed graphic's status by reading the whole file and comparing it with the asset's bytes whenever the sizes matched, and the Links panel polls it twice a second, so a document of press-size images read every one of them in full on every poll. Image links now have the size-and-time fast path linked text files already had: a file of the remembered size and time isn't read, a new time is read once and remembered (unless the file changed in the last two seconds), a different size is modified without a read. The answer is keyed by the asset's bytes' identity, so a relink, update or undo can never be served a stale one; status() stays as the exact check for callers that want it.

Verified locally on a288a87b: fmt, clippy, engine link tests including the new unchanged_linked_images_are_not_read_again.
2026-11-02 16:40:46 -08:00
NetterSilverandClaude Opus 5.5 b4c9cb7d3a Space dotted paragraph border dots evenly
Fixes #2175

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:24:50 +01:00
NetterSilverandClaude Opus 5.5 7d1340a3df Keep style export tags and classes on IDML import and export
Fixes #2173

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:09:48 +01:00
ljkx 7e3d0fe2f5 Text: Indent to Here indents the paragraph's later lines to the character (#2080)
The composer treated Indent to Here as an invisible zero-width character and nothing else, so inserting it changed nothing. A line holding one now sets the start-side indent of the paragraph's following lines to the character's position, and those lines are broken again with the narrower measure. The indent holds into the next columns and frames; a later Indent to Here in the paragraph replaces it.
2026-11-02 20:07:09 +01:00
FredApps f704f481d5 Merge remote-tracking branch 'origin/main' into pr1654
# Conflicts:
#	ROADMAP.md
2026-11-02 18:25:00 +01:00
Paul Gemignani 885793f763 Color Picker: reopens on the component it was left on
The picker opened with R selected every time, so anyone who works in H (the hue slider with the saturation/brightness field) chose it again on every open. The component now lives in the UI preferences (colorPickerComponent, default r, so existing preference files and openers that name a component behave as before) and the picker reads it on open and writes it when a radio button is clicked, as Photoshop's picker keeps its last mode.

Verified locally on a288a87b: fmt, clippy, the picker's tests; tried on macOS.
2026-11-02 08:44:19 -08:00
Paul Gemignani 5f86f33c42 Dialogs: the Color Picker opens at its full height (#2129)
A centred dialog window offers its body only last frame's height, and the Color Picker lays itself out on a fixed 566 x 334 canvas, so it opened clipped to its top strip behind a scrollbar: the colour field cut off, no value fields, no hex code, OK and Cancel visible but blind, and the window not resizable. The body's minimum scrolled height now covers the picker's canvas, as it already did for Numbering & Section Options.

Verified locally on a288a87b: fmt, clippy, the picker's own tests; opened on macOS at full height.
2026-11-02 08:09:15 -08:00
Hamza 2d5af1bd0d A frame that crosses into an exported page is checked on it
A sheet draws its spread's items without asking which page each one sits on, so
a frame straddling two pages is drawn, in part, on both. The warning chose the
page from the frame's centre alone (`page_at_x(bounds.center().x)`), so a frame
centred on a page the export leaves out had its warning dropped while the part
on an exported page went into the file (noted in review).

`pages_of` gives every page of the spread the frame's bounds overlap, and the
story is kept when any of them is exported.

The page named is one the export has: the centre page when that is exported, so
an ordinary frame reads exactly as before, otherwise the first exported page the
frame reaches. A frame wholly on the pasteboard overlaps no page's span and
falls back to `page_of`, so the two cannot disagree about where such a frame is.

`overset_location` returns the reached pages beside the centre page, which is
what made it worth a named type.

The test exports a frame centred on page 3 and reaching back into page 2, four
ways: the whole document, page 3 alone, page 2 alone -- which used to report
nothing -- and page 4, which the frame never reaches and which still reports
nothing.
2026-11-02 18:40:39 +05:00
NetterSilverandClaude Haiku 5.5 c065cec517 Include single-anchor subpaths in PathData::bounds
Found while testing crates/geom/src/path.rs:~335 (PathData::bounds)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 13:43:09 +01:00
Trevor BrownandClaude Fable 5.1 f5574b43dc EPUB cover test: an exclusive temp dir
tempfile::tempdir() in place of a PID-named folder, cleaned up on a panic too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 07:01:00 -05:00
Trevor BrownandClaude Fable 5.1 02b20fd5e7 M6: EPUB Export Options names a cover image file (#1934)
A Cover Image field with a Choose… button (PNG or JPEG) in the EPUB Export Options dialog; left empty, the first page stays the cover. The three labels are translated; a dialogs test exports with a chosen file and checks the EPUB's cover image and manifest.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 05:56:34 -05:00
Trevor BrownandClaude Fable 5.1 5de0a0b806 M3: variables.define refuses a text that is neither a string, a number nor a boolean (#2093)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 04:13:40 -05:00
Trevor BrownandClaude Fable 5.1 5b48a6fcf7 M4: the Pen's drag preview on a continued end point runs from the anchor it is joined to (#1438)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 04:04:42 -05:00
Trevor BrownandClaude Fable 5.1 93999750aa M4: the Pen previews the segment a dragged smooth point shapes and curves the rubber band after one (#1438)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 03:19:46 -05:00
Trevor BrownandClaude Fable 5.1 485a94673f M3: a Custom text variable defined with a number shows its digits (#2093)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 02:40:43 -05:00
NetterSilverandClaude Haiku 5.5 633bdb66bf Reject signed record numbers in data merge record ranges
Found while testing crates/engine/src/cmd/datamerge/parse.rs:212 (parse_record_no, used by select_range)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 05:10:06 +01:00
NetterSilverandClaude Opus 5.5 001053e0dd Fix dotted strokes dropping most of their dots
Fixes #1950

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 03:07:22 +01:00
aiongg cc3c70d4be Windows: keep the custom title bar window borderless (#2139)
winit 0.30 gives an undecorated window WS_CAPTION and WS_BORDER; on some systems the compositor
reserves that frame, so the content is drawn offset (black bars at the top and left) while the
pointer keeps the client coordinates. A per-frame guard strips the styles again after every
winit flag change and keeps a maximized window clear of the taskbar. Fixes #1295.
2026-11-01 20:39:44 -05:00
Tom MainandOpenAI Codex 6e1b6e7754 #2125: integrate upstream v0.16.0
Merge origin/main at a288a87b. Preserve the font.list progress entry and the content-first routing note. The feature diff remains the same four reviewed files.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
2026-11-01 16:30:57 -05:00
Tom MainandOpenAI Codex 60584e3221 #2108: prefer document content over InDesign filename extensions
Keep native ZIP, legacy JSON and IDML bytes out of the INDD converter even when a browser supplies a misleading .indd or .indt name. Preserve signature and unknown-data routing to the converter. Check that every browser delivery adds a document before asserting its title.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
2026-11-01 15:08:46 -05:00
Brandon Thomas a288a87bf6 Merge pull request #1018 from kler/swedish-ui
i18n: Swedish (sv) interface translation
2026-11-01 14:54:59 -05:00
Brandon Thomas 1b02e5427f Merge remote-tracking branch 'origin/main' into land-2109 2026-11-01 14:50:36 -05:00
Brandon Thomas 185412cdf9 Merge remote-tracking branch 'origin/main' into land-1018b
# Conflicts:
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/tests.rs
#	crates/ui-egui/src/menus/ui_commands.rs
#	docs/localization-parity.md
2026-11-01 14:50:19 -05:00