Commit Graph

  • 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 23:01:10 +07:00
  • 059f623410 M3.33: Gradient panel: proxy, swatch menu, diamond location, stop popover, Alt-drag copies and swaps, swatch drops, stop eyedropper bflatasticandClaude Opus 5.5 2026-10-04 23:00:38 +07:00
  • fe258915e3 M3.30: Swatches panel multi-selection, find field and drag and drop bflatasticandClaude Opus 5.5 2026-10-04 22:54:56 +07:00
  • 18d870c7df M3.37: Outline Stroke and the live Outline Stroke effect outline strokes as the canvas paints them bflatasticandClaude Opus 5.5 2026-10-04 22:53:58 +07:00
  • 6bd27a05da Merge wp/I1 bflatastic 2026-10-04 22:14:37 +07:00
  • 96f1b6852a Merge wp/F1 bflatastic 2026-10-04 22:07:49 +07:00
  • 546559d8a1 M3.17: dialog modules in rustfmt order bflatasticandClaude Opus 5.5 2026-10-04 22:02:27 +07:00
  • 0b547ec597 M4.13: raster exports check the format's size limit first and share the renderer's pixel budget bflatasticandClaude Opus 5.5 2026-10-04 22:02:26 +07:00
  • 62569f8a9d M3.19: a negative dash entry makes the pattern invalid, so the line draws solid bflatasticandClaude Opus 5.5 2026-10-04 22:02:26 +07:00
  • 721bb483c3 Merge wp/D1 bflatastic 2026-10-04 22:01:05 +07:00
  • 41f2af932c Merge wp/C1 bflatastic 2026-10-04 21:47:58 +07:00
  • efc0ac31d9 Merge wp/B1 bflatastic 2026-10-04 21:47:07 +07:00
  • 1ae0c22c26 Merge wp/A1 bflatastic 2026-10-04 21:46:02 +07:00
  • 0af6734b70 Merge M3/M4 wave 0: neutral labels and brands gate, per-area paint modules, one engine loader/encoder (M3.7, M3.8, M4.10-M4.13) bflatastic 2026-10-04 21:46:01 +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 ThomasandClaude Opus 5.5 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 ThomasandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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) bflatasticandClaude Opus 5.5 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) bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 12:23:52 +07:00
  • 2ed962e7d0 M3.16: the eyedropper samples type gradients in text space bflatasticandClaude Opus 5.5 2026-10-04 17:59:03 +07:00
  • cca1d11032 M3.14: gradient swatches and new art fit a placed gradient to themselves bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 17:45:47 +07:00
  • 984eb7f10c M3.26: effects crate docs list the shared clip_outline helper bflatasticandClaude Opus 5.5 2026-10-04 17:45:04 +07:00
  • 745d50f76e M3.25: appearance.setItem takes ids without a selection; undo/redo through mask editing tested bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 17:39:36 +07:00
  • 3692b9d233 M3.24: basic appearance, Layers target dots, Mixed Appearances and Clear resets opacity bflatasticandClaude Opus 5.5 2026-10-04 17:30:03 +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 bflatasticandClaude Opus 5.5 2026-10-04 17:26:24 +07:00
  • 4f685be57a M3.26: clipping sets with any clip shape bflatasticandClaude Opus 5.5 2026-10-04 17:23:57 +07:00
  • b6b87ee9b6 M3.23: per-item Opacity popups and one grouped blend-mode widget bflatasticandClaude Opus 5.5 2026-10-04 17:21:28 +07:00
  • 5ae7bfb8ca M3.20: arrowheads: hollow outlines, tip/extend alignment, one opacity for line and head bflatasticandClaude Opus 5.5 2026-10-04 17:20:40 +07:00
  • 23f19a861b M3.19: dotted lines: zero-length dashes draw discs or squares bflatasticandClaude Opus 5.5 2026-10-04 17:18:13 +07:00
  • 09d7aaa7f4 M3.18: shared stroke-geometry module for arrowheads, width profiles and the profile preset catalogue bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 17:15:40 +07:00
  • b117566fc2 M3.25: opacity-mask editing and transparency command reach bflatasticandClaude Opus 5.5 2026-10-04 17:10:21 +07:00
  • 6b159467a2 SVG import: tspan line breaks follow the baseline gap (none on the same baseline, bounded far gaps) storybored379andClaude Opus 5.5 2026-10-04 00:06:57 -07:00
  • ce5fdfd373 SVG import: root sizes in mm/cm/in/pt open at their physical size storybored379andClaude Opus 5.5 2026-10-04 01:14:20 -07:00
  • cab5dffbcf SVG export: area type keeps its wrapped lines and alignment storybored379andClaude Opus 5.5 2026-10-04 01:01:04 -07:00
  • 152228d76d Raster export: refuse sizes the renderer can't produce instead of crashing storybored379andClaude Opus 5.5 2026-10-04 00:44:03 -07:00
  • c20b7deec5 Stroke dashes: an invalid dash pattern draws a solid stroke instead of hanging the renderer storybored379andClaude Opus 5.5 2026-10-04 00:00:39 -07:00
  • 4ac7095601 SVG import: <textPath> comes back as type on a path storybored379andClaude Opus 5.5 2026-10-03 23:46:04 -07:00
  • 1fd9b79a9d MCP: headless open_file reads .pdf and PDF-compatible .ai, as File ▸ Open does storybored379andClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 12:31:54 +07:00
  • 018bed29db M3.21: the Appearance panel's active item drives paint, stroke, gradient and transparency edits bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 12:15:10 +07:00
  • 8f9d6ef2bd Roadmap: M3/M4 wave 0 (one loader/encoder for every frontend, MCP export options, per-area paint modules, brands gate) m3-m4-paint-and-files bflatasticandClaude Opus 5.5 2026-10-04 12:02:52 +07:00
  • fb8c41d8e3 Merge wp/M1: one engine loader/encoder for every frontend and export correctness (M4.12, M4.13) bflatasticandClaude Opus 5.5 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) bflatasticandClaude Opus 5.5 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) bflatasticandClaude Opus 5.5 2026-10-04 11:57:28 +07:00
  • 879295dd1a M4.10: shortcut-set alias test reads the legacy name from the alias table bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 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 bflatasticandClaude Opus 5.5 2026-10-04 11:49:45 +07:00
  • 5d9b97c3bd M4.10: neutral file, preference and MCP wording; vendor-name CI gate bflatasticandClaude Opus 5.5 2026-10-04 11:47:28 +07:00
  • dd0bb0eefb M3.7: colour tests share the settings lock bflatasticandClaude Opus 5.5 2026-10-04 11:45:32 +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 bflatasticandClaude Opus 5.5 2026-10-04 11:38:23 +07:00
  • 4d503c0327 M4.12: one loader and encoder for every frontend — engine fileio (load/encode/export/save, append-only FORMATS table, OPEN_EXTS, document.formats query, typed per-format options, parse_range); document.open reads native/legacy, SVG/SVGZ, PDF/.ai, .ait (opens untitled like native templates) and PNG/JPEG/GIF/WebP/TIFF/BMP; desktop, web, control channel, headless MCP and the CLI open and encode through it; open dialogs list "All readable files" plus one filter per format bflatasticandClaude Opus 5.5 2026-10-04 11:36:51 +07:00
  • 9cabeea68b M3.8: register the split paint modules next to paint so the command palette keeps listing them (Stroke Options for "stroke") bflatasticandClaude Opus 5.5 2026-10-04 11:32:11 +07:00
  • b7969a6a5d M3.8: split the paint/panel command modules and the dialogs into per-area files bflatasticandClaude Opus 5.5 2026-10-04 11:22:23 +07:00
  • 0af38a31fd M4.11: packaging metadata describes a vector illustration app bflatasticandClaude Opus 5.5 2026-10-04 11:19:13 +07:00
  • 016fcbf34e M3.7: neutral paint, effect and stroke labels bflatasticandClaude Opus 5.5 2026-10-04 11:17:50 +07:00
  • d99853ed2a M4.10: neutral New Document preset name bflatasticandClaude Opus 5.5 2026-10-04 11:01:59 +07:00
  • 5fab94753c CI: cargo fmt xtask/src/version.rs (the fmt gate failed on main) bflatasticandClaude Opus 5.5 2026-10-04 10:23:02 +07:00
  • 604c20ed90 Merge pull request #3 from storytold/revert-readme-habits BFlat 2026-10-04 01:16:35 +07:00
  • e08ced735e Docs: drop the README's list of specific Illustrator habits (too detailed for the overview); the control-protocol note on the save prompt stays bflatastic 2026-10-04 01:16:12 +07:00
  • b538b0a84a Merge pull request #2 from storytold/docs-workflow-updates BFlat 2026-10-04 00:57:41 +07:00
  • 62681d2b80 Docs: README names the Illustrator habits that now work (corner widget dragging, Alt-click pivot on an anchor, middle-mouse pan, save prompt before closing); control protocol: file.close / closeAll / app.quit open a saveChanges dialog per modified document and how agents answer it bflatastic 2026-10-04 00:55:55 +07:00
  • 4ddc422e51 Release 0.1.1 v0.1.1 Brandon ThomasandClaude Opus 5.5 2026-10-03 09:55:30 -04:00
  • f188863b10 README: tagline names the Adobe app it reimplements; standard Adobe trademark and non-affiliation notice v0.1.0 Brandon ThomasandClaude Opus 5.5 2026-10-02 12:24:12 -04:00
  • e608d5a26b README: Crafting Apps table in five columns (icon, app, purpose, GitHub, Website) Brandon ThomasandClaude Opus 5.5 2026-10-02 12:19:01 -04:00
  • 065d095597 README: drop the old DrawCraft name; VectorCraft links to /apps/vectorcraft Brandon ThomasandClaude Opus 5.5 2026-10-02 12:18:12 -04:00
  • 4af5e80a41 README: app icons in the Crafting Apps table Brandon ThomasandClaude Opus 5.5 2026-10-02 12:17:13 -04:00
  • 2d0b055c7e Make ported packaging scripts executable (fixes exit 126) Brandon ThomasandClaude Opus 4.8 2026-10-02 12:03:30 -04:00
  • 1531cb0d11 Merge pull request #1 from storytold/live-corners-pan-close-prompt BFlat 2026-10-02 23:00:22 +07:00
  • b8701977d4 M4.9: Save / Don't Save / Cancel before closing modified documents — File → Close, Close All, a tab's ×, Quit and the window's close button ask once per modified document (shown first); Cancel stops the whole close/quit, a cancelled Save As keeps the document open; closing keeps per-document views aligned; agents answer the saveChanges dialog with ui.dialog.confirm (discard: true for Don't Save) bflatastic 2026-10-02 22:24:30 +07:00
  • 3f1f3383d3 M11.6: middle-button drag pans the view with any tool (no tool events, grabbing cursor while panning; a left press during the pan is ignored); headless canvas test bflatastic 2026-10-02 22:23:55 +07:00
  • cf775072be M1.10: Rotate/Reflect/Scale/Shear reference point snaps — a click or Alt-click within 5 px of an anchor or object centre (of the selection or the object under the pointer) pivots exactly there, so Alt-clicking a corner flips/rotates from that corner; hovering shows the anchor/center label first; follows View → Snap to Point or Smart Guides (snap_to_point now reaches the tools) bflatastic 2026-10-02 22:23:24 +07:00
  • 8276d0a303 M2.10: Live Corners — drag a live rectangle's corner widget (Selection or Direct Selection) to round or sharpen all four corners as one undo step (object.setLiveShape preview, radius readout, follows rotated/scaled shapes, square to fully round); widgets drawn from the same geometry the tools hit-test, hidden on tiny shapes and with View → Hide Corner Widget; corner-radius cursor bflatastic 2026-10-02 22:22:29 +07:00