Release Next v3.0.0-next.4
Pre-release@cloudpdf/engine@3.0.0-next.4
Minor Changes
- #749 by @bobsingor –
open({ kind: 'share' }): the engine resolves public share tokens itself.- The share arm exchanges
shr_…for a session JWT on the engine's own transport (baseUrl+ configuredfetch) and delegates to thetokenarm, so the handle binds to a self-renewing source — revoking or editing the share retargets the open at the next renewal. Works on an engine constructed with no engine-level token at all. - Exchange failures surface as
EngineErrors — onopen()and on every later renewal (RPCs, SSE reconnects) — never as rawShareExchangeErrors. Protected grants reject with the newEngineErrorCode.SharePasswordRequired; the wire code and HTTP status ride indetails, the original error incause. The mapping is exported asengineErrorFromShareExchange. shareSessionSourcenow declares its concrete return type (() => Promise<string>) instead of theTokenSourceunion;HttpClientexposesbaseUrlandfetchImplgetters.
- The share arm exchanges
@cloudpdf/viewer@3.0.0-next.4
Minor Changes
- #749 by @bobsingor – Share sources pass through to the engine; the viewer-only share vocabulary is retired.
{ kind: 'share' }is a standardOpenInputkind now, resolved byengine.open()itself —resolveCloudConfigno longer lowers share entries into token sources, and no longer re-threadsbaseUrl/fetchinto the exchange.- BREAKING (prerelease line): on share sources the grant passphrase field is
sharePassword(waspassword, which now means the PDF's own encryption password — the same slot every other kind uses). The top-levelshareToken/sharePasswordshorthands are unchanged. CloudShareSourceandCloudInitialDocumentremain as deprecated aliases ofOpenInputShareandInitialDocument.
@embedpdf/core-annotation@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Model carets anchored to rotated text as oriented box geometry.
- Add
caretGeomFromAnchor, which places the caret at the trailing glyph edge and derives its authoring rotation from the text baseline while preserving the previous byte-identical upright geometry. - Carry optional rotation on caret geometry, apply it to local-frame hit testing, and expose an oriented selection outline without enabling caret rotate or resize gestures.
- Add
-
#755 by @bobsingor – Models text-markup annotations with semantic text quads and adds oriented caret anchors, allowing highlight, underline, strikeout, squiggly, caret, and replace-text geometry to follow the selected text frame.
@embedpdf/core-geometry@3.0.0-next.4
Minor Changes
- #755 by @bobsingor – Adds semantic
TextQuadgeometry with corner-named transforms, bounds, rectangle conversion, positional PDF quad conversion, and resilient normalization for imported/QuadPoints.
@embedpdf/engine-core@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Add the canonical affine-aware text layout engine under
text/layout:buildPageTextLayout,textGlyphAt,expandTextRangeToWord/Line,textGlyphQuad, andtextSegmentsForRange, producingPdfTextSegment { quad, rect, advance }.Orientation frames are derived from the semantic edges of glyph quads and keyed by baseline direction and ascent handedness. Rotated and mirrored text become upright inside their frame, while shear remains an in-frame variation so mixed roman and italic text stays in one segment. Every run in a cluster uses the same canonical frame, and upright documents retain a byte-identical fast path.
-
#755 by @bobsingor – Extend the caret annotation contract with box-family rotation metadata.
Caret DTOs, drafts, patches, and schemas now carry optional
rotationandunrotatedRectfields with the same tri-state semantics as other box-family annotations. Rotation-stripped appearance documentation now includes carets. -
#749 by @bobsingor – Adds
shareto theOpenInputunion and aSharePasswordRequiredengine error code.OpenInputShare({ kind: 'share', shareToken, sharePassword?, password? }) is the third cloud reference form, alongsideidandtoken: a public share token from the dashboard's embed snippet, resolved by the cloud engine itself. Rejected by@embedpdf/engine, like the other cloud kinds.sharePasswordis the grant's passphrase (checked at exchange);passwordstays the PDF's own encryption password, same slot as every other kind.EngineErrorCode.SharePasswordRequiredis the prompt-and-retry signal for protected grants — the share sibling ofDocPasswordRequired.
-
#755 by @bobsingor – Extends page geometry snapshots with an upright/rotated run union, oriented glyph cells, rotation and ascent-flip metadata, uniform quad and bounds helpers, wire schemas, and orientation conformance coverage.
@embedpdf/engine@3.0.0-next.4
Minor Changes
- #755 by @bobsingor – Returns orientation-aware page text geometry from the local engine so consumers can select and annotate rotated, sheared, and mirrored text without collapsing glyph cells into axis-aligned boxes.
Patch Changes
- #751 by @bobsingor – Export the shared document types (
OpenInput,OpenOptions,DocumentHandle,PageHandle,DocumentCapabilities,TokenSource, …) from the package root, mirroring@cloudpdf/engine, so code driving the engine directly can name them without importing from the transitive@embedpdf/engine-coredependency.
@embedpdf/engine-runtime@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Generate rotated caret appearances in the EmbedPDF PDFium runtime.
The caret appearance generator now consumes the shared rotation metadata pair, draws in the logical unrotated box, and emits the form transform needed for the baked caret to follow its text baseline.
-
#755 by @bobsingor – Updates the EmbedPDF PDFium runtime with oriented per-character geometry and orientation-aware text-markup appearance generation for rotated, sheared, and mirrored text, while retaining safe fallbacks for malformed quads.
@embedpdf/engine-services@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Replace the parallel
rects[]andquads[]geometry onSearchMatchwith canonicalsegments: PdfTextSegment[], validated byPdfTextSegmentSchema.Search tokens now always encode
format=segments1, preventing newer clients from consuming stale CDN-cached responses with the old geometry shape; old tokens fail decoding instead. -
#755 by @bobsingor – Persist and render caret rotation through the engine annotation services.
- Read and write the caret
rotationandunrotatedRectmetadata pair during create, patch, and list operations. - Treat caret subtype 14 as box-family when rendering annotation appearances, returning a rotation-stripped raster placed by the logical box so consumers do not double-rotate it after reload.
- Read and write the caret
-
#755 by @bobsingor – Reads boxes, oriented cells, flags, and text orientation through the new runtime geometry call, preserving the compact upright wire shape while emitting rotated runs for non-upright glyphs. Native page-redaction failures are now reported instead of being mistaken for pages without redaction annotations.
@embedpdf/react@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Render search and selection highlights from canonical text segments. Axis-aligned lines retain their classic appearance, while rotated lines render their true oriented cells.
-
#755 by @bobsingor – Render live caret annotations with their text-baseline rotation.
The React annotation painter now treats caret SVGs as box-family visuals, applying the caret's authoring rotation about its centre while continuing to leave vertex-geometry rotation advisory.
Patch Changes
- #755 by @bobsingor – Renders text-selection highlights from oriented segment polygons so the React selection layer follows rotated, sheared, and mirrored text.
@embedpdf/plugin-annotation@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Round-trip rotated caret geometry through the annotation repository.
Rotated carets now lower their logical box and content-space tilt into
/Rect,rotation, andunrotatedRect, and reconstruct that geometry when engine annotations are ingested. Upright writes explicitly clear stale transform metadata. -
#755 by @bobsingor – Creates, previews, imports, and persists text-markup annotations with oriented quads and places caret and replace-text annotations at the selected glyph's trailing edge.
@embedpdf/plugin-search@3.0.0-next.4
Minor Changes
- #755 by @bobsingor – Represent search-hit geometry as canonical
segments: TextSegment[]with a precomputedboundsenvelope. Search reveal now passes that envelope directly tostage.reveal(hit.pageIndex, { rect: hit.bounds })instead of manually folding rectangles.
@embedpdf/plugin-selection@3.0.0-next.4
Minor Changes
-
#755 by @bobsingor – Use the engine's canonical text segmentation while keeping selection gestures and state in the plugin coordinate seam.
SelectionSnapshot.pagesnow carries segments only, with boxes exposed as derived views throughsegment.rectandrectsForPage(). Public geometry exports are nowbuildSelectionPageGeometry,contentPointToPdf,toContentSegment, andtoContentTextQuad. -
#755 by @bobsingor – Builds selections as oriented line segments, exposes their semantic quads and reading direction, and anchors selection endpoints to glyph cells while retaining AABB access for scrolling and conservative regions.
@cloudpdf/server@3.0.0-next.4
Patch Changes
- #750 by @bobsingor – Preserves configured CORS response headers on the hijacked server-sent events stream, allowing browser clients on permitted origins to subscribe to document layer events.
@embedpdf/plugin-redaction@3.0.0-next.4
Patch Changes
- #755 by @bobsingor – Preserves oriented selection quads through text-redaction marks, previews, and native apply so rotated, sheared, and mirrored text can be redacted without expanding the mark to its axis-aligned bounds.