Commit Graph
4947 Commits
Author SHA1 Message Date
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
Drew Dibble 05fd55bde1 3D effects: every facet's seam has round joins
Each 3D facet is stroked with a narrow seam of its own paint (0.05 to
0.75 pt; Revolve's is always 0.75 pt) so neighboring facets meet without
an antialiasing hairline. In Extrude & Bevel, Inflate and Rotate under a
white light, and in every face of the 3D (Classic) effects (Extrude &
Bevel, Rotate and Revolve (Classic); shaded, No Shading, gradient and
pattern alike), that seam kept the default Miter Join with its limit
of 10. Revolve's seams and the colored-light seams
were already round. A facet seen almost edge-on is a sharp sliver, and
its mitered seam reached up to ten times its half-width past the facet's
tip: thorns of up to 3.75 pt past the solid, along the tops of type seen
tilted and at every edge-on bevel facet.

#2706 (multiple lights) deliberately kept white-light seam joins as they
were, so that legacy white-light output stayed byte-identical to main
(its comment "Preserve existing white-light paints, alpha composition and
seam joins exactly", and four PNGs compared byte for byte). That kept
the thorns too. This change reverses that one part on purpose: the
paints and alpha composition stay exactly as #2706 left them; only the
join changes.

- Outputs change, the document model doesn't. Exports draw the new
  joins (SVG writes stroke-linejoin="round", PDF and .ai draw round
  joins), and Expand Appearance writes round seams into the document.
  But nothing a document stores selects the join, and the format is
  unchanged, so there is no version gate: an old file drawn now simply
  has no thorns.
- Round joins. Projected facets rarely have right-angle corners (a
  square seen at an angle is a parallelogram with acute corners, and an
  exact 90° corner sits at a √2 limit), and round is what the seams of
  colored lights and Revolve already draw. The cost: where a facet has
  no neighbor (Rotate's plane, every silhouette corner) its convex
  corners are drawn rounded by up to 0.375 pt instead of sharp.
  Alternatives weighed and not taken: a Miter Join with a limit near √2
  at every seam, the composed clip included, which would bevel slivers
  but chamfer most projected corners as well; and seaming only the edges
  facets share, or clipping facets to their union as solid_surface
  does, which would keep every outer corner sharp but means a new
  geometry pass for every 3D effect. Round is the smallest change that
  matches the seams already drawn.
- A seam no longer reaches past its facet by more than half its width,
  so the art's visual bounds shrink by up to 3.375 pt where a thorn
  stood (10 × 0.375 less the 0.375 a round seam still reaches).
  White-light output is no longer byte-identical to #2706's comparison;
  docs/3d-lighting-performance.md says so.

Every seam stroke is made by lighting::seam_stroke. The colored clip in
composed_art already outlined its seam with round joins and is
unchanged. Tests: every seam of Extrude & Bevel, Extrude & Bevel (Classic, each
branch), Rotate (Classic), Inflate and Rotate, under white and colored
light, has round joins and reaches no more than half its width past its
face, at views that make a sliver; Revolve (Classic)'s seams are round
on each surface; a mitered seam fails them, and so does the legacy
white-light Inflate test, which now expects Round.
2026-11-12 15:47:18 -07: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 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
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
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 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
BFlat 3434e46240 Merge pull request #6825 from dotCooCoo/feat/custom-arrowheads
Stroke: custom arrowheads from an arrowheads file join the arrowhead menus
2026-11-13 04:25:55 +07:00
BFlat 321aa13251 Merge pull request #6962 from dotCooCoo/fix/trace-tinted-photos
Image Trace: sepia, single-hue and duotone photos are smoothed as gray photos are
2026-11-13 04:25:36 +07:00
BFlat b8d23007e8 Merge pull request #6964 from dotCooCoo/fix/shaper-stroke-click-construction
Shaper: a click on an original shape's outline enters Construction mode
2026-11-13 04:25:26 +07:00
BFlat da84e53b30 Merge pull request #6864 from jmverges/fix/6856-ai-type-pattern-paint
.ai import: type filled or stroked with a pattern keeps its pattern
2026-11-13 04:25:16 +07:00
dotCooCoo a670c3072b MCP: document.json names linked JavaScript files outside the read roots by file name
With automation read roots in force, document.json returned each entry of
svg_scripts unchanged, so a JavaScript file linked from outside the read
roots kept its full path in the reply. The reply copy now names such a
file by its file name alone. An entry given as a URL is kept, and the
stored document is not changed.
2026-11-12 13:18:17 -08:00
dotCooCoo c513114674 Gradients: Expand reports a capped gradient as unavailable
- object.expand.info reports no gradient or fill to expand for a
  gradient that repeats in more runs across its box than are written,
  matching object.expand, which leaves it a gradient. For a path that a
  painting live effect draws, it measures each piece the effect returns.
- CSS writes a repeating gradient's stop positions, and a repeating
  radial gradient's radius, with enough decimals that their rounding
  adds up to at most a hundredth of a period across the box (at least
  four for positions and three for the radius).
- docs/mcp.md says that sharp steps and swatch-linked stops are the last
  to be left out rather than always kept, and that the CSS conic limit
  counts stops before midpoints and Perceptual curves add more.
2026-11-12 12:55:54 -08:00
dotCooCoo 264a6541e6 Merge main into fix/dialog-set-hidden-fields 2026-11-12 12:55:47 -08:00
dotCooCoo 5edc0fa4f8 Merge main into perf/setformat-per-paragraph 2026-11-12 12:52:42 -08:00
dotCooCoo dc79bbbe73 Image Tools: Color Mask refuses a process color on each gray image it masks
Color Mask checked the whole document for a grayscale image colorized
with a process color only when the document passed that check before
the run. With another such image already in the document, the check
was skipped, and a process-colorized gray image could take masked
pixels with transparency.

Each image whose mask changes is now checked on the pixels the new mask
shows, made from the image's own pixels, so an image elsewhere in the
document no longer affects the result. A mask that hides nothing keeps
the image's own pixels and is still set. When new pixels replace a
masked gray image's own pixels under a process color, the mask made for
them hides nothing, and Apply Color Mask refuses them. The check shares
its colorize predicate with paint's check_colorized.
2026-11-12 12:51:25 -08:00
dotCooCoo f02a572c6a Merge main into fix/assign-profile-working-spaces 2026-11-12 12:46:52 -08:00
dotCooCoo b9946efb1e Merge main into feat/cjk-insert-aki 2026-11-12 12:46:09 -08:00
dotCooCoo 950494802e Merge main into feat/outline-object-image-alpha
# Conflicts:
#	crates/effects/src/tests.rs
2026-11-12 12:45:45 -08:00
dotCooCoo b0cde0067e Document Info: strokes and fills at opacity 0 list no brush or paint
A stroke at an opacity of 0 draws nothing, so its brush is no longer
listed in the Brushes category, brushNames or brushes. Pattern Objects,
Gradient Objects and Spot Color Objects likewise leave out fills and
strokes at an opacity of 0, and Objects no longer counts objects whose
only such paint is at opacity 0.
2026-11-12 12:45:28 -08:00
dotCooCoo 18aed1da4e Merge main into feat/dcs-linked-spot-plates 2026-11-12 12:45:18 -08:00
dotCooCoo 15ffb4ec01 Merge main into feat/export-notes-loss-first 2026-11-12 12:45:09 -08:00
dotCooCoo cbfe5248bb MCP: a readable library's id keeps a hidden path that it holds after its start
A reply hid a hidden library's absolute path wherever it appeared, also
inside another loaded library's id when the match began after the id's
start. With `/libs/Kit.gpl` hidden, the readable id
`loaded//project/libs/Kit.gpl` came back as `loaded//projectKit.gpl`,
and a request that used it failed.

Each whole readable id in a reply (with or without `loaded/`, or in a
`file:` URL with no host or `localhost`) is now found first, and a
hidden id or path that lies inside it stays. The same path after a
drive or in a URL with another host is still hidden.
2026-11-12 12:29:20 -08:00
BFlat 80f909a162 Merge pull request #6936 from dotCooCoo/fix/css-export-scope-type
CSS: css.export refuses a scope or path that is not a string
2026-11-13 03:29:20 +07:00
BFlat bb3f5c6d1a Merge pull request #6827 from dotCooCoo/fix/read-roots-document-replies
MCP: document.inspect and document.json leave out paths outside a confined client's read roots
2026-11-13 03:29:01 +07:00