Commit Graph
359 Commits
Author SHA1 Message Date
HassanKhan 125ebe1c73 Merge remote-tracking branch 'upstream/main' into feat-4936-spell-check
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-09 12:03:20 +05:00
HassanKhan f3bad1682c Merge remote-tracking branch 'upstream/main' into feat-4936-spell-check
Language per character rows in docs/type-parity.md: spelling is no longer listed as not yet done, and the hyphenation note names the languages that still lack it.
2026-11-09 11:42:44 +05:00
ruchirguitarandCursor e342a1ce0c M2.1: merge main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 11:43:22 +05:30
HassanKhan 82181ff0b1 Merge remote-tracking branch 'upstream/main' into feat-4936-spell-check
# Conflicts:
#	crates/engine/src/cmd.rs
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/type-parity.md
2026-11-09 10:25:12 +05:00
ruchirguitar e0aade5229 Merge remote-tracking branch 'origin/main' into SidePanelCollapseArrow
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/ui-parity.md
2026-11-09 10:00:54 +05:30
ruchirguitarandCursor 3deac491ca M2.1: merge current main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 09:03:17 +05:30
BFlat b652599548 Merge pull request #6264 from dotCooCoo/feat/plugin-importers
Plug-ins: importer plug-ins open file types VectorCraft does not read
2026-11-09 09:24:07 +08:00
BFlat e8dbb22d4c Merge pull request #6174 from dotCooCoo/feat/3d-classic-extrude-bevel
3D (Classic): Extrude & Bevel (Classic) extrudes art with Wireframe, No Shading, Diffuse and Plastic surfaces
2026-11-09 08:53:49 +08:00
BFlat 2fe33b1fc6 Merge pull request #5355 from dotCooCoo/feat/help-bar-visibility
UI: show or hide the Help Bar independently
2026-11-09 08:02:10 +08:00
dotCooCoo a7fc513a0c Merge main into feat/3d-classic-extrude-bevel 2026-11-08 15:34:06 -08:00
dotCooCoo e2beb714b0 Merge main into feat/help-bar-visibility 2026-11-08 14:56:29 -08:00
Don Omondi 8383b2af6d Merge remote-tracking branch 'upstream/main' into fix/eps01-editing-overlay
# Conflicts:
#	docs/file-format-parity.md
#	docs/gaps.md
2026-11-08 17:39:34 -05:00
ruchirguitarandCursor 46cc28b299 M2.1: merge current main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 04:09:05 +05:30
ruchirguitar 7185ef4844 Merge remote-tracking branch 'origin/main' into SidePanelCollapseArrow
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/ui-parity.md
2026-11-09 03:31:09 +05:30
dotCooCoo d5bb58aad5 Merge main into feat/plugin-importers 2026-11-08 12:38:22 -08:00
ruchirguitar 2c80836bd5 M2.1: merge main and preserve path-deletion evidence (#3380) 2026-11-09 01:47:48 +05:30
dotCooCoo 11f1d228de Type: Align to Path moves each character by its own font's metrics
Align to Path moved the whole line by the largest ascent and descent
among its characters. Each character now moves by its own font, size
and vertical scale. Ascender runs the top of the font's em box along
the path: the ideographic em box that the font's BASE table gives, or
in a Chinese, Japanese or Korean font the one that its typographic or
hhea box, a one-em box-drawing cross or its ideographs give; else an
em box centered on the cap height. Descender runs the bottom of the font's
bounding box along the path, and Center runs a line at half the height
of the top of the font's H along it. In vertical type, Ascender and
Descender move the characters half an em, and Center leaves them on
the path.

Existing documents with Align to Path set to Ascender, Descender or
Center lay their type out at a new distance from the path.
2026-11-09 03:14:41 +07:00
dotCooCoo 79351d7063 Merge main into feat/plugin-importers 2026-11-08 10:25:28 -08:00
dotCooCoo a9cd473a75 Merge main into feat/help-bar-visibility 2026-11-08 09:57:25 -08:00
dotCooCoo 1ce9e9e9eb Merge main into feat/plugin-importers 2026-11-08 09:41:06 -08:00
dotCooCoo b568977af4 Asset Export: 3D objects export as USDA, USDZ, glTF or OBJ meshes
Squashed from #6168 onto main.
2026-11-09 00:29:05 +07:00
dotCooCoo 434c032f9e Symbols: Direct Selection sets the solid fill and stroke of one object in a dynamic instance
Squashed from #5962 onto main.
2026-11-09 00:26:11 +07:00
dotCooCoo 671e833913 Merge main into feat/help-bar-visibility 2026-11-08 09:10:51 -08:00
bflatastic 5de9fc2954 Docs: drop the header lines and rows the older PRs repeated 2026-11-08 23:51:57 +07:00
bflatastic df4cd5f9da Docs: keep the status entries of the PRs before this one 2026-11-08 23:51:47 +07:00
dotCooCoo a8f21ac0f6 UI: keep docked Tools beside the canvas with left panels 2026-11-08 23:51:39 +07:00
dotCooCoo 3405620151 Docs: update marquee feature status and revision history 2026-11-08 23:51:23 +07:00
dotCooCoo 6d87514055 Selection: show marquee rules and offer enclosed and directional modes 2026-11-08 23:51:12 +07:00
HassanKhan 1e52ef587d Part of #4936: refuse malformed ids in text.spelling.check; dictionary-independent test; docs
- text.spelling.check checks a given `ids` as edit.findReplace does
  (checked_ids_param): a non-array, a negative, non-numeric or unknown id is
  an error instead of a check of the whole document. Null still means every
  visible, unlocked type object.
- The byte-offset test puts an em dash, not "café", before the unknown word,
  so it passes whichever dictionaries craft-proof is built with (CI builds
  with craft-i18n's, where "café" is unknown).
- Docs: the spell check engine in target-app-parity.md (Type advanced rows
  and evidence), gaps.md (G4), roadmap.md (M7) and the Language per
  character rows of type-parity.md, with status lines and revision history.
2026-11-08 21:01:59 +05:00
ruchirguitar 04e71eceb8 #5925: merge CI base and target the Layers Filter button by name 2026-11-08 21:26:30 +05:30
ruchirguitar 3984874728 M2.1: avoid discarded path copies during deletion (#3380) 2026-11-08 19:35:48 +05:30
Don Omondi d87844bba6 Merge remote-tracking branch 'upstream/main' into fix/eps01-editing-overlay
# Conflicts:
#	docs/gaps.md
2026-11-08 06:36:42 -05:00
ruchirguitar 655a16fa67 #5925: add collapse arrows to floating panels and rail flyouts 2026-11-08 17:02:29 +05:30
dotCooCoo 4a64208b82 Merge main into feat/3d-classic-extrude-bevel 2026-11-08 00:02:52 -08:00
dotCooCoo a3c37ea1f4 Merge main into feat/plugin-importers 2026-11-07 23:49:11 -08:00
dotCooCoo fd94ebe86c Plug-ins: importer plug-ins open file types VectorCraft does not read
An importer plug-in (kind "importer", permission import.read) lists 1 to 8
file extensions and turns a file's bytes into objects, which open as a new
document whose artboard is their bounds. File › Open lists its extensions,
File › Open With (file.openWith) opens a file with a chosen importer, and
document.open takes importer and params. A built-in format that reads the
file by its content or extension always opens it; among importers listing
the same extension, the one whose id sorts first opens it. An importer reads
at most 128 MiB, and Place still reads only the built-in formats.

Docs: docs/plugins.md, docs/mcp.md, docs/gaps.md, docs/target-app-parity.md.
2026-11-07 23:05:09 -08:00
dotCooCoo 79dcf3b1ff .ai save: the editing copy keeps live effects
Squashed from #6150 onto main.
2026-11-08 12:59:34 +07:00
dotCooCoo bc5eb7aa47 Docs: state the limits of .ai type on a path import
Align to Path takes its distance from the path from VectorCraft's font metrics, and the fit under Gravity does not reproduce the file's layout.
2026-11-08 11:22:31 +07:00
dotCooCoo 20accc5943 Docs: 3D remaining-work lists name what 3D (Classic) still lacks
Extrude & Bevel (Classic) ships, so the remaining-work lists in
effects-parity.md, gaps.md (G3), target-app-parity.md and three-d.md
name Revolve (Classic), Rotate (Classic) and Map Art instead of all of
3D Classic.
2026-11-07 16:00:09 -08:00
ruchirguitar 2dc6991cf3 M2.1: retain gradient placement when deletion splits paths (#3380) 2026-11-08 03:51:00 +05:30
ruchirguitar c232919dd3 M2.1: clarify deletion evidence and function documentation (#3380) 2026-11-08 02:02:31 +05:30
ruchirguitar e6a899857f M2.1: split disconnected path pieces after deletion (#3380) 2026-11-07 15:20:14 +05:30
Don Omondi fc7e1bf0bd Docs: keep this branch's entries that the merge with main dropped 2026-11-07 00:11:56 -05:00
dotCooCoo c7c8e5428d Artboards: the Artboard tool's canvas menu cuts, copies, pastes, renames, rearranges and exports artboards
With the Artboard tool, the canvas context menu lists the entries of the
public Use the artboard context menu page in its order, in place of the
entries for objects and the view. Lock Artboards and Unlock Artboards are
two submenus. An entry that cannot run is left out, and Undo and Redo stay
dimmed. A right-click on an artboard that is not selected selects it alone
first, and the menu measures the art for Delete Empty Artboards and Fit to
Artwork Bounds once, at the right-click.

Cut, Copy, Duplicate Artboards, Rename, Delete Artboards, Lock Selected,
Unlock Selected, Fit to Artwork Bounds, Switch Orientation and Export act on
the artboards the tool has selected, else the active one. docs/mcp.md lists
what the other entries act on.

- artboard.rename renames in one undo step and numbers several names. The
  menu's Rename opens a dialog that runs it, and the Artboards panel's name
  field runs it too.
- artboard.switchOrientation swaps width and height and keeps the top-left
  corner, skipping square and locked artboards.
- artboard.selectAll chooses the tool and selects every artboard.
- edit.paste takes artboardsAt, and the menu's Paste centers copied
  artboards on the right-click's point.
- The menu's Cut and Copy run artboard.cut and artboard.copy. In the desktop
  app those commands publish to the system clipboard, and the menu shows the
  Cut and Copy shortcuts for them.
- artboard.fitToArt and the panel's name field record no undo step when
  nothing changes.

artboard.duplicate, copy, cut, rename and switchOrientation take their
artboards from the tool's selection when a call names none. Each now records
them in the journal as selectedArtboards, which a replay reads and a recorded
action leaves out. The copy commands also record art. switchOrientation
records scaleArt, and it takes patterns and lockedAndHidden and records what
its artboard.setProps step resolved for them.

While the Artboard tool is in use, a command chosen from any menu or the
command palette moves the tool's selection as the Artboards panel does:
artboard.new makes the new artboard active, artboard.duplicate selects the
copies, and artboard.delete and artboard.deleteEmpty make a remaining
artboard active.
2026-11-07 08:37:44 +07:00
ruchirguitar 5bb21cdddf Add hyphenation for eleven Indian languages
Squashed from #5946 onto main.
2026-11-07 05:15:17 +07:00
dotCooCoo 0c5ad8e242 .ai save: objects next to type keep their own transparency
The reader gives an Xy right after a compound path or a text object to
that object. The writer now writes XR before the Xy of type, images and
guides, so type next to type, a compound path before type, image or
guide, and type before an image or guide keep their own opacity, blend
mode and knockout shape flag.

- Type keeps its Isolate Blending and Knockout Group state in a state
  block after its text object, as its outlines did on their group.
- The reader no longer gives a layer the Xy before its last text object.
- The ASCII85 end marker of the text document stays on one line.
- The warning and docs/file-format-parity.md also list area type in an
  open frame, type on an open path whose ends meet, type of only white
  space and threads of type on a path as written as outlines.
- README.md, ROADMAP.md, docs/gaps.md, docs/roadmap.md and
  docs/target-app-parity.md describe the editing copy a saved .ai holds.
- clip_path's doc comment is back on clip_path.
- import_fuzz reaches threaded area type and vertical type.
2026-11-07 05:15:16 +07:00
dotCooCoo 0c570dee87 .ai import: paths with an Art brush open with the brush on their stroke
A path with an Art brush comes in as the path, with the brush on its
stroke at its weight, instead of as its drawn look, when the brush
stretches art of solid-filled paths along the path, unflipped, at 100% in
Tints. The art runs on the side of the path the file draws it.

The drawn look stays for other colorizations and widths; Proportional,
between-guides and flipped brushes; type; a path with settings of its own,
a variable width, effects, a swatch stroke or an entry that isn't read;
and art with strokes, gradients, patterns, masks or effects, or no length.

A brushed stroke, Calligraphic ones too, takes the brush the Brushes panel
keeps under its name, and an image with a brush keeps its drawn look.

In every document, Tints and Tints and Shades take art in black ink alone
by its ink amount, and a process or gray stroke color's tints and shades
stay in that color's model.

Place and Expand bring the brushes the art uses, renaming on conflict.

Part of #637.
2026-11-07 05:15:09 +07:00
Don Omondi 4333c58033 Opening a slow file shows a progress window with Cancel and Continue in Background (#5930)
A file that takes longer than 0.4 s to open shows a modal progress window
with its name, a moving bar (reading reports no steps), how many more
files wait, Cancel (file.cancelOpen: the file doesn't open) and Continue
in Background (file.openInBackground). It never opens over another dialog
or progress window.
2026-11-07 00:17:17 +07:00
dotCooCoo e6819a86f0 Rendering: open width-profile strokes outline only near the view 2026-11-06 12:42:33 +07:00
ruchirguitar 70f798b71d i18n: add Hindi interface and message catalog 2026-11-06 12:40:10 +07:00