Commit Graph
5637 Commits
Author SHA1 Message Date
dotCooCoo 00c0c1d6ea Learn: steps get check boxes, and skill rings fill as tutorials are finished
Each step of a Learn tutorial now has a check box that marks it done
once the tutorial's practice sample is open, and Finish tutorial marks
every step done. A skill's ring fills by the share of its tutorials
finished, its count shows tutorials finished of all, and a finished
tutorial has a check mark in its skill's list. Screen readers get the
count and the finished state as the rows' values.

The progress is saved with the UI preferences and read leniently: an
unknown tutorial, a step a tutorial does not have, a repeated entry or a
value of the wrong kind is skipped without resetting other preferences.
Reset progress under the list of skills clears it. A finished tutorial
can be finished again after a restart without reopening its sample.

- learn.markStep marks or clears one step; learn.resetProgress clears
  the progress; learn.list adds done and total per skill and finished
  and completedSteps per tutorial. Both new commands are in the UI
  command catalogs, and bad params are errors that change nothing.
- New labels and messages have rows in every catalog.
- Docs: docs/mcp.md, docs/target-app-parity.md and docs/ui-parity.md.
2026-11-13 17:26:47 -08:00
dotCooCoo 91f77f1eb8 Actions: Button Mode shows actions as colored buttons that play on a click
The Actions panel menu has a Button Mode item with a check mark. While it
is on, the panel shows every action of every set by name as a button in
its Action Options color, without set names, steps or checkmarks, and a
click on a button plays that action without its excluded steps. Choosing
Button Mode again shows the list.

- ui.action.buttonMode {enabled?} switches the view (left out: the
  other view) and is kept with the UI preferences; it cannot be turned
  on while an action records.
- ui.action.playAt {set, action} plays an action by its place, as the
  buttons do.
- An action without a color is an ordinary button. The bottom bar shows
  only Stop Playing/Recording while an action plays or records, and Play
  Current Selection while one waits at a stop. Menu items for a selected
  action or the current set are off in Button Mode.

Docs: docs/mcp.md, docs/ui-parity.md, docs/target-app-parity.md.
2026-11-13 17:26:31 -08:00
dotCooCoo edd2b83d1d i18n: Simplified Chinese has a row for 1,813 of the messages the untranslated report lists
Adds 1,813 @msg rows to zh-hans.tsv, one for each status and error message the
untranslated report listed for Simplified Chinese, except the 38 that open
pull requests translate in their own rows: the composite font, justification
order and Blob Brush connect end errors. The catalog test rejects a second row
for the same key, so leaving them out keeps the catalog consistent when those
pull requests merge.

The report now lists 40 zh-hans messages: those 38, and two that no catalog
has a row for yet. Its menu, tl!, undo label and swatch name sections are
unchanged. Placeholders, backticked names, quoted values and JavaScript
identifiers stay as in the source.

Docs: docs/localization-parity.md (zh-hans row), docs/target-app-parity.md.
2026-11-13 17:25:55 -08:00
dotCooCoo f3d04df7b8 i18n: Dutch has a row for the messages the untranslated report lists
The Dutch catalog lacked a row for 1,813 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.

- nl.tsv gains 1,813 `@msg` rows: the errors of commands and their
  parameter checks, scripts, file import and export, printing and
  plug-ins. The translations are VectorCraft's own, written from the
  English meaning with the catalog's conventions and its existing
  feature names. Placeholders, parameter names, command ids and
  literal values stay as the English writes them.
- The untranslated report lists 41 Dutch messages after the change:
  the composite font errors, the justification spacing error and the
  `connect` end error, which open #7211, #7116 and #7330 translate,
  and three unknown-parameter and range errors that open #7353
  rewrites so that a catalog row can match them. Menu strings, `tl!`
  literals and undo labels are unchanged.
- The row for `{k} has control characters{_1}` does not match the
  message for a multi-line File Info field, where the last
  placeholder is empty.
- docs/localization-parity.md's Dutch row and a line in
  docs/target-app-parity.md give the new counts.
2026-11-13 17:24:24 -08:00
dotCooCoo de8ac51502 Symbols: a stained instance keeps its stain in SVG, PDF and the other exports
A symbol instance colored with the Symbol Stainer lost its stain in
export whenever the canvas's stained art was not used:

- An instance with geometry effects was reshaped for export from the
  symbol's art with only its dynamic changes, so SVG, PDF, EPS, .ai,
  DXF, EMF/WMF and HPGL wrote the unstained colors. A color adjustment
  on an instance recolored the unstained art the same way.
- PDF, EPS, legacy .ai, DXF and EMF/WMF wrote an instance without
  effects from the unstained art.

tint_node, stain and instance_art now live in
vectorcraft_doc::symbol_overrides, which both the effects and the
exporters can use; vectorcraft_brush re-exports them. Baking, color
adjustments and the writers above now use instance_art: dynamic changes
first, then the stain.
2026-11-13 17:24:06 -08:00
dotCooCoo 257d45d994 i18n: Turkish has a row for 1,811 of the messages the untranslated report lists
The Turkish catalog had no row for 1,852 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.

- tr.tsv gains 1,811 `@msg` rows: the errors of commands and their
  parameter checks, scripts, file import and export, printing,
  plug-ins and Banner Hems and Grommets. The translations are
  VectorCraft's own, written from the English meaning with the
  catalog's terms and its existing feature names. Placeholders,
  parameter names, command ids and literal values stay as the English
  writes them.
- The 38 listed messages that open #7211, #7116 and #7330 add tr.tsv
  rows for are left out, so the catalog has no duplicate key when they
  merge.
- Three messages that open #7353 rewrites are left out: the unknown
  parameter error and the PDF setting range error, which have two
  placeholders in a row that no row can match, and the unknown
  parameter error for a format's settings.
- The row for `{k} has control characters{_1}` does not match the
  message for a multi-line File Info field, where the last
  placeholder is empty.
- The Turkish row of docs/localization-parity.md gives the catalog's
  current counts and what still falls back to English.

Docs: docs/target-app-parity.md, docs/localization-parity.md.
2026-11-13 17:18:02 -08:00
ncic b48688cb1c Pencil: a closed stroke closes with a straight segment
A closed freehand stroke is fitted as the open stroke would be and closed by a
straight segment from its end back to its start. Fitted as one loop, the
closing segment curved on past both ends and back, like a hat's brim.
2026-11-14 02:10:48 +01:00
dotCooCoo cc790703f8 i18n: Polish has a row for 1,808 of the messages the untranslated report lists
The Polish catalog lacked a row for 1,854 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.

- pl.tsv gains 1,808 `@msg` rows: the errors of commands and their
  parameter checks, scripts, file import and export, printing and
  plug-ins. The translations are VectorCraft's own, written from the
  English meaning with the catalog's conventions and its existing
  feature names. Placeholders, parameter names, command ids and
  literal values stay as the English writes them.
- 44 of the others get their Polish rows from open #7211, #7214,
  #7116, #7330 and #1931, so this change leaves them out. 2 are
  messages that no catalog has a row for yet. Menu strings, `tl!`
  literals, undo labels and swatch names are unchanged.
- Two of the messages have two placeholders in a row. The catalog does
  not load such a row, so those two are still shown in English.
- The Polish row of docs/localization-parity.md gives the catalog's
  current counts.

Docs: docs/target-app-parity.md, docs/localization-parity.md.
2026-11-13 17:07:14 -08:00
dotCooCoo e7240b5a37 i18n: Hungarian has a row for 1,813 of the messages the untranslated report lists
The Hungarian catalog lacked a row for 1,853 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.

- hu.tsv gains 1,813 `@msg` rows: the errors of commands and their
  parameter checks, scripts, file import and export, printing and
  plug-ins. The translations are VectorCraft's own, written from the
  English meaning with the catalog's conventions and its existing
  feature names. Placeholders, parameter names, command ids and
  literal values stay as the English writes them.
- The 38 rows that open #7211, #7116 and #7330 add to hu.tsv are left
  out, since a second row for the same key fails
  bundled_catalogs_are_consistent. The report lists those 38 and two
  messages that no catalog has a row for. Menu strings, `tl!`
  literals, undo labels and swatch names are unchanged.
- Two of the messages have two placeholders in a row. The catalog does
  not load such a row, so those two are still shown in English. The
  row for `{k} has control characters{_1}` does not match the File
  Info error for a multi-line field, where the last placeholder is
  empty.
- The Hungarian row of docs/localization-parity.md gives the catalog's
  current message counts.

Docs: docs/target-app-parity.md, docs/localization-parity.md.
2026-11-13 17:06:43 -08:00
dotCooCoo 78e7227358 Merge main into fix/graph-series-gradient-per-mark 2026-11-13 17:01:05 -08:00
dotCooCoo 269ca40954 Merge main into fix/colored-light-seams 2026-11-13 17:00:43 -08:00
dotCooCoo 2ee29aefc6 Merge main into fix/knockout-groups-flat-masks 2026-11-13 16:59:50 -08:00
dotCooCoo 6fc283b24c i18n: Czech translates 1,813 of the status and error messages the untranslated report lists
cs is in COMPLETE_MESSAGES, but the untranslated report listed 1,853
status and error messages with no Czech row, so with the interface in
Czech those messages showed in English.

- cs.tsv gains 1,813 `@msg` rows in one block after the last row. The
  translations are VectorCraft's own, written from the English meaning
  with the catalog's terms and typography (polite second person, Czech
  quotation marks „…“). Placeholders, backticked names, command ids,
  double-quoted values and bare true, false and null stay as the
  English writes them.
- The 38 messages whose Czech rows open #7211, #7116 and #7330 add are
  left out, so the catalog keeps one row per key when they merge.
- Menu strings, `tl!` literals, undo labels and swatch names are
  unchanged.
- The Czech row of docs/localization-parity.md gives the catalog's
  current counts.
2026-11-13 16:56:52 -08:00
dotCooCoo 45be5112e9 Merge main into fix/save-unused-option-notes 2026-11-13 16:56:43 -08:00
Dylan M. Taylor e4035a75db DXF import: read the drawing with craft_dxf::model
craft_dxf::parse_recovering reads the tags (ASCII and binary, any code
page), model::Document::read the sections, tables, blocks, layouts and
entity followers, and Entity::read each entity. The pair parser, the
records, the header, layer, block and layout readers and the colour
palette are gone; what stays is the mapping onto VectorCraft art.

Binary DXF files now open instead of being refused. A damaged binary
file says so.
2026-11-14 00:56:01 +00:00
dotCooCoo 2bd3466de2 i18n: Traditional Chinese has a row for the messages the untranslated report lists
The Traditional Chinese catalog had no row for 1,852 of the status and
error messages that i18n::tests::untranslated_report finds in the
sources, so the status bar showed them in English.

- zh-hant.tsv gets 1,813 @msg rows under one comment line at the end of
  the file, written in Taiwan usage with the catalog's existing terms.
  Each row keeps the English key, its placeholders, doubled braces,
  parameter names, command ids and quoted values unchanged.
- The 38 rows that open #7211, #7116 and #7330 add, and the row #7214
  added, are left out, so the catalogs stay consistent.
- docs/localization-parity.md and docs/target-app-parity.md give the new
  counts: 3,438 @msg and 48 @msgplural rows, 40 messages still listed.

The rows for `{name} must be {lo}–{hi}{unit} (got {v})` and
`unknown parameter `{within}{key}`; {why}` are counted by the report, but
Template::parse does not load a template with two placeholders in a row,
so those two messages still show in English. The row for
`{k} has control characters{_1}` does not match the message for a
multi-line File Info field, where its last placeholder is empty.
2026-11-13 16:54:23 -08:00
dotCooCoo 87b4a8053b Merge main into fix/graph-series-group-opacity 2026-11-13 16:49:51 -08:00
dotCooCoo 9af1ed78b0 Preferences: System Title Bar says when the desktop keeps the title bar either way
On Linux and the BSDs, the desktop draws the window's frame on X11, on
Wayland compositors that draw server-side decorations and in a window
opened through XWayland. There, with VectorCraft Title Bar on Every
Desktop off, the window has the desktop's title bar with System Title
Bar on or off, and the dialog showed nothing about it under System
Title Bar.

- The desktop app records at startup whether VECTORCRAFT_TITLEBAR is
  unset and the desktop would draw the frame without VectorCraft Title
  Bar on Every Desktop (VectorcraftApp::desktop_keeps_frame), from the
  frame probe and the launch path's XWayland choice.
- Preferences shows a note under System Title Bar in that case while
  VectorCraft Title Bar on Every Desktop is off, with rows in the 27
  catalogs that carry the neighboring title bar notes. The value is
  worked out at startup, so a Linux Display Server change shows in the
  note from the next start.

Docs: docs/control-protocol.md, docs/target-app-parity.md.
2026-11-13 16:46:36 -08:00
ncic 8a449cb98e Pencil: badged cursors keep their badge with Use Precise Cursors
The Pencil's and the Paintbrush's new-path, continue, close and straight-line
cursors are drawn on the crosshair already; Precise Cursors no longer turns
them into the plain crosshair, so the badge still says what the press or the
release does.
2026-11-14 01:45:40 +01:00
dotCooCoo aef3acd51b Text Wrap: Offset in picas reads bare numbers as the other length fields do
In a document in picas, a bare number typed in Text Wrap Options › Offset
follows Preferences › Units › Numbers Without Units Are Points, as every
length field drawn by the shared unit field does: points while it is on
(the default), picas while it is off. A test covers both settings, and
the evidence line in docs/target-app-parity.md states the rule.
2026-11-13 16:44:37 -08:00
dotCooCoo ab44332804 Merge main into feat/smooth-cursor-without-path 2026-11-13 16:43:32 -08:00
dotCooCoo 3b6f0f8051 i18n: Korean has a row for the status and error messages
The Korean catalog lacked a row for 1,852 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English. ko.tsv now has an @msg
row for 1,813 of them: the errors of commands and their parameter
checks, scripts, file import and export, printing and plug-ins.

The other 39 are messages that open #7211, #7214, #7116 and #7330
also translate in ko.tsv. They are left out so the catalog has no
duplicate key when those pull requests merge.

The rows keep every placeholder, parameter name, command id and
literal value of the English, and use the feature names the catalog
already has.

The report's Korean menu strings, tl! strings, undo labels and swatch
names are unchanged.

Docs: docs/localization-parity.md, docs/target-app-parity.md.
2026-11-13 16:36:39 -08:00
dotCooCoo be8d614b0c .ai import: straight compound paths whose guides reach past them keep the drawn look under Twist
A straight compound path with Twist was read live up to 180° whatever
guides it held, and the live Twist was measured from bounds that take in
the guide members. A straight compound path with Twist whose guide
members reach past its other members now opens as its drawn look
instead of live, and so does a compound path made only of guides.
Compound paths whose guides lie inside their other members, a Twist of
0°, and single paths keep opening live.

The `.ai` writer keeps a graphic-style link only where the reader reads
the style live, so such an object is now written without the link, with
the existing style-link warning.
2026-11-13 16:35:37 -08:00
dotCooCoo ead3cd1ebd Variables: Import Data Sets reads UTF-16 CSV files without a byte-order mark
A CSV file that holds NUL bytes and has no byte-order mark was refused.
It is now read as UTF-16 when at least half of its two-byte units hold
a NUL byte, in the byte order that reads a line break. A file with fewer
NUL bytes (UTF-8 or Windows-1252 text with stray NUL bytes, or UTF-16
text made mostly of characters above U+00FF) is still refused, and so is
a file that reads a line break in both byte orders, has an odd length,
isn't valid UTF-16 in that order or holds a NUL character. Refused files
get the same message as before.
2026-11-13 16:34:43 -08:00
BFlat 92d9604726 Merge pull request #7264 from dotCooCoo/fix/confined-svg-export-script-paths
MCP: SVG export by a confined caller refuses script links outside its read roots
2026-11-14 07:34:26 +07:00
BFlat 02f8a5ce88 Merge pull request #7317 from dotCooCoo/fix/app-bar-button-layout
Title bar: the app bar places its window buttons by the desktop's button layout
2026-11-14 07:34:18 +07:00
BFlat f14aa09bbf Merge pull request #7226 from dotCooCoo/fix/legacy-ai-type-kerning
PDF/.ai import: legacy type keeps manual kerning, discretionary hyphens and language
2026-11-14 07:34:10 +07:00
BFlat c79a21c8b7 Merge pull request #7320 from dotCooCoo/fix/graph-design-art-appearance
Graphs: Appearance and effect commands leave a design's art in a series out
2026-11-14 07:33:59 +07:00
BFlat 0c976db26c Merge pull request #7319 from dotCooCoo/fix/ai-wrap-options-saved
.ai save: the editing copy keeps text wrap Offset and Invert Wrap
2026-11-14 07:33:50 +07:00
BFlat 8009ea8e6d Merge pull request #7313 from dotCooCoo/fix/background-document-bounds
Type: a document replaced in the back measures its type when it is replaced
2026-11-14 07:33:42 +07:00
BFlat c6d580af4b Merge pull request #7280 from dotCooCoo/fix/colored-solid-faces-one-order-limit
3D: solid-color fills and strokes under colored lights draw their faces in one depth order
2026-11-14 07:33:34 +07:00
BFlat 13abf355c6 Merge pull request #7323 from dotCooCoo/fix/trace-palette-flat-ground
Image Trace: a nearly flat dark ground keeps one color in a Limited palette
2026-11-14 07:33:05 +07:00
BFlat 239152b6c8 Merge pull request #7303 from dotCooCoo/fix/slanted-seam-tolerance
Area type: lines stop at a gap between slanted contours however narrow
2026-11-14 07:32:55 +07:00
dotCooCoo 40f69a1204 Docs: the Brushes panel lists the second brush of a repeated name in its own numbered row
Reading a brush library numbers the second brush of a repeated name, so
the panel's row of that name previews and drags the first brush, and the
second brush has a numbered row of its own.
2026-11-13 16:27:27 -08:00
dotCooCoo 09f5efad22 i18n: Ukrainian translates 1,811 more status and error messages
uk is in COMPLETE_MESSAGES, but the untranslated report listed status
and error messages with no Ukrainian row, so with the interface in
Ukrainian those messages showed in English.

- uk.tsv gains 1,811 `@msg` rows. The translations are VectorCraft's
  own, written from the English meaning with the catalog's terms and
  typography (« » around interface names, ’ inside words).
  Placeholders, backticked names, command ids, double-quoted values and
  bare true, false and null stay as the English writes them.
- The 41 rows that open #7211, #7214, #7116, #7330 and #817 add to
  uk.tsv are left out, so the catalog keeps one row per key when they
  merge (bundled_catalogs_are_consistent rejects a second row for a
  key).
- The Ukrainian row of docs/localization-parity.md gives the catalog's
  counts.
2026-11-13 16:25:25 -08:00
dotCooCoo c6211b35ab Docs: the Linux title bar paragraphs describe the frame the desktop draws
docs/control-protocol.md said the window has no OS decorations on
Windows and Linux. On Linux and the BSDs the app bar is the title bar by
default only on a Wayland session without server-side decorations, such
as GNOME, in a window not opened through XWayland; elsewhere the desktop
draws the frame unless VectorCraft Title Bar on Every Desktop or
VECTORCRAFT_TITLEBAR=app turns the app frame on. The paragraph now says
so.

docs/development.md said the custom title bar is the Linux default. It
now says where the app bar is the default title bar. The comment on
CUSTOM_TITLEBAR in apps/vectorcraft/src/titlebar.rs made the same
Windows and Linux claim and now names Windows only.
2026-11-13 16:24:44 -08:00
dotCooCoo 0cb2b435a8 Live Paint: a Live Paint Selection double-click selects the connected faces or edges
A double-click with the Live Paint Selection tool on a face now selects
that face and the faces of its group that no stroked edge parts from it:
the selection floods across edges that are hidden or draw no stroke, and
hidden faces are left out. On an edge (Alt-double-click, or a
double-click with Select Fills off) it selects the edge and the edges of
its group joined to it end to end that draw with the same stroke paint.
With Shift held, the faces or edges reached leave the selection or join
it. The tool options, locks and isolation mode apply as they do to a
click.

The reach is computed by two read-only functions in the builder lookup
module, flood_faces and connected_edges, so the Live Paint commands can
use the same rules. An edge's stroke paint is the paint of its topmost
stroke that draws. Face outlines are matched to edges within the planar
map's precision, and edges join only at the ends of their subpaths.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 16:23:32 -08:00
dotCooCoo 6c51222275 Docs: Japanese message coverage is partial, with 38 rows left to open pull requests
The Japanese row of docs/localization-parity.md marks its messages as
partial and names the 38 messages the untranslated report lists without a
row: the 36 composite font errors that open #7211 translates, "select a
path" (open #7214) and the justification order error (open #7116). It
also names the three rows that do not match their message yet and why.
The Japanese line in docs/target-app-parity.md says the catalog has a
row for each reported message except those 38.
2026-11-13 16:20:17 -08:00
dotCooCoo d358baf9cc i18n: Brazilian Portuguese translates 1,812 of the status and error messages the untranslated report lists
pt-br is in COMPLETE_MESSAGES, but the untranslated report listed 1,851
status and error messages with no pt-br row, so with the interface in
Brazilian Portuguese those messages showed in English.

- pt-br.tsv gains 1,812 `@msg` rows. The translations are VectorCraft's
  own, written from the English meaning with the catalog's terms.
  Placeholders, backticked names, command ids, parameter names,
  double-quoted values and bare true, false and null stay as the English
  writes them.
- The 39 messages that open #7211, #7214, #7116 and #7330 add pt-br rows
  for are left out. bundled_catalogs_are_consistent rejects a second row
  for the same key.
- The Portuguese row of docs/localization-parity.md gives the catalog's
  counts: 9,260 rows, 3,445 of them `@msg` and 48 `@msgplural`.
2026-11-13 16:13:53 -08:00
dotCooCoo c0e70819f4 i18n: the untranslated report checks the effects, map_err messages and schema phrases
The untranslated report missed messages that reach the status bar:

- MESSAGE_CRATES now includes effects, color, render, three-d and pathops,
  whose errors the engine and the effects pass on (SVG filters, swatch
  libraries, raster sizes and encoders, 3D solids, path operations).
- The scan reads the messages a .map_err closure returns, from each if
  branch, match arm and the last expression of a block, the messages of
  a handler that .map_err(name) names (a closure bound with let, or a
  function), and the message given to a variant of an enum whose name
  ends in Fail (CompileFail::Syntax). The steps of a script result's
  path ([{i}]{place}, .{k}{place}) are not messages.
- The report and the VECTORCRAFT_I18N_DUMP_MESSAGES dump include the
  phrases a parameter schema's error builds at run time (SCHEMA_PHRASES).

Missing translations stay report-only. On main at 0b29b2b1f6 the report
lists 126 more messages, missing in all 23 languages that translate
every message: 43,084 missing rows before, 45,983 after.
2026-11-13 16:06:26 -08:00
dotCooCoo 5b4e613d0b 3D: colored-light facets close their shared edges over an underlay
Under a colored light, Inflate's facets were antialiased one by one.
Where two facets met, their edge pixels added up to less than full
coverage. The solid-color composite then showed its black channel
backdrop there, so internal edges drew darker at 1:1, and the per-facet
gradient art let the background through.

- The solid-color composite draws, in each channel, an underlay of the
  facets with 2 pt round seams between the black backdrop and the
  facets themselves.
- The per-facet routes put each run of consecutive faces of one surface
  over an underlay of its own faces, clipped to the union of the faces
  and their seams. Runs that carry a gradient's opacity mask are sealed
  with that mask. A face clip's footprint keeps only the outer contours
  of its seam stroke.
- The paint-copy allowance for cut faces counts 12 copies per facet.

At 1:1, inside the surface each color channel of an opaque fill is
within 3 levels of the same art drawn at 3x and averaged down, and
every pixel is opaque. Before, 2,267 channels differed by up to 10
levels on the solid Inflate, and 1,088 pixels of the gradient Inflate
were below full alpha. Under white light, the rendered pixels, the SVG
text, the PDF read back and the expanded art of Inflate, Extrude,
Rotate and Revolve are the same as before.

Docs: docs/three-d.md (Seams), docs/target-app-parity.md.
2026-11-13 16:03:37 -08:00
dotCooCoo 187032fbb2 Path Precision Tools: Corner commands refuse unknown item keys
addon.pathtools.cornerSet and cornerRemove now refuse a key other than
id and anchors in an `items` member, with the standard unknown-parameter
error, instead of ignoring it. A misspelled `anchor` used to fall back
to the request's `anchors`, else the path's direct-selected anchors,
else every corner of the path. They also refuse `items` given together
with `ids`, which `items` replaces. Saved steps played with replay
still run as recorded.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 16:03:08 -08:00
dotCooCoo 89ee320591 Graphs: a series group also keeps its isolation and knockout
transparency.set and object.setProps with isolate, knockout or
knockoutShape on a series group now store them for the series
(groupIsolate, groupKnockout, groupKnockoutShape), and the series group
has them again when the graph is drawn again. Randomize Opacity, Sort
Objects and Global Edit store the opacity they give a series group, so
a redraw no longer puts back an older stored value over it.

A move or copy of an appearance onto a series group whose stored values
differ from its own now counts as a change, so the edit is kept. Tests
cover graphicStyle.redefine of a style linked to a series group.
2026-11-13 16:02:54 -08:00
dotCooCoo e06d0577b3 i18n: Japanese leaves out the rows #7211, #7214 and #7116 add
Open #7211, #7214 and #7116 add Japanese rows for 38 of the messages this
branch translates. A second row for the same key fails
bundled_catalogs_are_consistent once both sides merge, so this branch
drops its 38 rows and leaves those messages to the other pull requests.
The Japanese lines in docs/localization-parity.md and
docs/target-app-parity.md give the new counts.
2026-11-13 16:00:22 -08:00
dotCooCoo 9a355b1a75 i18n: German leaves out the rows #7211, #7214 and #7116 add
Open #7211, #7214 and #7116 add German rows for 38 of the messages this
branch translates. A second row for the same key fails
bundled_catalogs_are_consistent once both sides merge, so this branch
drops its 38 rows and leaves those messages to the other pull requests.
The German lines in docs/localization-parity.md and
docs/target-app-parity.md give the new counts.
2026-11-13 15:58:36 -08:00
dotCooCoo d30831bd5a Merge main into feat/live-paint-cursor-swatch-preview 2026-11-13 15:54:47 -08:00
dotCooCoo 252ff7782a Merge main into fix/graph-series-gradient-per-mark
# Conflicts:
#	docs/mcp.md
2026-11-13 15:49:27 -08:00
dotCooCoo 92594378aa i18n: French leaves out the rows #7211, #7214 and #7116 add
Open #7211, #7214 and #7116 add French rows for 38 of the messages this
branch translates. A second row for the same key fails
bundled_catalogs_are_consistent once both sides merge, so this branch
drops its 38 rows and leaves those messages to the other pull requests.
The French row of docs/localization-parity.md gives the new counts.
2026-11-13 15:47:53 -08:00
dotCooCoo dd411ec6b4 Image Trace: a JPEG's 8 x 8 blocks no longer trace as staircase steps
A JPEG rounds each 8 x 8 block's tone on its own, which leaves a small
step at every block edge. Where a dark ground changes slowly, those steps
decided which of two palette colors a whole block got, and the trace
followed the block edges as a staircase.

The new deblock pass finds the block grid in the image: the mean step
between neighboring opaque pixels must peak at the same one of eight
positions at both block edges of a 16 px span, across and down. Cropped
JPEGs and JPEGs saved in another format are found the same way; pictures
of flat 8 x 8 cells are not. At each block edge, a stretch of eight lines
whose step is under the limit and whose pixels hold no edge has the step
spread over the eight pixels around the edge, as the deblocking filters
of ITU-T H.263 Annex J and MPEG-4 Part 2 Annex F.3.1 do. Larger steps are
kept. The limit, the edge guard and how much of each line's own step is
smoothed depend on the mode: Black and White smooths only the smallest
steps, and traces of more than 16 colors move every line of a stretch
by the same amount. The pass runs before the photo pre-filter and works
in strips of rows, so only its output is as large as the image.
2026-11-13 15:47:30 -08:00
dotCooCoo 76d99d6afb Merge main into fix/ai-graphs-keep-data 2026-11-13 15:46:07 -08:00