Commit Graph
1246 Commits
Author SHA1 Message Date
aiongg 2f8bdf22b8 Merge track r1-app (fredapps-r1)
ROADMAP.md, docs/roadmap.md: keep next's status line; keep both progress-log entries
2026-10-16 14:12:15 +00:00
aiongg 8898d0c9e5 Merge track r1-edit (fredapps-r1) 2026-10-16 14:11:53 +00:00
aiongg 8ef7e42377 Merge track r1-view (fredapps-r1) 2026-10-16 14:11:52 +00:00
aiongg d98b83fdce Merge track r1-output (fredapps-r1) 2026-10-16 14:11:52 +00:00
aiongg 2d5809b7a6 Integration: #2809 opening a document into Read mode puts the tool down 2026-10-16 14:03:56 +00:00
aiongg eb7e0d9d3e Merge PR #2809: fix(ui): Read mode hides the quick toolbar (#2646) 2026-10-16 14:03:20 +00:00
aiongg e1a1d4211e Integration: #2638 a new drag over copied text shows the action bar again 2026-10-16 14:03:20 +00:00
aiongg 7063c113f1 Integration: #2793 export images with a malformed Decode using the default mapping
A Decode of the wrong length or with a non-number entry made Save Image As
fail and Export All Images skip the image, which earlier versions exported.
2026-10-16 14:02:52 +00:00
aiongg c198fbb509 Merge PR #2638: fix(ui): Copy in the selection action bar closes the bar 2026-10-16 14:02:30 +00:00
aiongg 6431fdfb88 Merge PR #2703: Go to page brings the page into view horizontally too
crates/ui-egui/src/canvas.rs: goto branch keeps #2595's clamped vertical offset, then #2703's horizontal block
2026-10-16 14:02:30 +00:00
aiongg 0c0995b62e Merge PR #2595: M3: a page jumped to in single-page view no longer hops into place
crates/ui-egui/tests/view.rs: kept #2587's two tests and #2595's test, all after single_page_layout_shows_one_page_at_a_time
2026-10-16 14:02:21 +00:00
aiongg 2366b0c513 Merge PR #2710: fix(edit): wrap single turned rows at the page margin (#2578) 2026-10-16 14:02:18 +00:00
aiongg 53b8fda93f Integration: #2532 save the structure-tree test without object streams
The default save packs annotation dictionaries into compressed object
streams, so the URL and comment-text byte checks passed without the fix.
2026-10-16 14:02:18 +00:00
aiongg d77066be2b Merge PR #2577: M7: rewrap a paragraph at a slant at the width its rows have 2026-10-16 14:02:18 +00:00
aiongg 28942c4c7d Merge PR #2558: fix(edit): emit rewritten paragraph after backgrounds between its rows (#2377) 2026-10-16 14:02:18 +00:00
aiongg 6ad30957c3 Merge PR #2590: fix(edit): keep overlapping watermarks and distinct paragraphs on text edit (#1756) 2026-10-16 14:02:17 +00:00
aiongg 62f3375297 Merge PR #2594: M7: write a full font program compressed and find it again on any page 2026-10-16 14:02:17 +00:00
aiongg 5406355729 Integration: #2681 make the self-reply assertion able to fail 2026-10-16 14:02:13 +00:00
aiongg dfcb844340 Merge PR #2794: Fix wrapped revision buttons overlapping Binding 2026-10-16 14:02:10 +00:00
aiongg 9477e2a3fd Merge PR #2793: M10: preserve component Decode in lossless image export 2026-10-16 14:02:08 +00:00
aiongg 405ad489c2 Merge PR #2681: Replace Text: give the caret its own /NM (#2666) 2026-10-16 14:02:08 +00:00
aiongg fae7f4451c Merge PR #2532: fix(redact): removed links and comments leave the structure tree too (#2447) 2026-10-16 14:02:08 +00:00
aiongg c2a634ec4c Merge PR #2816: M10: running text is not a table row in Word, HTML and PowerPoint export (#2806) 2026-10-16 14:02:08 +00:00
aiongg a17794f170 Merge PR #2698: M8: the redaction audit finds a cover over one word of a long line (#2662) 2026-10-16 14:02:08 +00:00
aiongg 5ed4b67bab Merge PR #2754: Keep leading spaces and tabs when wrapping plain text into a PDF 2026-10-16 14:02:08 +00:00
aiongg 8c5074b982 Merge PR #2600: Shorten over-long part file names in doc_split by bookmarks 2026-10-16 14:02:08 +00:00
aiongg 0b68d0e3c6 Merge PR #2679: fix(annot): percent-encode non-ASCII bytes written into link /URI 2026-10-16 14:02:08 +00:00
aiongg 624e6343fb Merge PR #2587: M3: single-page view turns pages without a blank frame 2026-10-16 14:02:07 +00:00
aiongg 938d171652 Merge PR #2730: M3: closing PdfCraft while minimized no longer saves a 0 x 0 window 2026-10-16 14:02:07 +00:00
aiongg ca443792d3 Merge PR #2810: fix(select): a picked picture that is edited away no longer leaves its highlight behind 2026-10-16 14:02:07 +00:00
aiongg d3ca9ea7aa Merge PR #2606: M14: no PdfCraft lion over PDF thumbnails and the preview pane 2026-10-16 14:02:07 +00:00
aiongg 17b7effd6f Merge PR #2704: M3: ⌘G and ⇧⌘G step through matches from the find field (#2669) 2026-10-16 14:02:07 +00:00
aiongg cc898fc382 Merge PR #2601: Web: host mode needs a parent page on the same origin 2026-10-16 14:02:07 +00:00
aiongg 3eaff53a94 Merge PR #2642: Let the page range select page 1 alone 2026-10-16 14:02:07 +00:00
aiongg 2b3bbd0690 Merge PR #2625: fix(ui): Reveal in File Explorer selects files whose path has a space (#2579) 2026-10-16 14:02:07 +00:00
aiongg e947aa6754 Merge PR #2757: fix(ui): Save asks where to keep an Apple Mail attachment 2026-10-16 14:02:07 +00:00
mtlcl410andClaude Opus 5.5 30c174be9e M3: closing PdfCraft while minimized no longer saves a 0 x 0 window
eframe stores the window's size and place just before App::save. A
minimized window has none: Windows reports 0 x 0 at (-32000, -32000),
and the next start opened at egui's 64-point floor in the screen's
corner (seen on a 6K display at 225%: a 144 x 206 px window). While the
window is minimized the app now puts back the last settings it was
shown with (or none), and a window that opens at that floor from
settings saved before this fix is given a usable size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 19:20:47 +08:00
hade0ntemaandClaude Sonnet 5.5 37a9346629 fix(select): clear the picked picture in the edit itself, not on the next frame
The first fix dropped a stale pick while painting the next frame. The window only redraws on
the next input, so after deleting a picture in Edit text & images its highlight stayed on screen
until the user clicked. Clear the pick in apply_edit, in the same step as the edit, and ask for a
repaint. drop_stale stays for the paths that change the document without apply_edit (Undo, Redo).

An edit-level test checks the pick right after apply_edit with no frame in between; it fails
without the change. The earlier one-frame test could not tell, the test harness redraws more
often than the app does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 11:49:06 +02:00
mtlcl410andClaude Opus 5.5 96478f325d fix(ui): test that the Explorer argument reaches the process as written (#2579)
Review of #2625: the test checked the argument reveal_command builds but
not how it is passed, so it still passed with raw_arg replaced by args.
The process is now built by reveal_process, and a Windows test runs it
on `cmd /c echo`, which prints its command line back: with Rust's own
quoting the argument comes back wrapped in quotes with the inner ones
escaped, and the test fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 17:40:55 +08:00
mtlcl410andClaude Opus 5.5 f9db1e31fd M10: running text is not a table row in Word, HTML and PowerPoint export (#2806)
Table detection took a sentence whose link was set in another colour
and font, split into blocks that run on into each other, for two table
columns, and took a paragraph's lines, whose box overlaps the line
before, for a cell beside it. The table it built put the paragraph's
first line in one cell, a fragment of the link in another, and dropped
the paragraph's later lines. A block that starts where another on the
same line ends now adds no column of its own, and a row whose cells
overlap is not a table row; a superscript beside a number stays in its
table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 16:47:49 +08:00
hade0ntemaandClaude Sonnet 5.5 da48b84b8c fix(select): a picked picture that is edited away no longer leaves its highlight behind
With the Select tool a click picks a picture and draws a blue highlight over it. The pick was
only cleared by Escape, a drag or another click. Picking a picture, then entering Edit text &
images and deleting it left the highlight on the empty spot, with nothing left to click to
remove it.

The pick now remembers the document's edit generation and is dropped once the document has been
edited since (a delete, a move, Undo), the same condition under which the copy shortcut already
refused it as stale.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 10:33:24 +02:00
Enrico SitaandClaude Opus 5.5 c66384f92b fix(ui): Read mode hides the quick toolbar (#2646)
Read mode hides the tools, not the navigation panes, as Acrobat's does
and as switch_mode already says, but the floating quick toolbar was
still drawn over the page there. It is now hidden in Read mode, and
entering Read mode puts the current tool down (back to Select), so no
markup tool stays active without a toolbar to show it. The right rail,
the page navigation and the V/H shortcuts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 10:27:59 +02:00
Ahmad Mujahid e447749109 Fix wrapped revision controls overlapping Binding (#2739) 2026-10-16 11:22:54 +04:00
Ahmad Mujahid 9409265c35 M10: apply component Decode during lossless image export 2026-10-16 11:06:55 +04:00
Marco Arnulfo c736697680 fix(ui): Save asks where to keep an Apple Mail attachment (fixes #2751) 2026-10-16 06:13:19 +02:00
NetterSilverandClaude Haiku 5.5 fdc8099ac2 Keep leading spaces and tabs when wrapping plain text into a PDF
Found while testing crates/fonts/src/lib.rs:79 (wrap_with), called from crates/create/src/lib.rs:set_text

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 04:08:29 +00:00
skylar taylor-barrick f0c9901c39 Merge pull request #2727 from dylanmtaylor/ci/craft-common-actions
ci: add nix check workflow
2026-10-15 21:25:16 -06:00
Dylan M. Taylor 8fa6fecf70 ci: add nix check workflow 2026-10-15 21:17:37 -04:00
Chiranjeevi Uandskylar taylor-barrick 5fdd820bdb fix(ui): validated signature display, snapshot tab reuse (#1895)
* fix(ui): validated signature display, snapshot tab reuse

Signature widgets with layered appearances baked the unverified state
into the page, so a valid signature kept reading 'Signature Not Verified'
while the banner and panel said valid. Validated verdicts are now drawn
into the icon and caption layers in the display copy only: the signed
bytes are untouched, saving keeps the original appearance, and files
without those layers or without a valid verdict render exactly as before.

Other valid signatures still get the verdict mark over their widget,
sharing one style with the Signatures panel, and hide it again once the
appearance itself shows the verdict.

View signed version and View revision opened a new tab on every click,
and every tab showed the document title, so repeats piled up identical
tabs. Repeats now reuse the snapshot tab, snapshot tabs read like their
source plus the suffix in the tab strip, window title and Combine picker,
and carry a notice bar naming the revision with a Close that asks about
saving first.

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>

* Address review comments on validated appearances and trust refresh

Count every field when checking shared appearance streams, so a
caption shared with an unvalidated field is never rewritten for the
valid one alone.

Pick the icon slot by drawing instead of length, and only when a
single layer qualifies. Bare rectangles never count as the icon, and
ambiguous or missing slots fall back to the overlay badge.

Revalidate and invalidate together through one helper, so trusting a
certificate always drops rendered pages. Trust alone still marks
nothing dirty.

Tests: mixed-verdict sharing, longer decorative borders, competing
and doubled layers, capture-before preservation, trust invalidation
without zooming, and signed Session round trips with rendering,
saving and passwords.

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>

* Prove the icon slot geometrically and cover real layered signatures

A lone line drawing is still not the icon: frames and borders span the
box while the status mark lives in a corner of it. The icon now has to
sit strictly inside the appearance frame and cover at most half of it;
anything else falls back to the overlay badge. Widgets without a
measurable frame veto the rewrite the same way.

Tests: parsed extents and inhabitant checks as units, both reported
border repros plus a frameless widget, and real layered signatures
built with cms::sign_detached through Session open, trust, rendering,
save and reopen, plain and password-protected.

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>

* Identify the icon by shape instead of geometry

A lone line drawing is still not the icon, but size and position were
the wrong signals: the real status mark is large, and geometry blocked
it. Frames, borders and panels are rectangles by nature while the mark
is not, so a drawing made only of axis-aligned rectangles is decoration
however it is stroked. Singularity, shared-stream and template checks
are unchanged; anything ambiguous still falls back to the overlay badge.

Tests: rectangularity as a unit, nested line-drawn frames, and a
triangular fixture mark in place of the rectangular one.

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>

* Budget the appearance walk and keep the marks with the bytes

The walk that finds a signature's icon and caption capped depth,
layers and fields, but not the work: a dictionary whose entries all
point at the next one is visited once per entry per level, so a small
hostile file never finishes opening. The walk now counts its visits
and gives up, and a field whose tree cannot be read to the end stops
the whole pass, because a layer we never read may be the one two
fields share and a rewritten shared layer puts one field's verdict on
another field's page. The sharing count is exact again with that: two
widgets of one field pointing at the same appearance claim it once,
or the field vetoes its own rewrite.

A mark used to outlive the bytes it described. A failed display write
left the page showing the file's own caption while the verdict still
claimed its state was drawn; a metadata edit dropped the mark while
the page kept drawing the state, so the badge landed on top of it. The
write fallback now drops the marks and logs the loss, and metadata
carries them over.

Tests: a self-referential appearance tree, which never finished before
the budget, two widgets sharing one appearance, a metadata edit that
keeps its mark, a save that goes through the writer instead of
short-circuiting on the opened file, and the snapshot bar's Close
button pressed for real.

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>

* Cite the new regressions in parity, restore main's installer note

The appearance entry now cites the bounded walk and the save through
the writer, and says what a tree that cannot be read to the end does.
The installer entry carried main's older text, which still claims
signed installers are planned; main's newer note is taken verbatim.

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>

* M9: preserve rounded decoration beside raster status glyphs

* M9: place appearance progress beside signature history

* M9: retain appearances with ambiguous curved layers

* M9: keep signature verdicts in viewer overlays

Defer generic appearance rewriting: caption text and a unique drawing do not establish an icon role. Preserve original artwork for saves, image and text exports, and both print modes while retaining snapshot reuse and trust refresh. Cover chamfered borders and mixed signer/caption streams through signed Session round trips.

---------

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>
Co-authored-by: skylar taylor-barrick <hi@skylar.cc>
2026-10-15 19:16:48 -06:00
jonathanwxh-cell 9229e7af36 fix(edit): wrap single turned rows at the page margin (#2578) 2026-10-16 08:13:01 +08:00