Commit Graph
4827 Commits
Author SHA1 Message Date
aiongg 70d5149ba6 Docking: Preflight Panel… keeps an open Preflight flyout; search leaves out unavailable and alias docking commands 2026-10-24 19:54:13 +00:00
aiongg c4a16d1da8 ROADMAP: progress line for shared docking 2026-10-24 19:25:13 +00:00
aiongg 4aa799b81c Docking: craft-libs shared docking with native floating windows
- Panels dock through craft-ui's shared docking. On desktop, a floating
  panel opens in its own OS window (feature native-windows); the web
  build keeps floats in the page.
- Keys pressed in a floating window run the main window's shortcuts,
  clipboard and tool keys in the same frame.
- A default layout's floating windows keep their ids.
- The canvas paints no tool cursor while another of the app's windows
  has the pointer, and a pointer beside a float stays the canvas's.
- Story joins Glyphs in the default icon column.
2026-10-24 19:24:58 +00:00
aiongg f6bca1d85b build: craft-libs 16fb3d46e (shared docking and native windows); PDF clip text draws nothing 2026-10-24 19:24:58 +00:00
aiongg b3be40ed08 Merge remote-tracking branch 'upstream/main' into docking-trial
# Conflicts:
#	Cargo.toml
2026-10-24 18:46:43 +00:00
dotCooCoo 28d3c6b44f Notes: deleting a note or converting it to text keeps the caret on the same text
note.delete removes the note's anchor (3 bytes) from the story, and
note.convertToText replaces it with the note's text. Both left a caret or
selection in the story text at its old byte offsets. With "copy" selected
after a note in "Draft copy.", Delete Note left the selection at 9..13 in
an 11-byte story, and Convert Note to Text with the note's text "ab" left
"opy." selected.

Both commands now move a caret or selection in the story's own text by
the change in length when it comes after the anchor. A caret before the
anchor stays where it is, and a caret in a table cell or in another story
is unchanged.
2026-10-24 11:45:19 -07:00
aiongg a16f29a669 Optical margin alignment: lines with a tab hang their edge glyphs, as both line breakers measure them (#1760)
layout_line set a line with a tab or a right indent tab without the optical
margin or CJK edge hangs, while the greedy breaker and the paragraph composer
counted them. A line that fit only because its period hangs was then squeezed
into the measure or set past it.

layout_line now hangs the edge glyphs of every line. Tabs are measured from the
hung start, so tab stops stay where they are, and a right indent tab fills to
the hung end. A tab at a line edge hangs nothing. Lines without tabs lay out as
before.
2026-10-24 14:45:04 -04:00
dotCooCoo 6bc5ac36fb Merge main into feat/file-info 2026-10-24 11:30:55 -07:00
dotCooCoo bfc36622e0 File Info: keywords with a comma keep their place, and the dialog stores into its own document
Editing one keyword in File Info re-split the whole field, so a stored
keyword holding a comma or semicolon became two. A stored keyword that is
still in the field whole now stays one keyword.

An Export PDF title equal to the document's name was dropped, so the PDF
took File Info's title. The dialog's title now starts empty, and a title
given there is always the PDF's title; without one the file is named
after the document.

file.info refuses parameters that are not an object; null reads the
fields like {}.

File Info's OK stores the fields in the document the dialog was opened
for, even when another document became active meanwhile, and stores
nothing once that document has closed.
2026-10-24 11:25:22 -07:00
NetterSilverandClaude Haiku 5.5 6a78e8f354 Fix spurious empty paragraph after tables in DOCX import
Found while testing crates/textimport/src/docx.rs:~272 (the "tbl" branch of Ctx::blocks: `st.insert_table(len, t); first = false;`)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 18:19:24 +00:00
dotCooCoo bab76dcd11 MCP: the several-roots CLI test keeps a share path a share path
The test removed only the \\?\ prefix from the folder it resolved, so a
temporary folder on a network share became the relative path
UNC\server\share\... . It now removes the \\?\UNC\ prefix first and
keeps the two leading backslashes, as file_access::plain does, with a
test of both forms.
2026-10-24 10:44:08 -07:00
dotCooCoo 55315a878c Notes: Split Note splits a note in two at the insertion point in its text, as in InDesign
The new command note.split {story, id, at} splits an editorial note at
byte `at` of its text. The note keeps the text before that point, and
the rest moves into a new note by the same author whose anchor directly
follows the first one. A split point at the start or end of the text,
or inside a character, is refused. The Notes panel shows each note's
text in a read-only field, and its Split Note button splits the note at
the insertion point in that field.
2026-10-24 10:22:08 -07:00
dotCooCoo db935e2090 Footnotes: deleting a footnote or endnote keeps the caret on the same text
footnote.delete and endnote.delete removed the reference character from
the story but left a caret or selection in the story text at its old
byte offsets. Everything after the reference moved back by the
reference's length, so the caret ended up three bytes further along the
text. A caret or selection after the reference now moves back with the
text, and one before it stays where it is.

footnote.setText left a caret in the replaced footnote at its old
offset, which could fall past the end of the new text or inside a
character. Backspace there then failed with an internal error. The
caret now goes to the end of the new text.
2026-10-24 09:11:53 -07:00
dotCooCoo 1f613f8c66 MCP: the several-roots tests expect Windows paths without the \\?\ prefix
Four tests from #1678 fail on Windows. Each one builds its paths, or the
text it expects, from a folder resolved with `std::fs::canonicalize`,
which adds the `\\?\` prefix on Windows. `AutomationRoots::describe` and
the rejection messages show the roots without that prefix, so the
expected text does not match. Windows does not resolve `..` in a path
with the prefix, so the checks refuse every such path as one they cannot
resolve, including the ones the tests expect to pass from one root into
another. The code the tests check is unchanged.

The engine tests take the resolved folder through `file_access::plain`,
which the roots use for the text they show. The CLI test strips the
prefix the same way.
2026-10-24 08:41:44 -07:00
NetterSilverandClaude Haiku 5.5 3e7aeaa142 Convert gradient tool drag to spread space on rotated spreads
Found while testing crates/tools/src/gradient.rs:62 (PointerKind::Drag branch: `let to = *sp + (end - *start);`)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 15:00:35 +00:00
dotCooCoo 52e404754f Links: the folder relink and IDML link tests expect Windows paths on Windows
Two designcraft-engine tests fail on Windows on main. The code they
test is unchanged.

eps_relink_update_and_folder_relink_retain_source built the expected
link as dir.join("new/replacement.eps"), which on Windows ends in
new/replacement.eps, while links.relinkFolder stores the folder
joined to the file name, ending in new\replacement.eps. The test now
joins the folder and the file name separately.

only_local_graphic_files_are_read_from_links allowed a read of the
link only at the link's own text. For the link /dev/zero the import
checks C:\dev\zero on Windows, because craft-docpath joins a
root-relative path to the document's drive. The test now allows the
path that crate::io::document_path resolves the link to.

Open #1444 by AndreRese makes the same change to the relink test and
a similar one to the IDML test.
2026-10-24 07:54:48 -07:00
Brandon Thomas 45ed6cfce0 Merge pull request #1678 from marcoarnulfo/feat/multi-automation-roots
MCP: --automation-read-root and --automation-write-root may each be given more than once (#1552)
2026-10-24 10:24:24 -04:00
Brandon Thomas 610792ed34 Merge storytold/main into feat/multi-automation-roots 2026-10-24 10:24:14 -04:00
Brandon Thomas ee8a3397a3 Merge pull request #1639 from marcoarnulfo/feat/convert-variable-to-text
Type › Text Variables › Convert Variable to Text: the selected instances, or every instance of one variable, become the text they show on their page
2026-10-24 10:24:10 -04:00
Brandon Thomas 4b9b0a96f1 Merge storytold/main into feat/convert-variable-to-text
# Conflicts:
#	docs/gaps.md
2026-10-24 10:24:00 -04:00
Brandon Thomas 057d76be3c Merge pull request #1638 from marcoarnulfo/feat/layout-go-back-forward
Layout: Go Back and Go Forward through the pages viewed, with InDesign's shortcuts
2026-10-24 10:23:55 -04:00
Brandon Thomas 3ea6459651 Merge storytold/main into feat/layout-go-back-forward 2026-10-24 10:23:44 -04:00
Brandon Thomas 3f637ae093 Merge pull request #1762 from dotCooCoo/feat/previous-next-note
Type › Notes › Previous Note and Next Note: the insertion point moves from note to note, as in InDesign
2026-10-24 10:23:40 -04:00
Brandon Thomas 0f3ce4dca6 Merge storytold/main into feat/previous-next-note 2026-10-24 10:23:30 -04:00
Brandon Thomas 2b93db2cff Merge pull request #1756 from dotCooCoo/feat/convert-to-note
Type › Notes › Convert to Note: the selected text becomes a note, as in InDesign
2026-10-24 10:23:26 -04:00
Brandon Thomas 073287500f Merge storytold/main into feat/convert-to-note 2026-10-24 10:23:16 -04:00
Brandon Thomas 12c6c721e7 Merge pull request #1753 from Hamza0101/fix/grep-scan-bounds
GREP styles: a scan and the pattern cache are bounded (#1598)
2026-10-24 10:23:12 -04:00
Brandon Thomas c0e2c608cd Merge pull request #1751 from Hamza0101/fix/linked-file-read-cap
links: a linked file is read under a cap, not whole (#1596)
2026-10-24 10:23:09 -04:00
Brandon Thomas a57d4cea1b Merge pull request #1752 from Hamza0101/fix/import-value-ranges
import: a value a file gives is one the engine can mean (#1593)
2026-10-24 10:23:05 -04:00
Brandon Thomas 6649125539 Merge pull request #1744 from PiMinusMax/effects-dialog-global-light-angle
Effects dialog: the Angle with Use Global Light stays editable and sets the global light
2026-10-24 10:23:02 -04:00
Brandon Thomas a67cf73d83 Merge storytold/main into effects-dialog-global-light-angle 2026-10-24 10:22:52 -04:00
Brandon Thomas 520a810640 Merge pull request #1742 from dotCooCoo/fix/package-redirect-test-junction
Package: the Windows redirect test falls back to a directory junction
2026-10-24 10:22:47 -04:00
Brandon Thomas 8d6989c508 Merge pull request #1740 from Silvertree2010/fix/h1918-footnote-numbering-overflows-u32
Saturate footnote and endnote numbering at u32::MAX
2026-10-24 10:22:43 -04:00
Brandon Thomas 178efcccd9 Merge pull request #1732 from dotCooCoo/fix/rooted-link-tests-on-windows
Preflight: the missing-link test uses a path that is absolute on Windows too
2026-10-24 10:22:38 -04:00
Brandon Thomas 5dddce5eb6 Merge pull request #1707 from Silvertree2010/fix/h1903-table-style-altrows-counts-are-t
Saturate table style altRows counts instead of truncating to 32 bits
2026-10-24 10:22:35 -04:00
Brandon Thomas 280436dbdc Merge pull request #1700 from Silvertree2010/fix/h1882-html-epub-style-css-drops-the-un
Join underline and strikethrough into one text-decoration in EPUB CSS
2026-10-24 10:22:31 -04:00
Brandon Thomas 6cf71e33e3 Merge pull request #1699 from Silvertree2010/fix/h1863-from-bezpath-loses-smooth-anchor
Detect smooth anchors on all open subpaths in from_bezpath
2026-10-24 10:22:28 -04:00
Codex f11eca4ec8 Merge remote-tracking branch 'upstream/main' into feat/german-2006-hyphenation
# Conflicts:
#	docs/typography-parity.md
2026-10-24 16:18:35 +02:00
aiongg 5def4a8c01 Story Optical Margin Alignment with a size, and Ignore Optical Margin (Story panel, engine and IDML) (#1705)
* Type: story Optical Margin Alignment with a size, and Ignore Optical Margin (engine, IDML)

A story's Optical Margin Alignment applies to every paragraph except those
with Ignore Optical Margin; hang amounts scale with the story's size.
story.options sets it, type.para and paragraph styles take
ignoreOpticalMargin. IDML imports and exports StoryPreference
OpticalMarginAlignment/OpticalMarginSize and IgnoreEdgeAlignment. The
per-paragraph opticalMargin switch keeps hanging at the text's own size.

Part of #947.

* Type: the Story panel, and Ignore Optical Margin in the Paragraph panel menu and Paragraph Style Options

Window > Type & Tables > Story sets Optical Margin Alignment and its size
for the stories of the text selection or the selected text frames through
story.options, and is disabled without either. type.selectionAttrs
reports the stories' values as storyOptions, null where they differ.
The Paragraph panel menu toggles ignoreOpticalMargin, and Paragraph Style
Options > Indents and Spacing has an Ignore Optical Margin checkbox.

Part of #947.

* ROADMAP: the story Optical Margin Alignment entry names its default and scope
2026-10-24 10:08:40 -04:00
Brandon ThomasandClaude Opus 5.5 b8070d814c links: the capped-read test is native-only, like reload_capped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:05:55 -04:00
Brandon ThomasandClaude Opus 5.5 637c32506a GREP styles: empty matches don't count toward the per-paragraph cap
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:05:52 -04:00
Brandon Thomas b724698d98 Merge remote-tracking branch 'origin/main' into pr1678
# Conflicts:
#	apps/designcraft-cli/src/main.rs
2026-10-24 10:03:25 -04:00
Brandon Thomas b33224d692 Merge remote-tracking branch 'origin/main' into pr1639
# Conflicts:
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-24 10:02:54 -04:00
Brandon ThomasandClaude Opus 5.5 5fca302ff6 Endnotes: saturate the remaining numbering sites at u32::MAX
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:01:04 -04:00
dotCooCoo 56fcfb3153 Footnotes: moving the caret into or out of a footnote drops formatting not yet typed
Go to Footnote Reference, Insert Footnote and Delete Footnote (when the
caret is in the deleted footnote) moved the caret without clearing the
pending typing format. Formatting chosen at the old insertion point and
not yet typed then came back when the caret returned there, for example
in a new footnote that takes a deleted footnote's id. The three
commands now clear it, as text.select and text.move do.
2026-10-24 06:59:15 -07:00
aiongg d767fcf41e Text frames: a custom baseline grid's Relative To (page, margin, frame or inset) (#1758) 2026-10-24 09:55:47 -04:00
con3code 98af30bbd8 Merge remote-tracking branch 'upstream/main' into fix/type-fields-read-units
# Conflicts:
#	crates/ui-egui/src/widgets.rs
2026-10-24 22:50:12 +09:00
con3code d7168ea46f Merge remote-tracking branch 'upstream/main' into fix/effects-panel-units
# Conflicts:
#	crates/ui-egui/src/panels/properties.rs
2026-10-24 22:50:10 +09:00
aiongg 7848c21220 Paragraph Style Options: Align to Grid (None, All Lines, First Line Only) in Indents and Spacing (#1759) 2026-10-24 09:38:37 -04:00
alichaudhry55andClaude Opus 5.5 fe44b1cfdd Tables: gradient cell fills draw as gradients on screen and in PDF
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:36:54 +05:00