Commit Graph
6593 Commits
Author SHA1 Message Date
Taha-Mahmoodi 6ec5178708 Text: remove debug print in recessed_text and test invalid input in single dialog session 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi 956412e978 Tests: assert rejection highlight and dialog retention on invalid Enter commit 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi e2828bc064 Dialogs: keep dialog open on invalid Enter commit and prevent lock nesting in numeric widget 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi 5da8c8e495 Numeric: clamp committed values in point units, schedule rejection highlight repaint, and update roadmap/area evidence 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi 418f1bffc3 Fix #4638: clamp bounded effect length inputs on commit and reject invalid input visibly
In effect dialogs (like Color Halftone), length fields with defined bounds
(e.g. Max Radius 4..127 pt) were previously checked only after num_field
returned, leaving the field's temporary buffer holding the un-clamped string
(e.g. '0.5 px'). Subsequently entering invalid text caused the field to
fall back to that sub-minimum buffer.

- Added num_field_within to pass effect parameter bounds directly to unit_field.
- When committed, clamp the parsed value within bounds and update the field
  buffer to the formatted clamped value so the UI reflects what is applied.
- When invalid text is committed, clear the invalid buffer and trigger a
  one-frame border highlight so invalid input is rejected visibly.
2026-10-30 16:55:55 +07:00
jayzed80 c9504597ea pathops: a huge stroke width with round joins no longer panics Outline Stroke
normalize_bez ran the sweep without the catch_unwind guard that Sweep::new has,
so an outline_stroke width of 1e200 or more with a round join panicked inside
linesweeper (Left == Ish). The panic is now a Degenerate error and the art is
left unchanged. Adds hostile-number tests for the pathops edit, stroke and
offset functions.
2026-10-30 16:55:51 +07:00
BFlat a8ec515e1c Merge pull request #4689 from storytold/feat/addon-smart-pen
Add-ons: Smart Pen — draw and edit paths with one tool, panel
2026-10-30 16:24:46 +07:00
bflatastic 354b0a48f2 Docs: restore the Color Effects add-on section's spacing and code block 2026-10-30 16:02:27 +07:00
bflatastic 1ca3db1b51 Add-ons: Smart Pen — draw and edit paths with one tool, panel
A built-in add-on under Object › Plug-ins › Smart Pen:
- The Smart Pen Tool draws and edits Bézier paths without switching
  tools: a click adds the next segment straight or curved (a panel
  toggle; Tab flips the segment being placed or the last one), a drag
  makes a smooth point (Alt breaks the handle, Shift snaps to 45°, Space
  moves the point), a curve after a straight segment joins it tangent.
- On existing paths it selects and moves points, removes a point keeping
  the shape (Alt-click), toggles smooth/corner (double-click), drags
  handles, reshapes a segment by dragging it and inserts a point on it
  (Alt-click); it closes, continues and joins open paths.
- The Smart Pen panel: next segment straight or curved, remove points
  keeping shape, make smooth, make corner, retract handles, close or
  join.

The tool stays out of both toolbars as shipped; the All Tools drawer
lists it under the add-on's heading. Commands are addon.pen.*; the
existing Pen tool, commands and menus are unchanged.
2026-10-30 16:02:27 +07:00
BFlat e85e149384 Merge pull request #4685 from storytold/feat/addon-path-tools
Add-ons: Path Precision Tools — anchor eraser brush, extend path, measure, anchor inspector, crossings
2026-10-30 15:34:24 +07:00
bflatastic 25828cdcd7 Anchor Inspector: the Close Path buttons share a row under their label 2026-10-30 15:20:38 +07:00
bflatastic dc7f147608 Add-ons: Path Precision Tools — anchor eraser brush, extend path, measure, anchor inspector, crossings
A built-in add-on under Object › Plug-ins › Path Precision Tools:
- Anchor Eraser Brush: painting over selected paths removes the anchors
  under the brush that the outline can do without within a tolerance,
  refitting the handles beside them (Alt ignores the tolerance, Cmd/Ctrl
  deletes without refitting, pen pressure can scale the brush); one undo
  step per stroke.
- Extend Path tool: dragging an end of an open path carries it on
  straight, by stretching its last curve or along the circle it curves
  on, or shortens it back along itself.
- Measure & Inspect tool: drag to measure distance and angle; hover a
  path to read segment and path length, area, curvature, tangent and
  anchor angles and handles, in the document's units.
- Anchor Inspector panel: the selected anchor's position and handles as
  numbers, with Make Smooth (auto-smooth rule), Make Corner, Equalize
  Handles, Remove Points Keep Shape, Add Points and three ways to close.
- Add Points at Crossings and Split at Crossings.

The tools stay out of both toolbars as shipped; the All Tools drawer
lists them under the add-on's heading. Commands are addon.pathtools.*;
the existing commands, tools and menus are unchanged.
2026-10-30 15:20:38 +07:00
BFlat 764552bc9a Merge pull request #4680 from storytold/feat/addon-color
Add-ons: Color Effects — live exposure, desaturate and invert, apply as filter, panel
2026-10-30 14:32:20 +07:00
bflatastic 427752ce65 Add-ons: Color Effects — live exposure, desaturate and invert, apply as filter, panel
A built-in add-on in Effect › Color Effects and Object › Plug-ins › Color Effects:
- Exposure (stops of linear light, offset and gamma), Desaturate and
  Invert Colors as live colour adjustments, evaluated in stack order with
  those of Effect › Color Adjustments.
- addon.color.filter applies any colour adjustment to the colours
  themselves, through the Edit Colors pass, as one undo step.
- A panel picks an adjustment and its values, then adds it as a live
  effect or applies it as a filter.

The add-on lives in its own modules (effects, engine and ui-egui addons
folders) and leaves the existing effects, commands and menus as they
were.
2026-10-30 14:14:33 +07:00
Dylan M. Taylor 45be6f47bf UPD.1: honor app pretend versions in update checks (#4677) 2026-10-30 03:07:22 -04:00
BFlat 770709c980 Merge pull request #4678 from storytold/feat/addon-artwork-cleanup
Add-ons: Artwork Cleanup — simplify keeping shape, health check, deep ungroup, rejoin
2026-10-30 13:34:42 +07:00
bflatastic ac85b529fe Add-ons: Artwork Cleanup — simplify keeping shape, health check, deep ungroup, rejoin
A built-in add-on under Object › Plug-ins › Artwork Cleanup:
- Simplify Anchors (Keep Shape) removes anchors while the outline stays
  within a tolerance, optionally keeping sharp corners.
- Document Health Check finds and fixes 16 kinds of problems in the
  selection or the document (stray points, duplicate and collinear
  anchors, tiny handles, nearly closed paths, needless groups, compound
  paths and clipping groups, unpainted and invisible objects, duplicate
  objects, art off every artboard, empty artboards…), with Show, Fix
  Selected and Fix All, each fix one undo step.
- Deep Ungroup and Rejoin Path Pieces.

The add-on lives in its own modules (pathops, engine and ui-egui
addons folders) and leaves the existing commands, tools and menus as
they were.
2026-10-30 13:11:20 +07:00
Dylan M. Taylor a24d811c7b Update prompt shows the app icon and accent color instead of a letter (#4671)
UPDATE_APP (native builds; craft-update is a native-only dependency) carries our 128 px icon and accent (#e8573f, its colour in ArtCraft Launcher). The updater, the self-update
helper and craft-update's startup prompt all get them through crate::UPDATE_APP; the
prompt draws the icon, the accent and "by ArtCraft" (craft-update's default developer).

craft-update is pinned to storytold/craft-libs main at 1065653e7 (#434).
Clippy fixes for Rust 1.99 in untouched code (same logic):
- crates/svg/src/import/fx.rs
- crates/tools/src/text/tool.rs
2026-10-30 01:27:35 -04:00
BFlat f5548ad274 Merge pull request #4675 from storytold/fix/spinner-auto-repeat
Spinners: a held arrow repeats after a pause (#4267)
2026-10-30 11:22:39 +07:00
BFlat 9f6e70586c Merge pull request #4674 from storytold/feat/control-bar-symbol-replace
Control bar: Replace menu for selected symbol instances (#4121)
2026-10-30 11:22:15 +07:00
BFlat 49307e9cc1 Merge pull request #4673 from storytold/fix/mixer-color-mode-menu
Color Mixer popover: the Color panel's menu, with its color modes (#4249)
2026-10-30 11:21:59 +07:00
BFlat e1cf917e4b Merge pull request #4672 from storytold/fix/touch-second-finger
Touch: a second finger cancels a tool gesture the first one started; the pinch pans and zooms (#4198)
2026-10-30 11:21:39 +07:00
bflatastic 433dc7d91a Docs: spinner arrows repeat while held (#4267) 2026-10-30 11:04:29 +07:00
bflatastic acde3ea312 Spinners: a held arrow repeats after a pause (#4267) 2026-10-30 11:04:28 +07:00
bflatastic 53d3ff72b2 Docs: the Control bar's symbol Replace menu (#4121) 2026-10-30 11:04:25 +07:00
bflatastic 687f4c84b8 Control bar: Replace menu for selected symbol instances (#4121) 2026-10-30 11:04:24 +07:00
bflatastic 3e6693045d Tests: the mixer's menu checks the shown mode 2026-10-30 11:04:21 +07:00
bflatastic cdc8cb88c9 Docs: the Color Mixer popover's menu (#4249) 2026-10-30 11:04:21 +07:00
bflatastic bd1df49813 Tests: find the mixer's menu button by its size 2026-10-30 11:04:21 +07:00
bflatastic 6fd46e445a Color Mixer popover: the Color panel's menu, with its color modes (#4249) 2026-10-30 11:04:21 +07:00
bflatastic eeb6a2dcfc Touch: a second finger cancels a tool gesture the first one started; the pinch pans and zooms (#4198) 2026-10-30 11:04:18 +07:00
BFlat 0a3d1be313 Merge pull request #4664 from mockydevs/fix/ai-placed-file-origin
.ai import: try a placed file at its box's corner when the layers differ
2026-10-30 10:20:35 +07:00
BFlat 57f0cc2923 Merge pull request #4668 from storytold/feat/svg-shape-elements
SVG export: rectangles, circles, ellipses, lines and straight paths as SVG shape elements (#4652)
2026-10-30 10:01:02 +07:00
Don Omondi b8886d3da4 .ai import: try a placed file at its box's corner when the layers differ
A placed (linked) file is put where its matrix takes the canvas point of
art space's origin (the centre of %AI3_TemplateBox). In many files the
matrix takes the corner of the box the file is written with instead, so
the image landed far off its artboard, the layers differed from the
page, and the file came in as its PDF part.

The reader keeps that second placement for each placed file where the
two differ. When the layers don't draw as the page, they are compared
again with those files at their box's corner, and used if that draws
as the page. Files whose layers already match keep their placement.
2026-10-30 09:46:56 +07:00
bflatastic beb0ae6515 SVG export: rectangles, circles, ellipses, lines and straight paths as SVG shape elements (#4652) 2026-10-30 09:45:59 +07:00
Dylan M. Taylor c733ae97f0 CI: workflows only call craft-common-actions at @main (#4656)
AGENTS.md (and CLAUDE.md where present) gets a CI workflows section: workflows only call
craft-common-actions at @main, with no other jobs; feature and fix PRs don't touch CI and
link or open a craft-common-actions issue (a PR only for a small fix that is safe for
every app and does not increase CI time); legacy jobs
aren't added to and move only as their own task, staying until a shared workflow runs them.

windows-arm64.yml moves from its SHA pin to @main. The pinned revision is on
craft-common-actions main and the workflow (and the actions it calls) is identical
there, so nothing changes in behaviour.
2026-10-29 22:36:34 -04:00
Dylan M. Taylor 39bb862420 deps: bump tar, zip, roxmltree, rustls-webpki and symphonia to their latest versions (#4662)
- `roxmltree`: 0.20.0, 0.21.1 → 0.20.0, 0.21.2
- `zip`: 9.1.0 → 9.1.3

Lockfile only.
2026-10-29 22:32:34 -04:00
BFlat 4cc6482bd9 Merge pull request #4660 from mockydevs/fix/ai-tilde-operator
.ai import: a placed file on %_ lines no longer drops the layers
2026-10-30 09:18:04 +07:00
BFlat 501ebb5637 Merge pull request #4661 from C0uki/ja-updates-and-trace
i18n(ja): translate the update check and the trace progress labels
2026-10-30 09:17:48 +07:00
BFlat 19bded06c2 Merge pull request #4663 from datatimp/fix/4637-max-radius-feedback
Effect dialogs keep a typed distance within the effect's range
2026-10-30 09:17:34 +07:00
Don Omondi 380a3cfcff .ai import: a placed file on %_ lines no longer drops the layers
A placed (linked) file written as an object's editable copy, on %_
lines after its drawn look, has its %AI5_BeginPlace and %AI5_EndPlace
markers on those lines too. The lexer dropped comments after %_ that
don't start a section, so the placed file never began, the ~ that ends
it was an operator the reader didn't know, and the whole file came in
as its PDF part. The lexer now returns those two markers from %_ lines,
and the preview reader skips the %_ its header line starts with.
2026-10-30 09:01:24 +07:00
C0ukiandClaude Sonnet 5.5 f398f319da i18n(ja): translate the update check and the trace progress labels
The Help > Check for Updates… item, the update window and the Image Trace
progress labels had no ja row and drew English. Wording follows the
PhotoCraft ja catalog for the update strings.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5NRZNWfaSLBWVzV8hivyS
2026-10-30 09:01:17 +07:00
datatimp 6a80e43b68 Effect dialogs keep a typed distance within the effect's range (#4637) 2026-10-30 09:01:11 +07:00
BFlat afc6255ac2 Merge pull request #4653 from mockydevs/fix/pdf-export-mesh-shading
PDF export: gradient meshes as smooth Type 6 patch shadings
2026-10-30 08:42:44 +07:00
BFlat deaf697882 Merge pull request #4651 from mockydevs/fix/ai-blank-pdf-part
.ai import: a file whose PDF part is an empty page opens from its editing data
2026-10-30 08:42:26 +07:00
BFlat 5849ce24b3 Merge pull request #4658 from mockydevs/fix/ai-page-cropped-to-art
.ai import: a PDF part cropped to the art no longer hides the layers
2026-10-30 08:42:10 +07:00
BFlat dce393ff71 Merge pull request #4659 from storytold/fix/units-guides-reopen
Guides: a ruler guide shows while dragged with Real-time Drawing off (#4646)
2026-10-30 08:27:39 +07:00
Don Omondi 43db0c00bc PDF export: gradient meshes as smooth Type 6 patch shadings
PDF export (and the PDF-compatible .ai it writes) cut each gradient mesh
patch into 8 x 8 flat-coloured quads. Viewers showed colour bands and
hairline seams between them, and files with many meshes became very
large and slow to write.

An opaque mesh is now written as one Type 6 (Coons patch) shading
(ISO 32000-1, 8.7.4.5.7) filling its outline, through the PDF writer's
MeshGradient: each patch blends its corner colours bilinearly, as the
canvas draws it. Colours go through page_color as other fills do, and a
mesh mixing RGB with other models goes through RGB. A mesh with
see-through points, an invalid one, or one past the coordinate range
keeps the quads.
2026-10-30 08:15:20 +07:00
Don Omondi 87cb19c589 .ai import: a file whose PDF part is an empty page opens from its editing data
Squashed from #4651 onto main.
2026-10-30 08:15:16 +07:00
Don Omondi 0f1b70f8b1 .ai import: a PDF part cropped to the art no longer hides the layers
A PDF-compatible .ai whose PDF part's pages are cropped to its art (each
page the box of all the art, the editing data's bounding box) rather
than to its artboards came in as that PDF part: the editing data's
artboard wasn't the page's size, so its layers were refused. With
several artboards every page held all the art, so the document had a
copy of everything per page.

When the artboard isn't the page's size but the editing data's bounding
box is, the layers are compared with the page on that box and keep
their artboards. The comparison of their art with the page still
decides whether they are used.
2026-10-30 08:15:04 +07:00