cb68229bda
Docs: name the reference app again in ROADMAP and docs/mcp.md
bflatastic
2026-10-04 23:19:45 +07:00
0358c4df95
M3.35: gradient handles snap and honour Constrain Angle; double-clicking a tool button opens its options
bflatastic
2026-10-04 23:18:34 +07:00
0f1565aed2
M3.43: effects render on type, placed images, symbol instances, blends, envelopes, meshes and repeats; a fill or stroke's own raster effects render and export as SVG filters on that element
bflatastic
2026-10-04 23:15:13 +07:00
93640efb36
M3.34: copied appearances place their gradients on the target's own bounds
bflatastic
2026-10-04 23:07:51 +07:00
f363cdb4ee
M3.36: SVG and PDF export draw arrowheads, width profiles, brushes and aligned strokes as the canvas does
bflatastic
2026-10-04 23:07:33 +07:00
c95098d15a
M3.47: opacity and opacity mask can define an object's knockout shape
bflatastic
2026-10-04 23:07:01 +07:00
b1d41d156a
Roadmap and README: M3.7–M3.29 (stage 1 of M3)
bflatastic
2026-10-04 23:06:52 +07:00
6e0af835c6
M3.46: three-state knockout groups (on, neutral, off) render, export and edit
bflatastic
2026-10-04 23:04:20 +07:00
bdf8f704af
M3.31: Swatches panel menu adds used colours, selects unused, merges, ungroups and sorts by kind
bflatastic
2026-10-04 23:03:56 +07:00
10ea4d5daf
M3.42: Appearance editing depth — drag effect rows to reorder them or move them into/out of fills and strokes (Alt copies), click an effect name to edit it in its prefilled dialog, choosing an applied effect asks to edit it or add another, Show All Hidden Attributes, multi-select and Alt-drag duplicate of fills/strokes, drag the thumbnail onto art to copy the appearance, stroke rows note brush/Dashed/profile, Shift-click a chip for the mixer, Properties fx opens the effect menu
bflatastic
2026-10-04 23:01:34 +07:00
eb83efdb19
M3.44: graphic styles keep opacity and blend, capture groups and type, add on Alt-click
bflatastic
2026-10-04 23:01:10 +07:00
ead8f72208
Merge pull request #11 from storybored379/pr/svg-import-physical-units
Brandon Thomas
2026-10-04 10:16:45 -04:00
3326b1aaac
Merge pull request #10 from storybored379/pr/svg-export-area-type-lines
Brandon Thomas
2026-10-04 10:16:42 -04:00
6b93a3dded
Merge pull request #9 from storybored379/pr/raster-export-size-limit
Brandon Thomas
2026-10-04 10:16:39 -04:00
4be1e009ec
Merge pull request #8 from storybored379/pr/svg-import-tspan-line-gap
Brandon Thomas
2026-10-04 10:16:35 -04:00
a4696edbe8
Merge pull request #7 from storybored379/pr/invalid-dash-pattern
Brandon Thomas
2026-10-04 10:16:32 -04:00
cbf5dc99bb
Merge pull request #6 from storybored379/pr/svg-import-text-on-path
Brandon Thomas
2026-10-04 10:16:28 -04:00
8164d7c3fb
Merge pull request #5 from storybored379/pr/mcp-headless-open-pdf-ai
Brandon Thomas
2026-10-04 10:16:24 -04:00
439f99e491
xtask: rustfmt version.rs (fmt gate was red on main)
Brandon Thomas
2026-10-04 10:05:41 -04:00
a1430cfc1e
Merge pull request #12 from storytold/pr/license-standard
Brandon Thomas
2026-10-04 10:08:55 -04:00
ef5beece81
Licensing: MIT OR Apache-2.0 files, NOTICE, ArtCraft brand terms
Brandon Thomas
2026-10-04 10:05:13 -04:00
ad82e6e9a9
M3.27: Color Picker reads colours with the engine's color_value (one parser; CMYK and grey in percent as the paint commands take them) instead of its own copy
bflatastic
2026-10-04 18:24:22 +07:00
c071dcd4d0
M3.28: proxies look through groups like the paint commands (a group shows its contents' paint, and contents that differ make a "?" proxy), the toolbar and panels share the engine's Session::proxy_paints, Magic Wand and Select Text by Font bump the revision so the cached "?" state follows them; double-click proxy test
bflatastic
2026-10-04 18:22:05 +07:00
ff9af2628a
M3.29: Live Paint Bucket and Appearance item colours feed the recent colours; the last-colour/gradient commands read "Apply Last Color" / "Apply Last Gradient" (no clash with Window > Gradient); , and . keyboard test
bflatastic
2026-10-04 18:20:19 +07:00
6d2dc7cbbc
M3.28: Color panel behaviour — the mode follows the colour's own model (the last mode picked returns for colours in its model), Alt-clicking the spectrum, None/Black/White, swatches, recent colours or Color Guide chips paints the inactive proxy, Hide Options leaves the proxy and spectrum, RGB/HSB show the out-of-gamut warning (click to correct), Shift-clicking the spectrum cycles modes, Shift-dragging a slider moves the others in tandem, and a mixed selection draws "?" proxies (paint.proxies reports fillMixed/strokeMixed)
bflatastic
2026-10-04 18:01:39 +07:00
f21161ce8c
M3.27: Color Picker dialog — double-clicking a Fill/Stroke proxy (toolbar, Color, Swatches, Properties) or ui.colorPicker {stroke?, color?} opens a colour field with an H/S/B/R/G/B channel slider, HSB/RGB/Lab/CMYK fields and hex, Only Web Colors, out-of-gamut (corrected through color.convert) and out-of-web warnings, New/Original chips and a Color Swatches list; OK runs paint.setFill / paint.setStroke (CMYK in CMYK documents)
bflatastic
2026-10-04 17:49:26 +07:00
8a871d98a9
M3.29: proxy paint commands — paint.invert / paint.complement recolour the active proxy of each selected object keeping its colour model (the defaults when nothing is selected), paint.lastColor (,) and paint.lastGradient (.) re-apply the last solid colour or gradient (the toolbar chips draw and run them), swap and default work on type, and recent colours live in the Session, fed by every paint command (MCP, eyedropper, live previews on commit) and listed by paint.recent
bflatastic
2026-10-04 12:23:52 +07:00
2ed962e7d0
M3.16: the eyedropper samples type gradients in text space
bflatastic
2026-10-04 17:59:03 +07:00
cca1d11032
M3.14: gradient swatches and new art fit a placed gradient to themselves
bflatastic
2026-10-04 17:58:05 +07:00
6ebffb9156
M3.24: Clear Appearance and Reduce to Basic add no fill or stroke rows to a group
bflatastic
2026-10-04 17:52:46 +07:00
d3dc4a2af3
M3.17: the stop popover survives its opening double-click, and the selected stop belongs to its gradient
bflatastic
2026-10-04 17:52:28 +07:00
1b3e7110a3
M3.21: active-row edits of the other kind stay on the painted leaves, item transparency is one undo step
bflatastic
2026-10-04 17:50:46 +07:00
8910f8fd1e
M3.12: the dialog Cancel button reuses dialogs::cancel; the Swatches panel no longer clones its selection every frame
bflatastic
2026-10-04 17:45:50 +07:00
d1d133bf09
M3.13: swatch.newGroup falls back to "Color Group" for a blank name, never gives a swatch its own group's name, and takes mesh point colours from the artwork
bflatastic
2026-10-04 17:45:49 +07:00
e9e4b94ed0
M3.10: default swatch names never read "-0" (components are clamped first); one numbering helper for free and new swatch names
bflatastic
2026-10-04 17:45:47 +07:00
984eb7f10c
M3.26: effects crate docs list the shared clip_outline helper
bflatastic
2026-10-04 17:45:04 +07:00
745d50f76e
M3.25: appearance.setItem takes ids without a selection; undo/redo through mask editing tested
bflatastic
2026-10-04 17:45:04 +07:00
014ee0382f
M3.20: visual bounds cover arrowheads so overhanging heads are not culled; one arrowhead-weight helper
bflatastic
2026-10-04 17:40:41 +07:00
4283820a30
M3.19: dash patterns too fine to advance draw solid instead of hanging on zero-length paths
bflatastic
2026-10-04 17:40:39 +07:00
3786cfaf36
M3.17: interactive gradient annotator — drag the start handle or the bar to move the gradient, the end handle to change length and angle, just past the end to rotate (Shift snaps to 45°); a bar click adds a stop, stops drag along the bar, off it to delete (never below two), Alt-drag copies, diamonds move midpoints; a click inside selected art applies the gradient from that point; double-clicking a stop opens a popover (Color/Swatches, Opacity, Location); the selected stop lives in the session (gradient.selectStop), shared by the tool, the Gradient and Color panels and agents, and takes Delete/Backspace and ←/→ ahead of their shortcuts (Tool::claims_key, also headless); stop chips draw as Overlay::Swatch with generated add/remove-stop cursors; the stop math moves into the color crate
bflatastic
2026-10-04 17:39:36 +07:00
7da0bfb1c6
M3.13: New Swatch and New Color Group dialogs — New Swatch reuses the Swatch Options fields prefilled from the active colour (its default name follows the colour), goes into the selected colour group, Alt-click skips it and Cmd/Ctrl makes a spot colour; New Color Group makes a group from the selected swatches or the selected artwork's colours, optionally as global swatches the art links to and with swatches for tints
bflatastic
2026-10-04 17:26:24 +07:00
4f685be57a
M3.26: clipping sets with any clip shape
bflatastic
2026-10-04 17:23:57 +07:00
b6b87ee9b6
M3.23: per-item Opacity popups and one grouped blend-mode widget
bflatastic
2026-10-04 17:21:28 +07:00
5ae7bfb8ca
M3.20: arrowheads: hollow outlines, tip/extend alignment, one opacity for line and head
bflatastic
2026-10-04 17:20:40 +07:00
09d7aaa7f4
M3.18: shared stroke-geometry module for arrowheads, width profiles and the profile preset catalogue
bflatastic
2026-10-04 17:16:17 +07:00
aa1b592935
M3.16: the Gradient tool follows the active proxy and type objects — the tool and annotator edit the fill or the stroke by the focused proxy (ToolContext.fill_active); paint.setGradientGeom takes stroke? (default: the active proxy) and index? (one appearance item), sets type objects' vectors on their runs in text space and keeps the aspect the document shows; paint.setFill/setStroke vectors on type move into text space; aspect edits place run gradients on the layout bounds; run strokes (and type appearance strokes) fit the stroke-inflated box on screen and in PDF
bflatastic
2026-10-04 17:16:12 +07:00
3082be6ecf
M3.12: delete swatches and colour groups — Shift/Cmd-click selects several swatches and groups in the panel, Delete asks first (Alt-click skips), swatch.delete {names} removes them in one undo step and art using a deleted global swatch keeps its colour, unlinked
bflatastic
2026-10-04 17:15:46 +07:00
543d09985d
M3.22: effects apply to the active fill or stroke and item effect rows are editable
bflatastic
2026-10-04 17:15:40 +07:00
6b159467a2
SVG import: tspan line breaks follow the baseline gap (none on the same baseline, bounded far gaps)
storybored379
2026-10-04 00:06:57 -07:00
ce5fdfd373
SVG import: root sizes in mm/cm/in/pt open at their physical size
storybored379
2026-10-04 01:14:20 -07:00
cab5dffbcf
SVG export: area type keeps its wrapped lines and alignment
storybored379
2026-10-04 01:01:04 -07:00
152228d76d
Raster export: refuse sizes the renderer can't produce instead of crashing
storybored379
2026-10-04 00:44:03 -07:00
c20b7deec5
Stroke dashes: an invalid dash pattern draws a solid stroke instead of hanging the renderer
storybored379
2026-10-04 00:00:39 -07:00
4ac7095601
SVG import: <textPath> comes back as type on a path
storybored379
2026-10-03 23:46:04 -07:00
1fd9b79a9d
MCP: headless open_file reads .pdf and PDF-compatible .ai, as File ▸ Open does
storybored379
2026-10-03 23:45:57 -07:00
d272d32be3
M3.11: Swatch Options — double-click, the options button or the menu item opens a colour swatch's editor (name, process/spot, Global, Gray/RGB/HSB/CMYK/Web sliders, hex) with a live canvas preview; gradients open the Gradient panel and patterns pattern editing; swatch.edit recolours and renames every linked fill, stroke and text run in one undo step, spot forces Global, grouped swatches edit too; swatch.list query
bflatastic
2026-10-04 12:32:17 +07:00
81f86a9acc
M3.15: gradients follow every transform — rotate, reflect, shear, non-uniform scale and Free Distort/warps pin an unplaced gradient to its fit first (fills on the bounds, strokes on the stroke-inflated box; moves and uniform scales keep refitting); linear vectors keep their isolines and radial gradients map their ellipse (principal axes give the new end and aspect); the radial angle places the vector before the gradient is placed; the eyedropper samples radials honouring aspect; SVG import shares the mapping; warped text, images and symbols no longer map their gradients twice
bflatastic
2026-10-04 12:31:54 +07:00
018bed29db
M3.21: the Appearance panel's active item drives paint, stroke, gradient and transparency edits
bflatastic
2026-10-04 12:28:05 +07:00
61ddc1ce34
M3.14: lossless, validated gradient params — paint.setFill/setStroke, swatch.new and appearance.setItem keep kind (freeform too), midpoints, stop opacity, aspect, vector and swatch link; a shared parse_stops rejects fewer than two or malformed stops, clamps offsets and normalises 0..100 opacity; an aspect without a vector places the gradient on each object's (stroke-inflated) bounds; panels write gradients through one params writer
bflatastic
2026-10-04 12:22:49 +07:00
2f21fc3a66
M3.10: swatch names follow the colour model (C=10 M=20 Y=30 K=0, R=.. G=.. B=.., Gray K=..) and are unique document-wide; New Swatch saves the active gradient or pattern, Ctrl/Cmd-click makes a spot colour; colour groups take solid colours only
bflatastic
2026-10-04 12:20:52 +07:00
00a0874d4d
M3.9: swatches in colour groups are first-class — Document Color Mode converts them, they can be spot colours with their own plate and PDF Separation, and Document Info counts them
bflatastic
2026-10-04 12:15:10 +07:00
fb8c41d8e3
Merge wp/M1: one engine loader/encoder for every frontend and export correctness (M4.12, M4.13)
bflatastic
2026-10-04 11:58:00 +07:00
115255a7e4
Merge wp/WP-00: neutral labels, packaging metadata and vendor-name CI gate (M3.7, M4.10, M4.11)
bflatastic
2026-10-04 11:57:34 +07:00
29d43d2a84
Merge wp/WP-01: split paint/panel command modules and dialogs into per-area files (M3.8)
bflatastic
2026-10-04 11:57:28 +07:00
879295dd1a
M4.10: shortcut-set alias test reads the legacy name from the alias table
bflatastic
2026-10-04 11:56:39 +07:00
7b410ecf2c
M3.7: proof setup looks profiles up through the alias table; alias tests read the legacy name from it
bflatastic
2026-10-04 11:56:39 +07:00
7bc50901e4
M4.13: review fixes — template sublayers are left out of raster exports too (the check moves into draw_arc), Export Selection skips art under a template layer at any depth, Export for Screens drops @Nx suffixes on SVG/PDF rows, names files without case clashes and calls an unnamed artboard Artboard-N, oversized raster exports are refused instead of writing empty files, a named MCP artboard/range replaces the option picks, and control app.export without a path returns dataBase64 instead of opening a save dialog
bflatastic
2026-10-04 11:49:45 +07:00
5d9b97c3bd
M4.10: neutral file, preference and MCP wording; vendor-name CI gate
bflatastic
2026-10-04 11:47:28 +07:00
45a7302601
M4.13: export correctness and MCP export parity — document.export/serialize honour artboard, artboards or range ("1-3, 5") for PDF (one page per artboard) and return dataBase64 without a path; Export for Screens writes one page per PDF, ignores scale and @Nx suffixes for vector formats, names duplicate artboards -2/-3 and returns bytes without a folder; raster exports, thumbnails and Export Selection leave template layers out (RenderOptions.skip_templates); file.exportForScreens with params runs the engine; the MCP export tool takes artboard/range/options, lists formats from the engine and never retargets the document; CLI convert --range
bflatastic
2026-10-04 11:38:23 +07:00