Commit Graph
100 Commits
Author SHA1 Message Date
Adrian 3850c9f52e M3: the titles follow a document opened while the window or tab is hidden (#3640)
eframe runs only App::logic while a window or browser tab is hidden, so a
?file= download that finished then opened the document without the titles
changing. The titles are now set at the end of logic as well as in ui.
2026-10-29 00:37:47 -04:00
Adrian 08f3991ab9 M5: Alt+Left / Alt+Right go back through the view history with a form field selected, judged by each press's modifiers (#3632)
Prepare's arrow nudge read the frame's Alt, so an Alt+arrow whose Alt was
let go in the same frame nudged the field instead. Each press's own
modifiers now decide, as for objects, pictures and comments.
2026-10-28 21:41:33 -04:00
Adrian 4b73850671 M3: the title marks drafts not yet applied, and the web page title names the file (#3640)
The dirty mark now follows has_unsaved_work, the same test the close
prompt uses, so text typed into a field or text box shows the mark before
it is applied. The web page's title, which an embedding host reads to tell
which file opened, now always names the file, even when the document asks
to show its own title; the native window title is unchanged.
2026-10-28 21:07:09 -04:00
Adrian 75f9c48c39 M3: the window-title save test removes its temp folder even when an assert fails (#3640) 2026-10-28 19:50:20 -04:00
Adrian dda63fda0f Window title: mark unsaved changes, and set it on the web (#3640)
The title now reads "<name> • — PdfCraft" while the active document
has unsaved changes, as the other Craft apps write it, and goes back to
"<name> — PdfCraft" once saved.

eframe's web runner ignores ViewportCommand::Title, so the web build
never named the open document. It now also sets the page's
document.title, which an embedding host reads to confirm which document
opened and whether it has unsaved changes.
2026-10-28 19:50:20 -04:00
Adrian 5d6f36f060 M5: Alt+Left / Alt+Right go back through the view history with a comment selected (#3632)
The comment nudge matched arrows with egui's key patterns, which let an
extra Alt through, so with a comment selected Alt+Left moved it a pixel
instead of going back. It now takes only arrows pressed alone or with
Cmd/Ctrl or Shift, judged by each key press's own modifiers, as the
picture and object nudge does.
2026-10-28 19:50:14 -04:00
Adrian 48090eadcd Alt+Left / Alt+Right go back and forward through the view history (#3632)
Previous view and Next view had only Cmd+[ / Cmd+] (Ctrl elsewhere), and
Alt+Left turned the page, since the arrow keys ignore Alt. The document
view now takes Alt+Left / Alt+Right (Option on macOS) for them, as Acrobat
and browsers do, before the arrows turn the page. Following a link
already records where it was followed from.

With a picture or objects selected in Edit text & images, the arrow-key
nudge ran first and also matched a press with Alt, so Alt+Left moved the
selection. It now takes only arrows pressed alone or with Shift, judged
by each key press's own modifiers rather than the frame's.

Help > Keyboard shortcuts lists the pair under the existing Previous view
/ Next view labels.
2026-10-28 19:50:14 -04:00
Adrian 20d396d180 M10: Markdown emphasis follows CommonMark's rules at run boundaries, and the export has a parity entry (#1595) 2026-10-28 15:56:25 -04:00
Adrian bcaead5404 M10: PDF ▸ Markdown export, through doc_export_office with a .md path (#1595) 2026-10-28 15:49:39 -04:00
jonathanwxh-cell fc65c6572e Merge upstream/main 2026-10-28 17:07:36 +08:00
jonathanwxh-cell fc010efe12 Merge remote-tracking branch 'upstream/main' into fix/cropbox-text-clipping 2026-10-28 16:17:07 +08:00
aiongg e8955737e0 Merge storytold/pdfcraft main 2026-10-27 20:52:31 +00:00
jonathanwxh-cell f3861659e0 Merge remote-tracking branch 'upstream/main' into fix/cropbox-text-clipping
# Conflicts:
#	crates/render/src/text.rs
2026-10-27 20:18:31 +08:00
jonathanwxh-cell 49d14c3871 Merge remote-tracking branch 'upstream/main' into fix/footnote-ref-line-selection
# Conflicts:
#	crates/render/src/text.rs
2026-10-27 20:14:52 +08:00
jonathanwxh-cellandjonathanwxh-cell 0a6d0f3689 fix(crypt): derive a new file id from the encryption seed
/ID is SHA-256 of the seed under the label id, not an unkeyed DefaultHasher digest. The salts test is a characterization; failing closed when randomness is missing stays the regression guard.

Co-authored-by: jonathanwxh-cell <jonathanwxh-cell@users.noreply.github.com>
2026-10-26 10:00:14 +00:00
jonathanwxh-cell 522653d6b1 fix(organize,print): join /Contents array pieces with a space (#3502) 2026-10-25 12:03:40 +08:00
jonathanwxh-cell 24edde6563 forms: clear typed XFA password field values from datasets on save (#3944) (#4506) 2026-10-24 21:08:21 -04:00
jonathanwxh-cell 4bf28ed735 Merge remote-tracking branch 'upstream/main' into fix/cropbox-text-clipping 2026-10-24 15:54:38 +08:00
Osvaldo DuranandClaude Fable 5.1 9eff0d2bed Parity: evidence paths follow the tests moved into tests/it
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-23 12:24:20 -04:00
Osvaldo DuranandClaude Sonnet 5.5 e1b6401475 test(ui): the attachments panel snapshot lists the Attach and Delete buttons
The panel now has an "Attach a file…" button and a "Delete attachment" button; the side-panel
snapshot test (every_panel_matches_its_snapshot) still expected the read-only panel.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 05:26:51 -04:00
Osvaldo DuranandClaude Sonnet 5.5 d09ccb2154 i18n(ui): carry this PR's new wordings in the catalogues that must cover them
Catalan, Finnish, Hindi, Korean, Indonesian, Romanian and Albanian get the strings this PR adds
(AI-assisted translations from English, not separately native-reviewed), so the catalogue coverage
tests pass. ATTRIBUTION.toml's sha256 for each file is refreshed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 03:55:12 -04:00
Osvaldo DuranandClaude Opus 5.5 4ebf287e61 Merge upstream main 0dc77fe4 into pr/attachments
crates/organize/src/import.rs: upstream's name_tree_entries (seen-node set, each node read once) kept whole; this PR's only change to it, pub(crate) for attachments.rs, applied on top.
crates/organize/src/attachments.rs: its name_tree_entries call passes the new seen set.
crates/automation/tests/attachment_key.rs, crates/ui-egui/tests/attach_picker_target.rs: moved into tests/it/ and registered in main.rs, following upstream's one-binary layout (organize keeps its single test file, as upstream's rule says).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 03:15:10 -04:00
Osvaldo DuranandClaude Sonnet 5.5 fd8d402e30 Merge upstream main 39844f06 into pr/attachments
Merged cleanly, no conflicts.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 21:45:25 +00:00
Osvaldo DuranandClaude Sonnet 5.5 542196d907 Merge upstream main 3e968c8a into pr/attachments
Mechanical merge (ATTRIBUTION.toml): main's copy of the pinned files, hashes recomputed, both sides' catalog rows kept.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 18:55:02 +00:00
Osvaldo DuranandClaude Sonnet 5.5 f84d6b17e6 Merge upstream main 95263631 into pr/attachments
Merged cleanly, no conflicts.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 15:48:35 +00:00
Max AbramowitzandClaude Opus 5.5 795fb53c5d M3: the community card on Home can be closed for the rest of the run
The ArtCraft community card on Home gets a close button. Closing it hides
the card until the next launch; the choice is deliberately not remembered,
and the same links stay in the top bar's Discord button and the Help menu.
A UI regression covers closing and the fresh-launch default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 11:37:39 -04:00
jonathanwxh-cell 17f84e4391 Merge main into feat/optimize-compatibility-version
Retain compatibility regression coverage with upstream content-boundary and image-size tests.
2026-10-22 21:34:02 +08:00
Osvaldo DuranandClaude Sonnet 5.5 24a96e1a80 Merge upstream main 80b7d215 into pr/attachments
Merged cleanly, no conflicts.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 12:58:52 +00:00
Osvaldo DuranandClaude Sonnet 5.5 6a5e6728e0 Merge upstream main 9a0ec645 into pr/attachments
Resolved by the keeper:
- ATTRIBUTION.toml: upstream's copy, hashes recomputed
- crates/organize/src/tests.rs: additions from both sides, upstream's first

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 09:50:52 +00:00
jonathanwxh-cell c05f00c67a fix(engine): generate Protect keys and salts with getrandom (#4000) 2026-10-22 16:07:14 +08:00
jonathanwxh-cell b6b67a86d8 fix(automation): guard MCP dispatch and bound line and file reads (#3924) 2026-10-22 15:08:56 +08:00
jonathanwxh-cell 895ccb90c3 fix(engine): guard undo and redo refresh and roll back on failure (#3925) 2026-10-22 08:28:37 +08:00
jonathanwxh-cell b388116c86 Merge latest main and preserve both roadmap histories
Retain the calculation-order update and inline-image repair entry.
Position the repair entry away from concurrent top-of-log additions;
parser and render regression code remain unchanged.
2026-10-22 08:10:54 +08:00
jonathanwxh-cell b9c50c7267 Merge current main into inline-image repair branch
Keep both roadmap progress entries and all upstream changes while
preserving the inline-image parser fix and regression coverage.
2026-10-22 07:40:28 +08:00
jonathanwxh-cell 01af6cba3f fix(syntax): bound inline-image lookahead by content window
Fall back only when missing sample or terminator bytes cannot fit the
content-window budget, including retained header and separator overhead.
Preserve available deterministic boundaries and ordinary large streams.
Add oversized, exact-budget, overflow and large-stream regressions.
2026-10-22 07:35:54 +08:00
Adrian ad28a5073a js_ui: put the preferences_body doc comment back on preferences_body (#3557)
The old doc comment was left above the constants added in this change, where it
documents PREFERENCES_BUTTON_ROW wrongly, and its "Returns true to close" no
longer holds for preferences_body, which returns ().

Move its first sentence onto preferences_body, drop the "Returns" sentence, and
leave each constant with only its own comment.
2026-10-21 16:11:11 -04:00
kcobelli-pixelandClaude Opus 5.5 57d41762b5 M14: Italian catalog: the 8-character digital ID password message
Create a new digital ID rejects a password shorter than
sign::pkcs12::MIN_PASSWORD_CHARS (8) with "The password must have at
least 8 characters.", which the dialog shows through tl!. Italian only
had the older 6-character wording, so the message appeared in English.
Czech, Lithuanian and Vietnamese already carry the current key.

The other 67 keys some catalogs have and Italian lacks are not looked
up by the code: shortcut tooltips the code now fills from {key} rows,
older wordings, plain-string plurals and generic labels only ar/lt/vi
carry. The catalog's SHA-256 in ATTRIBUTION.toml is updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 21:44:49 +02:00
Adrian eaed3409f8 M14: the Preferences OK button stays in reach below the scrolling settings (#3557)
The settings scroll when the window is short, but OK was the last thing inside
the scrolled content, so in a short window it was off screen until you scrolled
to it, and the dialog was cut off partway through the theme cards.

OK is now a row below the scroll area, outside it. The scroll area gets the
height the window leaves (at least 60 pt, so OK stays on screen in the smallest
window, 520 pt, at the largest interface size, 300%) and a scrollbar of its own
instead of the floating one that lay over the right edge of the theme cards.

A scroll area starts from the room its modal offers, and a modal offers more
each frame for the first few, so with OK outside the scroll the dialog opened
small and stretched by about 45 pt a frame for ten frames, and clicks in the
first frames missed. The scroll area is asked for its full height from the start
(min_scrolled_height, which egui applies only when the settings overflow it),
so it opens at full size and does not stretch in a tall window.

- test: OK and the title are on screen at window heights from 173 to 1100; OK
  closes the dialog and does not move while the settings scroll, and a far-down
  setting scrolls into view between the title and OK; the dialog does not grow
  after it opens; a very tall window has no blank gap above OK. Both the
  original layout and the stretching variants fail them.
- parity: misc.preferences-dialog evidence and what is still missing.
2026-10-21 15:37:50 -04:00
Adrian 946a77cf9b M4: a new bookmark goes to where the reader is (#3865)
A bookmark made in the app always went to the top of the page. It now goes to
the top-left of the selected text, or with nothing selected to the top of the
window, as /XYZ left top null: the reader's zoom is kept, and with only the top
pinned so is the horizontal position.

- render: PageInfo::xyz_for_view, the inverse of dest_fraction. It pins only
  the coordinates given; on a page turned a quarter the displayed y decides the
  user left and the displayed x the user top.
- organize: add_bookmark_at and OutlineError::BadPosition (a coordinate that is
  not finite is refused before anything changes).
- engine: Edit::AddBookmark takes left and top (None, None is the page top, as
  before).
- automation: bookmark_add takes top and left in points from the top-left of the
  displayed page, as bookmark_list reports them, bounded and refused when not a
  usable number.
- ui: DocView::bookmark_position. It follows the window's vertical when the view
  is turned a quarter (View > Rotate View), picks the selection's corner that
  shows at the top-left, and in a spread of unequal pages uses the page that
  crosses the window's top edge.
- parity: organize.bookmark-add evidence and what is still missing.
2026-10-21 12:12:03 -04:00
Adrian a0c106268c Fill & Sign marks stay upright on rotated pages (#2392)
A checkmark, cross, dot or line placed on a page with /Rotate was drawn
in the page's own axes, so on a page turned 180 degrees the checkmark
came out upside down, and on a quarter turn it lay on its side.

Marks now record the page rotation (PCStampRotate, as rubber stamps do)
and their appearance is drawn upright in the displayed box and mapped
into /Rect, sharing the stamps' code for it. The mark's box is sized in
displayed axes (FillMark::rect_at), used by both the Fill & Sign tool and
fill_sign_add, so a line runs across the page as displayed.
2026-10-20 23:43:07 -04:00
Adrian 1298aa285c Print: keep the picked printer for the next print (#3537)
Opening the Print dialog reset the printer to the system default every
time, while copies, range and paper carried over, so Save as PDF or a
non-default printer had to be picked again for each print.

The dialog now keeps the printer picked last time, Save as PDF included,
while it is still listed. A fresh list that no longer has it (the
printer was removed) falls back to the default.
2026-10-20 20:36:30 -04:00
Mex 17dbc88556 Revise evidence and notes in acrobat-features.toml
Keep the initial-view feature status and missing-feature notes unchanged. Add the named synthetic regression and supported indirect-boolean behavior.
2026-10-20 21:08:57 +02:00
Mex 37454d9ce1 M4: document indirect initial-view boolean handling
Update the M4 milestone note and revision history; preserve existing gaps and estimates.
2026-10-20 21:08:17 +02:00
Mex 4bcae6dd4f M4: record indirect initial-view preference coverage
Add the required progress-log entry without changing readiness estimates.
2026-10-20 21:07:48 +02:00
Mex 3d32ffd27c M4: resolve indirect initial-view boolean preferences
Read all six boolean ViewerPreferences through the document resolver. Synthetic regressions cover direct/indirect dictionaries, true/false, malformed values and save/reopen.
2026-10-20 21:07:13 +02:00
jonathanwxh-cell 811a3a84c1 fix(xtask): wait for Chrome child processes to settle PDF after launcher exits (#3103) 2026-10-20 21:13:46 +08:00
jonathanwxh-cell 4ff9bd6634 fix(render): cover all color spaces, padding and align /L policy with content crate (#3107) 2026-10-20 11:15:45 +08:00
jonathanwxh-cell d03dbd742e Merge remote-tracking branch 'upstream/main' into fix/inline-image-ei-in-samples 2026-10-20 10:54:57 +08:00
jonathanwxh-cell 1c7ad8e465 fix: merge current main into optimizer compatibility branch 2026-10-20 10:52:38 +08:00
jonathanwxh-cell a10c0d8937 Merge branch 'upstream/main' into fix/typed-signature-winding 2026-10-20 08:15:30 +08:00
Osvaldo DuranandClaude Opus 5.5 e76adf812a Merge upstream main ec0a9650 into pr/attachments
Conflicts: crates/automation/tests/automation.rs (code resolved by hand: crates/automation/tests/automation.rs). Catalogs keep upstream's rows, then this branch's rows upstream lacks; ATTRIBUTION.toml is upstream's with every sha256 recomputed; progress lines keep both sides, upstream's first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:03:56 -04:00
ec0a965074 M5.6: preserve nested annotation values in FDF exports (#1971)
* M5.6: preserve nested annotation values in FDF exports

Copy and renumber retained object graphs without expanding aliases or following
indirect cycles recursively. Refuse excessive work and propagate export errors
before the destination is written. Cover saved geometry, colour and borders,
shared graphs, streams, stale references and refusal through automation tools.

Co-Authored-By: Codex <noreply@openai.com>

* Bound FDF annotation copying before allocation

Keep selected aliases shared, budget retained keys and values before copying, and add direct-payload and alias-count regressions. Retain copied-graph limits and document source-memory scope.

* M5.6: bound FDF cache-eviction discovery and field values

Extend the concurrent annotation-budget correction while retaining its direct-payload and alias regressions. Record annotation positions instead of resolved bodies so cache eviction cannot pin repeated parsed copies; borrow direct values and budget retained entries before cloning. Count every emitted multi-select field value before allocating its output array.

Observed pre-fix allocation-cap and field-limit failures, then fixed tests passed. Final validation: 549 scoped XFDF/engine/automation tests passed, three existing ignored; strict all-targets Clippy, WASM, fmt, layers, assets, parity and diff checks passed.

AI assistance: OpenAI Codex for @MMexicann.

* M5.6: record bounded FDF export regression evidence

Record comment cache-eviction discovery and emitted-field-value budget regressions without changing feature scores or status. Describe copied-graph limits and existing source-parser limits precisely. Final 549 scoped tests, strict Clippy, WASM, fmt, layers, assets and parity passed.

AI assistance: OpenAI Codex for @MMexicann.

* M5.6: align FDF progress with budgeted discovery

Document lazy annotation positions, cache-eviction coverage and copied-graph limits while retaining the original nested-value progress entry and all upstream notes. Estimates unchanged.

AI assistance: OpenAI Codex for @MMexicann.

* M5.6: describe FDF discovery and copied-graph limits

Align exchange documentation with the tested lazy-position discovery implementation and its copied-graph limits. Source parsing/page discovery keep existing limits.

AI assistance: OpenAI Codex for @MMexicann.

* M5.6: align milestone notes with FDF discovery limits

Retain upstream milestone history and describe the tested discovery/copy budgets without increasing estimates or claiming a total source-memory bound.

AI assistance: OpenAI Codex for @MMexicann.

* M5.6: keep nested page links out of FDF exports

Preserve graph aliases and existing budgets; exclude direct and indirect Page/Pages type names. Add saved-PDF regression and bounded type-resolution controls. Both pre-fix failures observed; 46 scoped tests, strict Clippy, WASM and formatting passed.

* M5.6: document bounded nested page exclusion

Address maintainer feedback on the existing PR. Preserve upstream work and document the tested scope and remaining validation limits.

* M5.6: record nested page-reference regression evidence

Address maintainer feedback on the existing PR. Preserve upstream work and document the tested scope and remaining validation limits.

* M5.6: retain FDF limits in milestone evidence

Address maintainer feedback on the existing PR. Preserve upstream work and document the tested scope and remaining validation limits.

* M5.6: cite nested page-reference exclusion tests

Address maintainer feedback on the existing PR. Preserve upstream work and document the tested scope and remaining validation limits.

* M5.6: respect generations while identifying page references

Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.

* XFDF: document stale Type preservation regression

Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.

* M5.6: record generation-aware page exclusion evidence

Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.

* M5.6: propagate FDF export errors in usage example

Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.

* M5.6: consolidate roadmap change and target fields

Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.

---------

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: skylar taylor-barrick <hi@skylar.cc>
2026-10-19 12:21:37 -06:00
jonathanwxh-cell f9d37c089f fix(render): use unfiltered inline image byte length before EI heuristic (#3107) 2026-10-19 17:33:48 +08:00
jonathanwxh-cell b4545befe8 Merge upstream/main 2026-10-19 15:21:16 +08:00
jonathanwxh-cell 493b92bdea Merge upstream/main 2026-10-19 15:21:11 +08:00
jonathanwxh-cell 52dd6b1e40 Merge upstream/main 2026-10-19 15:21:06 +08:00
jonathanwxh-cell 0725deed33 Merge upstream/main 2026-10-19 15:21:00 +08:00
jonathanwxh-cell ec34fc2c2d fix(ui): pin session clock in prepare button-label test to prevent ModDate second-boundary flake 2026-10-19 12:54:45 +08:00
jonathanwxh-cell d16c94a703 M12: follow rewritten figure stream in engine regression 2026-10-19 12:12:12 +08:00
jonathanwxh-cell e3d095f632 M12: isolate decorative edits of shared content streams 2026-10-19 11:45:29 +08:00
jonathanwxh-cell e22d7066c0 M2: integrate current main into PR #3116 and add raster clip-only test 2026-10-19 09:23:19 +08:00
jonathanwxh-cell afde5298cb M2: integrate current main into PR #2960 2026-10-19 08:37:44 +08:00
jonathanwxh-cell 11ff6d0d7a M2: integrate current main into PR #2838 2026-10-19 07:04:49 +08:00
jonathanwxh-cell 060381c745 fix(a11y): join and splice page content streams with cross-stream rules
Join multiple streams in a page's /Contents array with a space (b' ') rather than a newline (b'\n') in autotag::content_bytes, alt::page_content, and content::page_content so a % comment at the end of one stream continues through the start of the next stream per ISO 32000-2 section 7.8.2.

Update alt::artifact_marked_content to join page content streams with pdfcraft_content::Pieces::join, parse operators across the joined stream, and rewrite only matching BDC spans via Pieces::splice so operators split across stream boundaries and cross-stream comments are preserved.

Fixes #3217
2026-10-19 06:47:56 +08:00
Chiranjeevi U 4db6ac4ae2 M3: Accelerate coarse wheel scrolling (#1094)
* Viewer: accelerate coarse wheel scrolling (#1072)

Line/Page notches moved a fixed eased step, so a fast spin felt slow.
Accumulate one frame of coarse input per axis, scale by arrival rate
(1.0 idle, up to 6.0 spinning), and apply it directly like precise
touchpad input.

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

* Viewer: add only the fast-spin surplus on top of egui smoothing

Single notches flow through egui untouched, so isolated input matches
the scroll speed preference exactly; page units are never boosted.

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

---------

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>
2026-10-18 16:15:39 -06:00
Osvaldo DuranandClaude Opus 5.5 c257793c2c Merge upstream main dab31491 into pr/attachments
On top of the merge with 932bf9c6; no conflicts. ATTRIBUTION.toml is upstream's with every sha256 recomputed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:27:27 -04:00
jonathanwxh-cell 2512b49f80 test(render): derive leading-superscript selection range via Text::nearest (#2960) 2026-10-19 04:59:52 +08:00
Osvaldo DuranandClaude Opus 5.5 f24a26b951 Merge upstream main 932bf9c6 into pr/attachments
Conflicts: ATTRIBUTION.toml, crates/organize/src/tests.rs (code resolved by hand: crates/organize/src/tests.rs). Catalogs keep upstream's rows, then this branch's rows upstream lacks; ATTRIBUTION.toml is upstream's with every sha256 recomputed; progress lines keep both sides, upstream's first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 14:59:30 -04:00
jonathanwxh-cell 9b0aeb0f69 M11: integrate main b0e5c6eb into PR #3227 and fix version parser lifetime 2026-10-19 02:35:26 +08:00
jonathanwxh-cell bec4e807b7 M2: integrate current main into PR #2960 2026-10-19 01:02:08 +08:00
jonathanwxh-cell d76516219d M2: keep hidden ActualText fixture outside CropBox (#2838) 2026-10-18 23:09:40 +08:00
jonathanwxh-cell 2714f9e54f automation: report effective validated PDF version in doc_optimize (#3090) 2026-10-18 23:09:09 +08:00
jonathanwxh-cell 87e68246c8 style(render): rustfmt CropBox condition (#2838) 2026-10-18 22:43:01 +08:00
jonathanwxh-cell c6bf3d0dbd fix(render): avoid emitting full ActualText replacement when span is partially cropped (#2838) 2026-10-18 22:39:15 +08:00
jonathanwxh-cell b2727ac15b M2: refresh footnote reference line selection against current main (#2960) 2026-10-18 22:22:19 +08:00
jonathanwxh-cell 76d1bea652 M2: refresh CropBox text clipping against current main (#2838) 2026-10-18 22:17:35 +08:00
jonathanwxh-cell 6c611edc61 M2: refresh clip-mode text extraction against current main (#3116) 2026-10-18 22:14:54 +08:00
jonathanwxh-cell ff5a2fc9eb M2: retain clipping text in filtered extraction (#3116) 2026-10-18 22:00:21 +08:00
jonathanwxh-cell 3c94700447 M11: document partial PDF version compatibility (#3227) 2026-10-18 21:54:58 +08:00
jonathanwxh-cell 0f28c6a902 M11: target PDF version and object streams option in PDF Optimizer (#3090) 2026-10-18 18:02:10 +08:00
Mex a694e5dbba M4: add duplicate-index rotation parity evidence
Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.
2026-10-18 11:52:04 +02:00
Mex 9bda202dba M4: document repeated rotation preservation controls
Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.
2026-10-18 11:51:55 +02:00
Mex 2a60b2fb0e M4: record repeated rotation regression evidence
Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.
2026-10-18 11:51:40 +02:00
Mex 19d138e951 M4: accumulate repeated page rotation indices
Address maintainer feedback on the existing PR. Preserve upstream work and document tested scope and validation limits.
2026-10-18 11:51:29 +02:00
Mex 0897789788 Merge branch 'main' into fix/csv-tab-field-names 2026-10-18 11:14:16 +02:00
Mex 5af8e88fca Merge branch 'main' into fix/organize-resolve-indirect-rotation 2026-10-18 11:12:44 +02:00
jonathanwxh-cell 2e880a84ed M2: refresh CropBox text clipping after upstream cleanup 2026-10-18 12:22:26 +08:00
jonathanwxh-cell f0975318d1 Merge upstream main into footnote selection fix 2026-10-18 12:17:59 +08:00
jonathanwxh-cell 0bdfdf87c1 M2: refresh CropBox text clipping against upstream main 2026-10-18 11:44:30 +08:00
jonathanwxh-cell 22064736cd M2: pin leading superscript line geometry regression (#2929) 2026-10-18 11:00:07 +08:00
jonathanwxh-cell 958914e72b fix(edit): merge main into paragraph background repair 2026-10-18 10:41:08 +08:00
jonathanwxh-cell 6454dd2c24 Merge commit '645016addcfb9078c557f0189559ab47cdcee057' into repair/2960 2026-10-18 10:22:04 +08:00
jonathanwxh-cell d7b4d576a1 fix(render): emit clip-only text (7 Tr) to devices for text extraction (#3109) 2026-10-18 08:16:58 +08:00
jonathanwxh-cell 341e006b95 fix(render): batch out-of-order script merges and pin leading-script extend_box (#2929) 2026-10-17 20:53:54 +08:00
Mex 2f532ea68d Merge branch 'main' into fix/xfdf-preserve-attribute-whitespace 2026-10-17 13:42:05 +02:00
Mex a9d7774bbc Merge branch 'main' into fix/xml-form-text-nodes 2026-10-17 13:37:34 +02:00
Mex f98ee80953 Merge branch 'main' into fix/flate-fallback-output-limit 2026-10-17 13:31:43 +02:00
jonathanwxh-cell 22ec11cd28 Keep lines with footnote references in paragraph reading order (#2929) 2026-10-17 09:57:47 +08:00
mixlnwuu 299af11786 i18n(th): translate the 80 strings added upstream since 0.8.0
Word count, untagged content, image crop, print as image, signature labels, full screen prompt and the other new interface strings. th.tsv now covers every key any bundled catalog translates (2,672).
2026-10-16 20:10:21 +07:00
jonathanwxh-cellandGuillem Hermida cba63a26e4 M3: wait for OS-open preparation before removing its fixture
The open worker can still be reading after the harness's four startup frames.
Removing the synthetic file then asserted zero tabs before opening completed.
A fixture-specific 300 ms delay reproduced the exact ui.rs:843 failure on
644f7ab6; waiting by state passes under the same delay. Keep the file until
its tab opens, retaining the one-tab, filename and OS-quit assertions.
The diagnostic delay is removed. CropBox production code is unchanged.

Narrowly adapted from Guillem Hermida's OS-event test repair in upstream
https://github.com/storytold/pdfcraft/pull/2812 at
47e5398b6b (MIT OR Apache-2.0).
No other changes from that PR are included.

Validation: controlled red/green; final UI suite 52 passed, zero ignored;
CropBox render regression passed with its fully qualified exact test name;
strict UI Clippy all targets, formatting, layers, assets and wasm (31 crates).
The CLI CropBox acceptance test will also be verified in automatic exact-head CI.

Co-authored-by: Guillem Hermida <guillemhr2@gmail.com>
2026-10-16 20:29:42 +08:00