Commit Graph

  • deaeef047c Merge pull request #16 from storytold/docs/name-reference-app BFlat 2026-10-04 23:41:42 +07:00
  • 454c5f8620 M3.39: width profiles follow the path through dashes, and their corners take the join bflatastic 2026-10-04 23:40:52 +07:00
  • 42ad4540b7 M3.38: dashes fitted to corners and path ends, a flag of their own that keeps the offset bflatastic 2026-10-04 23:37:58 +07:00
  • 0f169b5c5d Merge wp/B2 bflatastic 2026-10-04 23:37:27 +07:00
  • 818980a789 Merge wp/A2 bflatastic 2026-10-04 23:20:10 +07:00
  • 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
  • abd77d58b0 Merge wp/F2: knockout groups, knockout shape, page groups (M3.46-M3.48) bflatastic 2026-10-04 23:15:10 +07:00
  • 4e60eabc00 M3.30: swatches dropped back on themselves stay put bflatastic 2026-10-04 23:12:24 +07:00
  • 8008e16f57 Merge pull request #15 from storytold/m3-paint-stage1 BFlat 2026-10-04 23:10:47 +07:00
  • f48ba26380 M3.32: the document colour mode governs new colours bflatastic 2026-10-04 23:10:15 +07:00
  • 039c0cbef7 M3.48: Page Isolated Blending and Page Knockout Group bflatastic 2026-10-04 23:10:06 +07:00
  • b85ef3de5a Merge wp/C2: stroke export parity and Outline Stroke fidelity (M3.36, M3.37) bflatastic 2026-10-04 23:08:27 +07:00
  • 22581f5b51 Merge wp/E1: graphic style fidelity, links and management (M3.44, M3.45) bflatastic 2026-10-04 23:07:55 +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
  • 321ab52aea M3.45: graphic style links: redefine, break link, options, unused, sort, Select > Same bflatastic 2026-10-04 23:03:45 +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
  • 059f623410 M3.33: Gradient panel: proxy, swatch menu, diamond location, stop popover, Alt-drag copies and swaps, swatch drops, stop eyedropper bflatastic 2026-10-04 23:00:38 +07:00
  • fe258915e3 M3.30: Swatches panel multi-selection, find field and drag and drop bflatastic 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 bflatastic 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 bflatastic 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 bflatastic 2026-10-04 22:02:26 +07:00
  • 62569f8a9d M3.19: a negative dash entry makes the pattern invalid, so the line draws solid bflatastic 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 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
  • 3692b9d233 M3.24: basic appearance, Layers target dots, Mixed Appearances and Clear resets opacity bflatastic 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 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
  • 23f19a861b M3.19: dotted lines: zero-length dashes draw discs or squares bflatastic 2026-10-04 17:18:13 +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
  • b117566fc2 M3.25: opacity-mask editing and transparency command reach bflatastic 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) 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
  • 8f9d6ef2bd Roadmap: M3/M4 wave 0 (one loader/encoder for every frontend, MCP export options, per-area paint modules, brands gate) bflatastic 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) 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
  • dd0bb0eefb M3.7: colour tests share the settings lock bflatastic 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 bflatastic 2026-10-04 11:38:23 +07:00