- table.insert takes tableStyle and applies it in its own edit, so one Insert
Table is one undo, and a style that is gone (or not a name) changes nothing.
The dialog passes it instead of running style.table.apply afterwards.
- The dialog's fields stop at table.insert's limits (500 body rows, 200
columns, 100 header or footer rows; now public constants), so the table made
is the one shown.
Found by CodeRabbit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
selection.cells may start at a covered grid position; the toggle now goes to
the merged cell (its owner at the top left), whose story holds the text.
Found by CodeRabbit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A string without a translation shows in English, and an empty catalog row
counts as untranslated. Tests keep duplicate-key and placeholder checks and
the lookup, context, plural-caption and right-to-left mechanics; coverage,
stale-key, wording and per-language literal checks are removed.
`cargo xtask i18n-report`, also a `cargo xtask ci` step, runs the ignored
missing_translations_report test and prints the missing strings per language.
Every text cell now shows its own hidden characters: spaces, tabs, paragraph
returns and an end-of-story # after its text (an empty cell shows just the #).
The table paragraph's return sits after the table's bottom right corner.
Cells showed no marks at all, so an empty table looked like plain lines.
The table marks come from table_hidden_marks (frame space), drawn with the
story's own marks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Table › Convert Text to Table… and Convert Table to Text… open dialogs laid
out as InDesign's instead of converting at once with tabs and paragraphs:
- Column and Row Separator: Tab, Comma, Paragraph from the field's menu, or
any characters typed.
- Number of Columns (Convert Text to Table), available when both separators
are the same: the cells fill rows of that many.
- Table Style (Convert Text to Table), applied to the new table in the same
undo step.
table.convertFromText takes rowSeparator, columns and tableStyle, and any
characters as separators; table.convertToText takes both separators
(Table::text_with). Convert Text to Table is available only with text
selected outside a table, as in InDesign. New strings are translated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correct only the 2026-10-17 narrative from four to two context captions, matching the dated revision history and ROADMAP. The current catalog still has four context captions. All eight local CI stages passed.
- Table menu: Insert Table… (Cmd+Alt+Shift+T), Convert Text to Table,
Convert Table to Text | Cell Options | Insert, Delete, Select | Merge,
Unmerge, Split Horizontally/Vertically, Convert Cell Type, Convert Rows |
Distribute Rows Evenly, Distribute Columns Evenly. The Table panel item left
the menu (it is in Window › Type & Tables, Shift+F9).
- Cmd+Alt+Shift+T opens the Insert Table dialog, as InDesign's; it ran
table.insert with its defaults, so the shortcut and the menu did different
things.
- The Insert Table dialog: InDesign's title, a narrow window, Body Rows and
Columns then Header and Footer Rows as numbers with spinners and
right-aligned labels, and a Table Style applied to the new table.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Record the merge test repairs and the verified catalog count of 1,904 entries plus four context captions. Part of the locally validated four-file update.
Remove only 13 unused entries identified by the shared integrity test; retain all active translated UI labels. Validated with the complete four-file update: 14 localization tests and all eight CI stages passed.
Restore the separate catalog and caption tests, preserve both merge parents’ assertions, and include Hungarian in the shared integrity checks. Part of the four-file update validated by all eight local CI stages (2,993 tests passed).
As in InDesign (Learn Skills Daily / Adobe "How to make a table" lesson):
- With the Type tool in a table cell, Shift+Tab goes to the previous cell.
It went on to the next one: the tool sent a plain Tab whatever the
modifiers.
- Esc in a cell toggles between the text and the cell: the insertion point
or text in a cell selects that cell, and selected cells select the text of
the first one. Esc left the table and selected the frame.
New engine command table.toggleSelection does the toggle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A path passes when it lies inside one of the roots of its kind. The roots'
common parent, a sibling named like a root, `..` or a link out of them and
the other kind's roots stay refused; a folder given twice counts once.
ci.yml calls the shared workflow (cached apt packages, nextest, main-only cache saves, Cargo.lock check). FreeBSD and Windows ARM64 run nightly and on pushes to release instead of on pull requests. Depends on storytold/craft-common-actions#69.
path.appendAnchor read `subpath` with as_u64, so -1 or "0" counted as omitted
and the point went onto the last subpath. Only an omitted (or null) subpath
means the last one now; any other value must be a valid index.
Found by CodeRabbit on #1657.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Delete key already ran path.deletePoints under Direct Selection, but
Edit › Clear (the menu item, a native accelerator, or the control channel)
called edit.clear, which removed every path whose points were selected. With
points selected and no ids given, edit.clear now deletes those points, as
InDesign's Clear does.
Found by CodeRabbit on #1657.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Write GTS_PDFXConformance (PDF/X-1a:2003) in the document information and
XMP; check_pdfx1a requires it.
- A registered printing condition (Coated FOGRA39) has no DestOutputProfile,
so no ICC v4 profile goes into the PDF 1.4 file; an unregistered condition
needs an ICC v2 profile, else the export fails.
- Images the flattener can't read fail the export, naming the page and its
graphics.
- Shadow mask coverage (with - without) / (255 - without), so partly
transparent objects drawn over their shadow give the rendered pixel back.
- The dropped-inks warning says their tints were dropped and won't print.
- Type 3 fonts pass; their glyph procedures are checked like page content.
- Use bash's [[ ]] instead of [ ] for conditional tests (S7688).
- Copy positional parameters into named locals in render(), has() and
sha256() (S7679).
- End the env.sh helper functions with an explicit return, which keeps
the last command's status (S7682).
- Give the appimagetool checksum case a default branch for architectures
without a pinned download (S131).
No behaviour change; shellcheck -x is clean.
The viewport no longer sets user-scalable=no, so people who need to zoom
the page can (WCAG 1.4.4). The canvas takes touch-action: none, so pinch
and pan gestures on it still go to the app's own zoom, as eframe's touch
handlers expect, instead of zooming the page.
- selection.toggle dropping an item from the selection now drops its selected
points too. They stayed in selection.anchors, so the arrow keys still moved
points of a frame that was no longer selected.
- path.appendAnchor at the start moves the sub-path's selected points up one
place, as path.reverse remaps them, so they keep naming the same anchors.
Found by CodeRabbit on #1657.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>