Commit Graph
4177 Commits
Author SHA1 Message Date
BFlat ce998b89bc Merge pull request #3007 from nrq6993-a11y/stream/vc-feat3-g9-ai-nonprinting-guides
G9: Regression tests for Illustrator path guides from editing data (#779)
2026-10-20 01:59:59 +07:00
nrq6993-a11yandCursor 2f93923e60 G9: regression tests for AI editing-data path guides (#779)
Lock in (op) * guide import: plain, legacy-wrapped, and stroked paths stay guide geometry.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-20 01:43:57 +07:00
BFlat 68a99c359b Merge pull request #2013 from shorbank/feat/2008-color-picker-layout
#2008: improve color picker layout
2026-10-20 01:43:25 +07:00
BFlat 1a1b0dfd59 Merge pull request #2685 from krinry/feat/pencil-alt-smooth
G1: Pencil Alt key toggles to Smooth Tool (#2001)
2026-10-20 01:43:11 +07:00
Shayan Horbank 472a6d5359 UI: improve color picker layout (#2008)
Add a centered draggable header, stacked actions and aligned input groups.
Compact the color controls and use vertical scrolling in narrow windows.
Keep the screen sampler above the field and Tab through each color model
before the next. Confirmation, cancellation and live preview stay shared.

Preserve screen-reader button names and channel values, units and ranges.
Add pointer/key, layout, warning and AccessKit regressions, and update the
required progress notes without changing parity scores or estimates. Correct
the stale #1692 gap status while retaining the open Direct Selection gap.
Document dialog rendering, button sizing and the regression helpers.

Validation: cargo xtask ci passed all 10 steps with official Rust 1.99,
including strict Clippy, 8437 workspace tests and all WASM checks. All 17
targeted color picker tests passed. German, enlarged English, narrow-window
and color-warning UI renders were reviewed locally.

Fixes #2008
2026-10-20 01:30:19 +07:00
bflatastic 819da290f1 Pencil: Alt key toggles to Smooth Tool is kept with the tool's other options, and Georgian has its label (#2685) 2026-10-20 01:30:19 +07:00
bflatastic 303c5f8bca Pencil: Alt key toggles to Smooth Tool starts off, as Pencil Tool Options ships it (#2685) 2026-10-20 01:19:14 +07:00
krinry de985a46e6 Pencil: Alt key toggles to Smooth Tool (#2001) 2026-10-20 01:18:45 +07:00
BFlat 035f1cb2f6 Merge pull request #2951 from Hamza0101/inch-ruler-binary-ticks
Rulers: an inch is divided in half, not in ten
2026-10-20 00:02:15 +07:00
BFlat e52b07105d Merge pull request #3107 from FractalEncrypt/fix/status-bar-layout
Keep status-bar messages and readouts stable
2026-10-20 00:01:57 +07:00
Hamza 00f1231334 Tab stops: Shift snaps to the ruler's binary inch ticks
`shift_drag_snaps_a_stop_to_the_nearest_tick` landed while this branch was out
and asserts the tick an inch ruler used to carry: "the ticks are a tenth of an
inch (7.2 pt) apart", snapping 100 pt to 100.8. That tenth is what this change
removes -- an inch ruler divides the inch in half, not in ten.

The nearest tick to 100 pt is now 99 pt: 1 3/8 in, an eighth of an inch from
1 1/4. The test says so, and also asserts the result is a binary fraction of an
inch rather than a particular number, so it holds if the ladder is retuned.
2026-10-19 23:47:04 +07:00
Hamza c58c642f07 Rulers: the left ruler leaves out a label that would run into the one above
A label on the left ruler is spelled one character per line, so a long one is
tall: "-0.0625" is seven characters and reaches 60.5 pt down the ruler, while a
sixteenth-inch step leaves 54 pt at zoom 12. Binary steps made such labels
reachable -- the decimal ladder's "-0.1" was four characters in an 86 pt gap --
so the ruler could draw one label over another.

A label that would start inside the one above it is left out. Every tick still
draws, as do the labels that fit, and `vertical_label_height` gives the reach
of a label so the decision is one comparison.
2026-10-19 23:47:04 +07:00
Hamza 39b59b5730 Rulers: stop labelling an inch ruler at a sixteenth
Labelling to a hundred and twenty-eighth left the left ruler unreadable: it
spells a label one character per line, 8.5 pt apart, and at zoom 50 the step is
1/64 with labels 56.25 pt apart while "0.015625" needs 61.5 pt. At zoom 100 it
is "0.0078125" in the same space.

The label ladder stops at a sixteenth, as the report says Illustrator's does,
so zooming in past that leaves the labels where they are and only the ticks
between them grow denser -- down to a hundred and twenty-eighth, which is the
32nds, 64ths and 128ths the report expects to appear unlabelled. Every label is
at most the six characters of "0.0625", which fits the 50 pt the ladder leaves.
2026-10-19 23:47:04 +07:00
Hamza 2c6a2ad082 Rulers: an inch is divided in half, not in ten
Zooming in on an inch ruler stepped through 0.2, 0.1 and 0.05 of an inch:
`Unit::ruler_step` picked from one decimal ladder for every unit, and the
rulers divided whatever it returned by ten. A tenth of an inch is not a mark an
inch ruler carries (#2827).

Below an inch the steps are binary fractions now, 1/2 down to 1/128, and
`Unit::ruler_minor` gives the unlabelled ticks between two labels: an eighth of
the step on an inch ruler, so every tick is a binary fraction of an inch and
they stay about as dense as the tenths elsewhere. An inch and wider keeps the
shared ladder, and the metric units, points, pixels and picas keep their
tenths. Ruler-tick snapping follows the ticks that are drawn, which moves an
inch document's Shift-drag of a guide onto the same grid.

`ruler_label` took its decimals from `(-step.log10()).ceil()`, which writes
1/16 as "0.06" and 1/8 as "0.13" -- wrong values, not just rounded ones. It
uses the fewest decimals that write the step exactly, and drops trailing zeros
as `Unit::number` does, so a sixteenth-inch ruler labels the inch `1` rather
than spelling `1.0000` down six lines of the vertical ruler.
2026-10-19 23:47:03 +07:00
FractalEncrypt b09e23f4a1 M14: cache status-readout sample widths by display settings 2026-10-19 23:47:01 +07:00
FractalEncrypt 1e914c8d82 M14: document the status-bar readouts, helpers and regressions 2026-10-19 23:46:59 +07:00
FractalEncrypt 45d9a409d4 M14: keep status messages and readouts stable 2026-10-19 23:46:59 +07:00
BFlat 9d4675e7d4 Merge pull request #2962 from MiQ71/fix/issue-1299-dxf-circle-arc
DXF: export circular paths as native CIRCLE and ARC entities
2026-10-19 23:43:53 +07:00
BFlat d5dfbf4bc3 Merge pull request #3106 from FractalEncrypt/fix/canvas-reprojection-resize
Preserve cached canvas scale during viewport resizing
2026-10-19 23:43:36 +07:00
Mirko Kerezovic af48dda322 M4: address DXF circle export review (#1299) 2026-10-19 23:34:20 +07:00
Mirko Kerezovic b87cb157ed M4: export DXF circles and arcs as native entities (#1299) 2026-10-19 23:34:19 +07:00
bflatastic d2b927b57b Docs: the canvas-scale gap entry reads as the others do (#3106) 2026-10-19 23:34:18 +07:00
FractalEncrypt 04750ece1b M11: bound cached canvas dimensions to the renderer limit 2026-10-19 23:34:17 +07:00
FractalEncrypt c08955320c M11: document the canvas show entry point 2026-10-19 23:34:16 +07:00
FractalEncrypt 742a5c1af2 M11: preserve cached canvas scale during viewport changes 2026-10-19 23:34:16 +07:00
BFlat 1f80c28662 Merge pull request #3131 from storytold/fix/batch-zd-followups
Batch follow-ups: #3004 test prints, #3095 catalog rows, #3042 doc banners
2026-10-19 23:17:58 +07:00
bflatastic 6fed871f88 Docs: the live-text PDF Place notes go in the docs' own sections, without update banners (#3042) 2026-10-19 23:14:20 +07:00
bflatastic 3033fb9985 i18n: Move Anchor Point, the label of path.moveAnchor, in every catalog that has its sibling labels (#3095) 2026-10-19 23:14:09 +07:00
bflatastic 7e1095f9b1 Tests: the Type arrow tests drop their debug prints (#3004) 2026-10-19 23:14:09 +07:00
BFlat f378c5c836 Merge pull request #3042 from KnottyDyes/squad/place-pdf-keeps-text
PDF: placed and pasted pages keep live text
2026-10-19 23:13:58 +07:00
BFlat 55acd88d42 Merge pull request #3001 from ariymarkowitz/claude/changes
#2558: a drag over a wide blur draws it from the still frame's raster
2026-10-19 23:13:46 +07:00
BFlat 319221c087 Merge pull request #3102 from dotCooCoo/fix/effect-art-follows-fonts-and-color-settings
Effects: effect art redraws when fonts arrive or the color settings change
2026-10-19 23:13:31 +07:00
BFlat 9d43326ad7 Merge pull request #3095 from sungjea713/anchor-point-shift-moves-anchor
Anchor Point tool: Shift-drag on an anchor moves it, handles and all
2026-10-19 23:13:12 +07:00
BFlat 8baf5b1343 Merge pull request #3004 from sanyamsingh001/codex/r82-type-grapheme-boundaries
Keep Type arrows on grapheme boundaries in mixed-direction text
2026-10-19 23:12:59 +07:00
BFlat a60f8d7b9f Merge pull request #3120 from Janiz-zzz/fi-update-20261019
i18n(fi): translate 67 labels added since the Finnish review
2026-10-19 23:12:41 +07:00
BFlat 2c52bed0b5 Merge pull request #2961 from Hamza0101/encrypted-pdf-note
Exports: say that an encrypted PDF still differs, and test the clock fallback
2026-10-19 23:12:28 +07:00
BFlat de3dd27fda Merge pull request #2988 from 00xJS/fix/2675-pdf-invisible-text
PDF import: say when invisible text is left out (part of #2675)
2026-10-19 23:12:13 +07:00
BFlat 575bd0f924 Merge pull request #3006 from rotohun/fix/ai-hyphenation-tab-operators
eps: read Illustrator text with hyphenation and tab attributes
2026-10-19 23:11:54 +07:00
BFlat 1ef66c48c1 Merge pull request #2969 from dotCooCoo/fix/data-sets-file-dialogs-off-ui-thread
Variables: Import and Export Data Sets… show file dialogs on macOS and keep the window running
2026-10-19 23:11:36 +07:00
BFlat 35b5895183 Merge pull request #2964 from dotCooCoo/fix/pdfinfo-thumbnail-page
MCP: document.pdfInfo refuses a thumbnail that is not a page number
2026-10-19 23:11:22 +07:00
BFlat 0bd2a40128 Merge pull request #3074 from Silvertree2010/fix/3036-objects-as-guides-blocks-group-d
Stop locked guide objects from blocking marquee selection
2026-10-19 23:11:05 +07:00
BFlat 605597b09c Merge pull request #2968 from Silvertree2010/fix/h2813-deleting-an-anchor-from-a-closed
Clear dangling handles when deleting anchors from a closed path
2026-10-19 23:10:47 +07:00
BFlat 646563b033 Merge pull request #3115 from Silvertree2010/fix/h550-polygon-covers-rect-treats-a-sel
Reject self-intersecting polygons in polygon_covers_rect
2026-10-19 23:10:35 +07:00
BFlat 2861c113d6 Merge pull request #2821 from dotCooCoo/feat/linux-desktop-ai-eps-types
Linux: file managers offer VectorCraft for .ai, EPS and every other format Finder offers it for
2026-10-19 22:40:08 +07:00
KnottyDyes 48a0206adb PDF: placed and pasted pages keep live text
Honor the requested text mode in the single-page importer, as Open does, instead of forcing outlines for Place and PDF clipboard import.

Add synthetic regressions for bytes, unlinked paths, selected pages and explicit outlines. Update format parity and milestone evidence without changing scores.
2026-10-19 22:19:59 +07:00
Ari MarkowitzandClaude Opus 5.5 1fc3c23096 #2558: the coarser glow test also pans by fractions of a pixel
For review: after pans of (0.5, 0) and (37.3, -21.6), the Outer Glow
made coarser over its whole reach (scale 2 and 3) is still drawn from
the kept raster, placed at the nearest whole pixel as a full-size
raster kept whole is, and each frame equals a fresh renderer's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:19:57 +07:00
Ari MarkowitzandClaude Opus 5.5 7dc0c034d8 #2558: a coarser glow kept whole draws after a pan as made again
A test for review: an Outer Glow made coarser over its whole reach is
kept for any pan, since its grid starts at the reach's first whole
device pixel, which a whole-pixel pan moves with the art. After pans
that aren't multiples of its scale (2 and 3), the kept raster draws
exactly what a fresh renderer draws.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:19:57 +07:00
Ari MarkowitzandClaude Opus 5.5 be7fd07562 #2558: a drag over a wide blur draws it from the still frame's raster
An effect raster too large to keep whole (a wide blur, a shadow or glow,
or any blur zoomed in) is cropped to what can show in the view, or made
at a lower resolution and resampled to the view's pixels, and kept while
the view stays the same. Dragging other art over the object then draws
its effects from the still frame instead of previewing them at the
drag's lower resolution on every frame. An interaction's frames stay on
the render worker once it drew the frame shown, since only its renderer
holds those rasters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:19:57 +07:00
dotCooCoo 007f536c79 Effects: effect art redraws when fonts arrive or the color settings change
The renderer kept the art it made for an object's effects while the
object stayed the same. In the web build, type that a geometry effect
outlines, on its own, in a group or in a symbol's art, kept the
substitute font's outlines after its own font loaded. On the desktop,
Refresh Font List left them on a symbol instance whose art holds the
type. Objects with Revolve, Extrude & Bevel, Inflate or Rotate, and
objects and groups with a color adjustment, kept the colors they were
shaded or recolored with after the color settings changed. Live objects
already followed both.

The renderer now keeps that art with the inputs it keeps for the art
of live objects: the font generation when the art holds type, the art
of the symbols it shows, and the color settings. A temporary release
test timed the added key at 11 microseconds a frame for 400 type
objects with a drop shadow and 0.77 ms for 400 symbol instances of 100
paths each with a drop shadow, against warm frames of 5.3 and 72 ms.

Docs: docs/target-app-parity.md, docs/gaps.md.
2026-10-19 22:19:55 +07:00
sungjea kimandClaude Opus 5.5 515569470c Anchor Point tool: Shift-drag on an anchor moves it, handles and all
With the Anchor Point tool, a drag from an anchor pulls out smooth handles.
Shift held at the press now moves the anchor instead, its handles keeping
their offsets; Shift kept down during the drag keeps the move at 45° steps
(the constrain angle), released it frees it. A Shift-click that doesn't
move leaves the anchor as it was. A selected blend's spine points follow
the same rule (object.blend.spine.moveAnchor).

The move goes through a new engine command, path.moveAnchor
{id, subpath?, anchor, x, y}, since path.moveAnchors only acts on the
direct-selected anchors and the Anchor Point tool keeps no anchor selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:19:53 +07:00