Commit Graph
175 Commits
Author SHA1 Message Date
japbcoelhoandClaude Opus 5.5 b54fa8d9bb Text: carriage returns in typed or created text start paragraphs
frame.create's text and text.insert kept CR and CR LF as characters, so text
written with InDesign's, classic Mac or Windows line ends ("One\rTwo") became
a single paragraph, and paragraph formatting (spaceAfter) never applied
between the parts. They now become \n, the paragraph separator, as edit.paste
and text import already did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 09:04:08 -04:00
japbcoelhoandClaude Opus 5.5 316e1ffe62 Text: text.select documents its offsets as UTF-8 bytes
anchor and focus are byte offsets into the story text, as find.find reports
them, but the params doc said only {story, anchor, focus}. A script that
counts characters (Python's len()) selects too little after the first
accented letter: with "Matemática Básica" and focus 17, type.char left the
last two letters out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 09:03:56 -04:00
Brandon ThomasandClaude Opus 5.5 02f187cc5d Text: story.replaceRange keeps the caret on a character boundary
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 17:32:57 -04:00
storybored379andOpenAI Codex e47f65a595 Text: keep selections on UTF-8 character boundaries
Use the document model boundary helper for explicit selections and retained selections after story replacement. Cover editing and caret movement through the command API.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
2026-10-05 17:32:57 -04:00
Brandon Thomas afdae89d68 Merge pull request #14 from storytold/pr/never-crash-guard
Never crash: last-resort guard around every command
2026-10-04 14:20:03 -04:00
Brandon ThomasandClaude Opus 5.5 f1662185de Never crash: last-resort guard around every command
Session::execute runs each command inside catch_unwind: a panic that escapes
(any edit, import or export, from the UI, CLI, MCP or control channel)
becomes EngineError::Internal, the document and selection are restored to
before the command, and crash recovery is saved when enabled. The first
Session installs a panic hook that logs the message and location.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 12:55:07 -04:00
Brandon ThomasandClaude Opus 5.5 f05bbfeea2 Never crash: engine, MCP and tools
Commands return errors instead of expect()/unreachable!() (book, library,
undo/redo, paste, find/replace, Pathfinder, tables, QR, select, swatches,
anchors, articles, transform again, XML import). The sample document builder
propagates errors. Commands that add a key to their parameters no longer
panic when a caller (control channel, MCP, script) passes an array or a
string, and corrupt crash-recovery metadata is ignored. engine, mcp and
tools now deny unwrap/expect/panic/unimplemented/todo/unreachable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 12:43:33 -04:00
Brandon ThomasandClaude Opus 5.5 8490965e71 CI: fix new Rust 1.99 clippy lints (as_chunks, ?, redundant ref)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 11:37:09 -04:00
storybored379andClaude Opus 5.5 eee64ae7c9 Layers: the active layer falls back to the top layer when it is removed
The active layer lives on DocState, outside the undo snapshots, and
nothing re-checked it when the document's layers changed. After New
Layer → Undo (or Delete Layer / Delete Unused Layers / Merge Layers on
the active layer) it kept pointing at a layer that no longer exists, and
every object created next (frames, lines, placed images, pasted items)
was put on that phantom layer: not drawn on the canvas, missing from PDF
export, ItemLayer referencing an undefined layer in IDML, and preflight
reported nothing.

After each command, if the active layer is gone, make the top layer
active (as on opening a document).

Test: active_layer_survives_undoing_new_layer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 09:52:29 -04:00
storybored379andClaude Opus 5.5 01753f90f3 File: file.serialize returns the file's bytes (base64) — web Save wrote corrupt documents
file.serialize returned {json: String::from_utf8_lossy(to_bytes(doc))},
but since M6.1 the native format is a zip (deflated document.json + raw
assets), not JSON text. from_utf8_lossy turns every invalid UTF-8
sequence into U+FFFD, so the result is not the file: on the web, File ›
Save downloads exactly those bytes (download_document), and the
downloaded .designcraft can't be opened again ("invalid Zip archive").
Agents calling file.serialize got the same unusable string.

Return {base64, bytes} like the other byte-producing commands
(file.exportIdml, file.exportPdf, snippet.export) and decode it in
download_document.

Test: serialized_document_opens_again.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 09:51:34 -04:00
Brandon ThomasandClaude Opus 5.5 5294c8f677 T: ruby and kenten
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 02:47:55 -04:00
Brandon ThomasandClaude Opus 5.5 558e798dfc E: CMYK transparency blend space on screen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 02:09:26 -04:00
Brandon ThomasandClaude Opus 5.5 e856b849bb M: video and sound in interactive PDF (screen annotations, renditions)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 01:44:50 -04:00
Brandon ThomasandClaude Opus 5.5 5b7969901c T: right-to-left carets and selections; Binding: Right to Left
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 01:34:47 -04:00
Brandon ThomasandClaude Opus 5.5 f888e6b061 X: DTDs — load, validate the structure, Tags panel
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 00:57:18 -04:00
Brandon ThomasandClaude Opus 5.5 fe40d4b80b T: tate-chu-yoko in vertical frames
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 00:46:52 -04:00
Brandon ThomasandClaude Opus 5.5 b13135472a V: Rotate Spread per spread — canvas layout through per-spread transforms
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 00:25:16 -04:00
Brandon ThomasandClaude Opus 5.5 b23f19f0c9 T: drag selected table rows and columns
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 00:14:35 -04:00
Brandon ThomasandClaude Opus 5.5 d30285c542 L: alternate layouts keep their stories linked to the originals
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 00:10:48 -04:00
Brandon ThomasandClaude Opus 5.5 79f266c04c T: text language — hyphenation, spelling and quotes follow it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 00:01:50 -04:00
Brandon ThomasandClaude Opus 5.5 7b636fb9f5 C: separations from source colours
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 23:54:54 -04:00
Brandon ThomasandClaude Opus 5.5 0d02222dab W: Scripts panel and script.run (one undo step)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 8eca6305f8 I: Object Export Options — artifact, rasterize, alignment, page break
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 b7cd7f6309 O: interactive PDF view options (full screen, layout, opening view, timing)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 dc2114be26 I: PDF form fields — text, check box, combo, list, signature
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 55af964ea8 X: inline XML tagging and tag markers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 2f104f83a8 O: EPUB cover and fixed-layout EPUB export
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 3d4bb45f9e A: tagged PDF by paragraph, with headings from Export Tagging
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 e5bb4551a1 X: Tagged Text export and place
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 55e0efbc62 S: style Export Tagging for EPUB/HTML
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 84476ffef4 P: live captions that follow their source's metadata
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:48:58 -04:00
Brandon ThomasandClaude Opus 5.5 8ac240889f E: region-based transparency flattener (the rest stays vector)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 09:06:31 -04:00
Brandon ThomasandClaude Opus 5.5 b655a5f75c V: Flattener Preview; knockout groups kept in PDF export
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 08:58:27 -04:00
Brandon ThomasandClaude Opus 5.5 84d8f498eb E: Directional Feather
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 08:55:15 -04:00
Brandon ThomasandClaude Opus 5.5 9ecd3fb9fd E: Inner Glow, Bevel and Emboss, Satin; soft effects kept in PDF export
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 08:50:43 -04:00
Brandon ThomasandClaude Opus 5.5 37f0cd99e1 P: Object Layer Options for placed PDFs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 08:38:23 -04:00
Brandon ThomasandClaude Opus 5.5 d37d2e5237 T: math expressions — LaTeX subset typeset to SVG, inline or framed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 08:30:11 -04:00
Brandon ThomasandClaude Opus 5.5 77fc006b02 T: vertical type — Vertical Type tool, upright CJK, CJK line breaking
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 08:18:14 -04:00
Brandon ThomasandClaude Opus 5.5 5bee68cf88 T: accept/reject single changes (+ Track Changes panel)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:51:59 -04:00
Brandon ThomasandClaude Opus 5.5 fb747c5fa5 C: Color Settings, Proof Setup and Proof Colors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:44:40 -04:00
Brandon ThomasandClaude Opus 5.5 cf5188a272 E: transparency blend space as the PDF page group
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:36:50 -04:00
Brandon ThomasandClaude Opus 5.5 23098f0bd3 W: Preferences — Dictionary, Spelling (dynamic spelling), Autocorrect, Notes, Track Changes, Story Editor, File Handling
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:33:15 -04:00
Brandon ThomasandClaude Opus 5.5 bfbe9661e1 P: place EPS through its preview or a bounding-box placeholder
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:19:54 -04:00
Brandon ThomasandClaude Opus 5.5 368767ee5d I: page transitions in interactive PDF (+ panel)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 05:46:45 -04:00
Brandon ThomasandClaude Opus 5.5 839887eb04 I: video and sound — media frames, posters, EPUB players (+ Media panel)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 05:20:35 -04:00
Brandon ThomasandClaude Opus 5.5 4438121266 E: transparency flattener for PDF export (+ presets)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 05:10:21 -04:00
Brandon ThomasandClaude Opus 5.5 6a476a28e3 L: Liquid Layout — page rules, liquid guides, object pins, alternate layouts (+ panel)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:56:27 -04:00
Brandon ThomasandClaude Opus 5.5 036144d327 O: Live Distribute while resizing a selection
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:34:34 -04:00
Brandon ThomasandClaude Opus 5.5 08495e45d0 T: graphic cells — images in table cells
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:30:47 -04:00
Brandon ThomasandClaude Opus 5.5 eec8bd3d9e I: buttons — page and URL actions as PDF links (+ Buttons and Forms panel)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:17:25 -04:00