Commit Graph
12393 Commits
Author SHA1 Message Date
dotCooCoo 52867e7096 Fonts: Find Font, Replace Missing Fonts and font lists include type in opacity masks and patterns
Find Font and Replace Missing Fonts looked only at the type on the layers
and in symbols, and the font list behind the export warning, Package and
the Missing Fonts dialog skipped opacity masks and pattern swatches.

- text.fonts lists the type in opacity masks (on objects and layers,
  disabled masks and masks inside other art included) and in pattern
  swatches, a swatch that nothing paints with included. A pattern's type
  counts once however many objects it paints. With selectionOnly, the
  masks of the selected objects and the symbols and patterns they show.
- select.font also selects the objects whose mask holds the font and the
  objects painted with a pattern whose art uses it (visible fills and
  strokes wider than 0). A layer's mask and an unused swatch select
  nothing.
- text.replaceFont changes that type in one undo step. Type in the mask
  of a hidden or locked object, and the type of a pattern that only
  hidden or locked selected objects paint with, keeps its font and is
  counted in skipped.
- addon.cleanup.replaceFonts replaces missing fonts in masks and
  patterns, hidden or locked type included.
- text.missingFonts, File > Package and the export warning read masks
  and patterns too.
- document.info's fonts for the whole document (the Fonts and Font
  Details categories and the text report) include the same type. With
  selectionOnly the list stays the selected type's fonts.

While a mask or pattern is edited, its type is taken from the editing
layer only.
2026-11-12 15:29:22 -08:00
dotCooCoo 6c280fa05a Control bar: dragging the gripper away from both docked edges floats the bar
Dragging the Control bar's gripper and releasing it within 24 points of
the top (under the menu bar) or the bottom of the window docks the bar
at that edge, as before. Released farther from both edges, the bar now
floats over the window under the pointer, 800 points wide or as wide as
the window, without taking room from the canvas. A floating bar's
gripper moves it or docks it again, and its panel menu keeps Dock to Top
and Dock to Bottom, neither checked while it floats.

- window.control.dock takes edge "float"; a floating bar floats where it
  last floated, first at 60, 80 in window points.
- Escape cancels a gripper drag, and a release outside the window leaves
  the bar where it was. In a window too short for a floating bar between
  the two zones, a release docks it at the nearer edge. A floating bar is
  kept inside a window that shrinks.
- Workspaces and preferences keep whether the bar floats and where;
  older ones dock it at the edge they name. Menus stop at the window's
  bottom while the bar floats.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 15:25:11 -08:00
dotCooCoo d5a02ee872 Merge main into feat/3d-graphics-planar 2026-11-12 15:19:09 -08:00
dotCooCoo 31b669a0a1 Recolor Artwork: the Color Theme Picker picks new colors from the art on the canvas
The Color Theme Picker button beside the Assign and Edit tabs turns on
picking from the canvas. A click takes the color palette of the object a
Selection tool click takes there, a drag takes the palette of the art
inside its marquee, and Shift adds more picks. The rows that are not
excluded take the palette as their new colors and the art previews them;
OK keeps the recolor as one undo step.

- recolor.pickTheme {picks, colors?} returns the palette of the art
  picked: visible fills and strokes, gradient stops, text, mesh points,
  pattern tiles, symbol art, colorize colors and image pixels. Clip
  groups, clipping opacity masks and isolation mode limit it to what
  shows, and it changes nothing.
- Each object read weighs the same; similar colors merge (k-means in Lab)
  into at most `colors`, most used first. Image reads are bounded (65,536
  pixels a pick, 1,048,576 pixels and 64 images in all), and past 4,096
  distinct colors, close colors merge before clustering.
- The dialog's themePicker and themePicks fields drive it from
  ui.dialog.set. A new Colors count keeps the picks.
2026-11-12 15:16:23 -08:00
BFlat b4505a76de Merge pull request #6887 from dotCooCoo/feat/new-document-profiles
New Document: each preset category starts documents from its own profile
2026-11-13 06:11:41 +07:00
BFlat d61ad77529 Merge pull request #6909 from dotCooCoo/feat/align-artboards
Align: the Align panel aligns and distributes the selected artboards
2026-11-13 06:11:32 +07:00
BFlat 1461bb2123 Merge pull request #6963 from dotCooCoo/fix/transform-effect-moves-member-raster-effects
Effects: a group's or object's Transform effect moves the raster effects inside it
2026-11-13 06:11:24 +07:00
BFlat a55606e66b Merge pull request #6949 from dotCooCoo/fix/assign-profile-working-spaces
Color management: Assign Profile leaves the working spaces of Color Settings
2026-11-13 06:11:15 +07:00
dotCooCoo 68fe1dbaea Merge main into feat/actions-select-object 2026-11-12 15:11:08 -08:00
BFlat 48d8e16444 Merge pull request #6941 from dotCooCoo/fix/ai-twist-curves
.ai import: Twist stays live on curves and groups with nothing stroked
2026-11-13 06:11:06 +07:00
dotCooCoo 5494e1aaa7 Merge main into feat/color-rgb-percent 2026-11-12 15:11:03 -08:00
BFlat cea91c1374 Merge pull request #6968 from dotCooCoo/fix/followup-6910
MCP: a readable library's id keeps a hidden path that it holds after its start
2026-11-13 06:10:58 +07:00
Don Omondi cbfd84a61f Merge remote-tracking branch 'upstream/main' into fix/swatches-show-recent-colors-6617
# Conflicts:
#	docs/target-app-parity.md
2026-11-12 18:04:51 -05:00
Don Omondi 1900c9429d Swatches: the panel menu's Show Recent Colors shows or hides the Recent Colors row (#6617) 2026-11-12 18:04:20 -05:00
dotCooCoo 505d11dae5 3D and Materials: straight graphic sides count once, and graphic handles stay with the drawn art
- Under a perspective, the shared 400,000-element limit of a 3D effect's graphics now counts
  what each path draws once mapped: a straight side stays one element, and only curves count
  as their 8 pieces. Two copies of a 30,000-sided polygon now both draw. The symbol check
  counts the same way, and without a perspective it counts each curve once.
- The Materials tab's handles on the artboard are hidden while a geometry effect (such as
  Transform) comes after the 3D effect of a selected object, since that effect draws the
  graphics away from the handles.
- A press on the canvas while its context menu is open only closes the menu, and no longer
  grabs a graphic's handle.
- A symbol instance inside a graphic's art shows its changes to a dynamic symbol, and a symbol
  with 9-slice guides is placed through them, as the canvas draws the instance. Paths that
  cross a guide are cut at it.
2026-11-12 15:02:34 -08:00
Sven Lafebre cb5bdcb785 Merge remote-tracking branch 'origin/main' into fix/6969-rasterize-gray
# Conflicts:
#	docs/target-app-parity.md
2026-11-12 23:55:52 +01:00
jmverges 2c911f44f8 Merge remote-tracking branch 'upstream/main' into fix/remaining-type-envelopes
# Conflicts:
#	docs/target-app-parity.md
2026-11-12 22:55:36 +00:00
73b06e478e UI: icon flyouts resize from their top edge and free top corner (storytold/craft-libs#1094) (#6913)
Pin craft-ui to c4b8405d, which adds a top edge and the canvas-side top
corner to icon-strip flyouts and saves the moved top per group. Accept
its new MoveFlyoutTop docking action, and restore the saved top when a
group returns to its place. A docking regression checks the cursors, an
upward top-edge and free-corner drag with the bottom and icon-column edge
fixed, and the top after reopening and in a saved layout.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Codex <codex@openai.com>
2026-11-12 23:54:17 +01:00
dotCooCoo cfff971d06 Merge main into fix/pdf-large-page-export 2026-11-12 14:40:47 -08:00
dotCooCoo c7900a9705 Document Info: Brushes shows brush types in the interface language
The Brushes rows name each type as the New Brush dialog does (Art Brush,
Scatter Brush) and say "missing from the Brushes panel" for a brush the
panel does not hold. The panel now shows these values through the
catalogs, so a localized interface no longer shows them in English.
document.info and the saved report keep them in English. Every catalog
gets a row for "missing from the Brushes panel"; the type names already
had rows.
2026-11-12 14:40:14 -08:00
dotCooCoo 5ae81b8d63 Merge main into fix/followup-6841 2026-11-12 14:28:51 -08:00
dotCooCoo 3c10f9bf71 Merge main into feat/cjk-insert-aki 2026-11-12 14:28:45 -08:00
BFlat efaa9afb9a Merge pull request #6917 from dotCooCoo/fix/ai-look-stroke-warning
.ai save: a stroke the object's art style keeps no longer warns
2026-11-13 05:24:11 +07:00
BFlat f813ea02d5 Merge pull request #6950 from dotCooCoo/perf/setformat-per-paragraph
Type: a Tabs indent drag over many paragraphs no longer takes time in the square of their number
2026-11-13 05:24:02 +07:00
BFlat 9861e7f927 Merge pull request #6920 from dotCooCoo/feat/export-notes-loss-first
Save and Export: notes of what the file loses come before notes on options
2026-11-13 05:23:53 +07:00
BFlat 912a97346b Merge pull request #6973 from dotCooCoo/fix/followup-6827
MCP: document.json names linked JavaScript files outside the read roots by file name
2026-11-13 05:23:43 +07:00
BFlat 822d4101b5 Merge pull request #6890 from dotCooCoo/feat/3d-expand-as-wireframes
3D and Materials: Expand as Wireframes turns a 3D object into its edges as paths
2026-11-13 05:23:34 +07:00
BFlat a86021c7ae Merge pull request #6833 from dotCooCoo/fix/dialog-set-hidden-fields
Automation: ui.dialog.set cannot change the command a dialog runs
2026-11-13 05:23:26 +07:00
BFlat 666ba78862 Merge pull request #6967 from dotCooCoo/feat/docinfo-brush-types
Document Info: Brushes lists the brushes applied to art, with their types
2026-11-13 05:23:17 +07:00
BFlat e0a8fdae5b Merge pull request #6958 from dotCooCoo/fix/bevel-join-visual-bounds
Transform: a bevel stops at the corners of the segments it joins with Use Preview Bounds
2026-11-13 05:23:09 +07:00
BFlat c2f97d2efa Merge pull request #6961 from dotCooCoo/fix/gradient-repeat-runs
Gradients: a repeated gradient with many stops keeps every run
2026-11-13 05:22:59 +07:00
Sven Lafebre c4473a41c9 Fix #6969: parity evidence for Rasterize's Grayscale and Bitmap images 2026-11-12 23:19:33 +01:00
dotCooCoo 76d61be566 Image Tools: Remove Background checks the pixels it clears for a process colorize color
Remove Background refused a grayscale image colorized with a process
color by looking at the pixels the image shows. With a color mask whose
masked pixels are not gray, as an opened file can hold, the check let
the image through, and the gray pixels it cleared took an alpha channel
under the process color. The check now reads the image's own pixels,
which are the ones cleared.

docs/mcp.md and the Color Mask line in docs/target-app-parity.md now say
that a mask that hides no pixels leaves a grayscale image free to take a
process color.
2026-11-12 14:14:24 -08:00
dotCooCoo 05466e54a8 Color management: Working CMYK proofs a tagged document through the working space
View > Proof Setup > Working CMYK simulates the working CMYK space of
Color Settings in Proof Colors and Separations Preview, also in a
document assigned another CMYK profile. The active context keeps the
working context beside the assigned profiles, and the proof table cache
key includes the working settings, so a change of the working CMYK space
shows in the next proof.
2026-11-12 14:09:08 -08:00
dotCooCoo 71df6f0fd2 Save PDF: ui.savePdfDialog refuses a useArtboards that is not true or false
A value such as "false" or 0 used to open the dialog for the artboards. It is
now refused before the dialog opens, as document.exportPdf refuses it.
2026-11-12 14:06:35 -08:00
jmverges 4aef07a117 Merge remote-tracking branch 'upstream/main' into fix/type-layout-envelopes
# Conflicts:
#	crates/eps/src/import/ate.rs
#	crates/eps/src/import/tests_native.rs
#	docs/file-format-parity.md
2026-11-12 22:05:35 +00:00
Sven Lafebre 499a74cedb Fix #6969: Rasterize to Grayscale or Bitmap makes a grayscale image 2026-11-12 23:04:50 +01:00
dotCooCoo cafbaec053 Merge main into fix/transform-effect-moves-member-raster-effects 2026-11-12 14:02:27 -08:00
dotCooCoo 0956341034 MCP: the UI catalog lists useArtboards for the Save PDF dialog
crates/mcp/src/ui_catalog.rs is regenerated with `cargo xtask ui-commands`, so
the ui.savePdfDialog entry matches its description in
crates/ui-egui/src/menus/ui_commands.rs.
2026-11-12 13:55:12 -08:00
jmverges 73fce692d9 Merge remote-tracking branch 'upstream/main' into fix/remaining-type-envelopes
# Conflicts:
#	docs/file-format-parity.md
2026-11-12 21:55:11 +00:00
dotCooCoo 3e32e99a15 Merge main into feat/align-artboards 2026-11-12 13:47:00 -08:00
dotCooCoo 7998954a95 Cutting Tools: weeding lines stop at an outline that lies on a line
A weeding line at v0 + k*step can round just past the edge of an outline
segment that lies on it: across 0.1 to 0.5 the one line sits at
0.30000000000000004, and (0.30000000000000004 - 0.1) / 0.2 is
1.0000000000000002. The candidate range for that segment then came out
empty, so the line was not stopped there and ran over the art's edge.
The candidate range is now widened by a small tolerance before rounding;
`near` still leaves out lines the segment does not meet.

docs/mcp.md and the params text of `addon.cutting.weed` now state the
`spacing` range (more than 0, at most 100000 pt), the 1000-line limit
each way, and that a request giving both `count` and `spacing` is
refused.
2026-11-12 13:46:37 -08:00
dotCooCoo 554d86765a Merge main into feat/3d-graphics-planar 2026-11-12 13:46:05 -08:00
dotCooCoo 5b09cf9c09 Document Info: Spot Color Objects leaves out fills and strokes at opacity 0
A spot-colored fill or stroke whose opacity is 0 prints no ink, but
Spot Color Objects still listed its object and objects.spots counted
it. Such fills and strokes are now left out; an object stays listed
while another of its fills or strokes prints the spot color. Pattern
Objects and Gradient Objects are unchanged.
2026-11-12 13:45:55 -08:00
dotCooCoo 7907bae6c3 Merge main into feat/new-document-profiles 2026-11-12 13:42:10 -08:00
dotCooCoo 127229d188 Color management: removing a profile redraws only when the canvas changes
color.removeProfile gave every open document a new revision for any
removed profile. It now redraws when the removed profile was an assigned
profile in use, which the working space replaces, or the CMYK profile
View → Proof Setup targets. Removing any other profile leaves the
revisions unchanged, which loading_or_removing_the_proof_profile_redraws
checks.
2026-11-12 13:42:04 -08:00
dotCooCoo 367ec9998e 3D and Materials: graphic curves whose control points pass behind the eye still draw
Under a perspective, a piece of a graphic's curve that lies in front of the eye while one of its control points does not is halved until its control points map, instead of dropping the piece. A curve that dips behind the eye between the ends of its pieces is still clipped. The extra pieces count toward the effect's element limit, and a path that passes the limit is not sent to the clipping.
2026-11-12 13:32:37 -08:00
dotCooCoo 2c3f61851f MCP: a readable library's id stays only after a delimiter
A readable library's id was kept whole after any character outside a
short list, so in `/a+/project/libs/Kit.gpl` the id
`/project/libs/Kit.gpl` was kept and the hidden `/libs/Kit.gpl` inside
it showed in the reply. The same happened after `@`, `=`, `%` and `!`.

The id now stays only at the start of the text, after a space, a
quote, `,`, `;` or an opening bracket, or in a local `file:` URL.
Written with its `loaded/`, it also stays after `=`.
2026-11-12 13:31:33 -08:00
dotCooCoo 312d4a3914 Merge main into feat/image-color-mask 2026-11-12 13:30:24 -08:00
BFlat 71d717b1da Merge pull request #6940 from dotCooCoo/feat/learn-tool-locator
Learn: a tool's name in a tutorial step shows where the tool is
2026-11-13 04:26:05 +07:00