Files
vectorcraft/docs/type-parity.md
T
Jürg Lehni c8fe9193d9 Type: colour glyphs go with type that effects reshape and Expand Appearance
COLR and SVG glyphs, which have no outlines, were left out wherever type was taken as its outlines: geometry effects, Expand Appearance, EMF/WMF export.
2026-10-24 02:06:11 +07:00

37 KiB
Raw Blame History

Type parity

Last reviewed: 2026-10-10 · Last updated: 2026-10-23 · Change: minor (colour glyphs (COLR, SVG) go with type that effects reshape, into Expand Appearance and EMF/WMF export; previously:; OpenType SVG glyphs follow the SVG table's coordinate rules: a root size without a viewBox sets up the em, a viewBox that isn't square is centred in it, and a glyph element nested in others is drawn on its own; previously: OpenType SVG colour fonts draw and export as vector art; hanging punctuation: Glyph Scaling leaves the hung marks at their width, Standard burasagari counts a hung line start as room, G4; a paragraph's Auto Leading also drives the Character panel's Leading, the Alt+↑/↓ leading nudge and Fill with Placeholder Text; scores unchanged; COLR colour fonts (v0 and v1) draw and export as vector art; previously: colour emoji fonts with bitmap glyphs (sbix: Apple Color Emoji; CBDT: Noto Color Emoji) draw on the canvas and export: PDF Type 3 glyphs or images, SVG images with outlined text, EPS and legacy .ai images, Create Outlines images; scores unchanged; previously: #3515: recent-font groups in font pickers; manual Tate-chu-yoko marks characters across one em of a vertical column; System Layout: Character panel menu sets whole-point advances for every text object in the document (off by default); ruby (ふりがな) for live text: type.ruby sets or removes a reading over a byte range, above or below (right of the column in vertical type), start/centre/end aligned, sized and overhanging or squeezed; saved natively, laid out with its line growing, drawn on the canvas and in SVG/PDF (outlines where ruby is present); scores unchanged; previously:; Fractional Widths: Character panel menu turns whole-point advances on or off per type object, on by default; scores unchanged; type on a path threads, mixed with area type in one thread; scores unchanged; No Break keeps marked characters on one line; scores unchanged; a click on the out port threads the text into a closed path, a new frame at the click or a dragged rectangle, #2572 in part; scores unchanged; native family labels fall back to localized legacy names when typographic names are English-only, #2208; scores unchanged; Cmd+Shift+C aligns centre off the Mac, #1940; tab leaders are drawn in the tab's gap, #1877; type in symbols, pattern tiles, graph designs and opacity masks gets its layout bounds back on opening a native file, #1738; score unchanged; Escape while typing ends the edit, #1686; Select › Same on type, #1737; justify when creating point type, #1748; scores unchanged; OpenType stylistic sets, alternates, figure styles, superscript and subscript as character features, #1607; a wide word in non-rectangular area type moves down, #1615; scores unchanged; Character Styles New/Redefine capture the first selected character at run boundaries and end prior typing before capture; boundary and typing-history input tests and full workspace CI pass; scores and hours unchanged; Character styles retain explicit Auto leading, propagate resets and preserve local leading overrides; scores and hours unchanged; Linux font folders from fontconfig, #1529; commands and MCP add_text report area type that does not fit its frame, #1471; Tabs panel stop drags, #1458; Fit Headline in a frame one line tall, #1444; frames and paths beyond a billion points hold no text, #1451; scores unchanged; missing glyphs are looked for again after a font rescan, #1376; scores unchanged; Full-name font matching (#1258); Windows font-service QA pending; scores unchanged; Middle Eastern digit types: Character panel menu › Digits, {digits}; the font menu's script filter lists Thai fonts; Thai, Lao, Khmer and Myanmar lines break between words; the caret steps over whole clusters such as Thai consonants with their marks; Thai typed in a font without Thai falls back to a font made for Thai; earlier: Proportional Metrics in vertical type, vpal, #966; Cmd+Shift+C aligns centre off the Mac, a double-click on area type's bottom handle turns on Auto Size, #1940; MCP add_text exposes the existing vertical option for point, area and path type; horizontal remains the default; scores and hours unchanged; Vertical fullwidth question and exclamation marks keep their nominal glyph upright when the font has no vertical alternate; scores and hours unchanged. tab leaders are drawn in the tab's gap, #1877; type in symbols, pattern tiles, graph designs and opacity masks gets its layout bounds back on opening a native file, #1738; score unchanged; Escape while typing ends the edit, #1686; Select › Same on type, #1737; justify when creating point type, #1748; scores unchanged; OpenType stylistic sets, alternates, figure styles, superscript and subscript as character features, #1607; a wide word in non-rectangular area type moves down, #1615; scores unchanged; Character Styles New/Redefine capture the first selected character at run boundaries and end prior typing before capture; boundary and typing-history input tests and full workspace CI pass; scores and hours unchanged; Character styles retain explicit Auto leading, propagate resets and preserve local leading overrides; scores and hours unchanged; Linux font folders from fontconfig, #1529; commands and MCP add_text report area type that does not fit its frame, #1471; Tabs panel stop drags, #1458; Fit Headline in a frame one line tall, #1444; frames and paths beyond a billion points hold no text, #1451; scores unchanged; missing glyphs are looked for again after a font rescan, #1376; scores unchanged; Full-name font matching (#1258); Windows font-service QA pending; scores unchanged; Middle Eastern digit types: Character panel menu › Digits, {digits}; the font menu's script filter lists Thai fonts; Thai, Lao, Khmer and Myanmar lines break between words; the caret steps over whole clusters such as Thai consonants with their marks; Thai typed in a font without Thai falls back to a font made for Thai; earlier: Proportional Metrics in vertical type, vpal, #966) · Target: Adobe Illustrator 2026 (30.x)

Type is Illustrator's largest single area by use (weight 13 of 105 across "Type core" and "Type advanced" in target-app-parity.md). This checklist lists the features one by one. Status is from the code and tests (crates/text, crates/engine/src/cmd/type*.rs, textstyles.rs, crates/tools/src/text.rs) against Illustrator's public documentation; estimated unless noted.

Summary

Part % Remaining (h)
Type core (point, area, path type, Character/Paragraph, styles, threading, OpenType, fonts) 80% 14–19
Type advanced (CJK composition, Middle Eastern, spelling, Touch Type, Retype, variable fonts) 50% 20–28

Checklist

Feature Status Notes
Native font-family labels partial With Show Font Names in English off, localized legacy names are used when typographic names contain no native label (#2208); loaded-font and catalog-only regressions. Choosing among multiple native languages is unchanged.
Point, area and type-on-a-path type; vertical variants done / partial vertical point, area and path type have initial support; fullwidth ! / ? keep the nominal glyph upright when no vertical alternate exists (Unicode Tu); in a non-rectangular area a word too wide for the top lines moves down to the first line that holds it (#1615); Escape while typing ends the edit, keeps the type selected and switches to the Selection tool (#1802); text.create and text.createInPath take justify (#1752); MCP add_text forwards vertical to both commands
Area Type Options (rows, columns, inset, first baseline, Auto Size, Shrink Text to Fit) done the commands that make or restyle type say when it does not fit its frame; MCP add_text takes Auto Size and Shrink Text to Fit (#1471)
Threaded text, Fit Headline, Text Wrap done Fit Headline sees wrapping in a frame one line tall (#1444); a thread holds area type and type on a path in any mix, as Illustrator links type in an area or along a path (help)
Threading from the out port: a click on the red "+" loads the text; a click on a closed path, area type or type on a path threads into it, a click on empty canvas makes a frame of the same kind, shape and size there, a drag draws a rectangular frame; Escape or another tool cancels partial #2572 in part: the Selection tool, text.thread.add {from, to?, rect?, at?}; only the red port of overflowing area type and type on a path is clickable (type on a path's sits just past its end bracket; empty ports and in ports are not drawn, so they can't be clicked yet), and the loaded cursor borrows the I-beam until it's drawn
Type on a Path effects and options; brackets done #429
Character and Paragraph panels, styles with overrides done Character-style Auto-leading resets, partial definitions, local leading overrides, override markers, Undo/Redo and native serialization have regression coverage; differing paragraph alignments leave the shared alignment buttons unselected (headless regressions, full integration CI and visual review pass); mixed-value display for other paragraph fields remains missing
Character size and horizontal scale after object/group scaling done #1034: fields and setters compensate the stored affine; point size follows the transformed em-height axis, not the glyph ink bounds. Range edits, keyboard increments, leading and baseline shift use document points; rotation, reflection and shear remain editable.
Preserve font sizes while scaling a group missing Separate enhancement; scaling still scales text with the other artwork.
OpenType panel, Glyphs panel, alternates done Highlight Alternate Glyphs preference (#394, off by default) paints pink behind OpenType substitutions on screen when on; stylistic sets ss01–ss20, stylistic and titling alternates, proportional and lining figures, superscript and subscript are character-style features (text.setStyle {features}, #1607)
Font menu: samples, live preview, filters, favourites, recent families; font matching by any name; Find Font done #3515: recently applied families appear first, once each; missing families are omitted and the existing Number of Recent Fonts setting applies; #339; script filter: Japanese, Latin, Thai; the font scan on Linux also reads the folders fontconfig's configuration lists, such as TeX fonts under /usr/share/texmf/fonts (#1548, fixes #1529; not verified on Linux)
Missing glyphs set in an installed font made for their script (Thai, Lao, Khmer, Myanmar first; then any font that has them) done Thai: Leelawadee UI, Tahoma, Thonburi, Sukhumvit Set, Noto Sans Thai, TLWG
Full font-name matching (OpenType name ID 4) done #1258: loaded/cataloged faces and Missing Fonts searches; localized names and variable default faces; Windows font-service QA pending
Variable fonts partial named instances as styles; Character panel › Variable Font sets each axis (fontAxes); the font menu's Variable filter is missing
Fallback glyphs keep the text's weight and slant done #2491: a character from a fallback face is set in that family's face nearest the run's weight and slant; Bold Italic of a missing family is drawn Bold (Source Sans 3 has no Bold Italic) rather than Italic
Colour fonts (bitmap, COLR, OpenType SVG) partial bitmap glyphs (sbix, CBDT) done: the largest strike's PNG, transformed with the type, fill and stroke ignored; PDF Type 3 glyphs or images, SVG images with outlined text (live text leaves emoji to the viewer, their fonts not embedded), EPS and legacy .ai images, Create Outlines images; not sbix duplicate, flipped, JPEG or TIFF glyphs, or CBDT BGRA or mask data, ruby, envelopes or warps. COLR (v0 and v1) done: a glyph's layers as vector art (solid colours, linear and radial gradients, clip glyphs and boxes, blend modes, transforms, palette 0, the foreground colour from the run's fill, variable fonts at the face's instance), transformed with the type; drawn on the canvas, written as paths in SVG, EPS, legacy .ai and PDF with outlined text, as text in PDF (Type 3 glyphs), and Create Outlines makes groups of editable paths. Paints documents have no form for draw the glyph as an image (256 px per em): sweep gradients, Porter-Duff compositing, radial gradients from a circle that isn't the centre, repeating or reflecting gradients. Not ruby, envelopes or warps. COLR and SVG glyphs also go with type that geometry effects reshape (on the canvas and in exports), into Expand Appearance and EMF/WMF export, as their art; bitmap glyphs don't yet. OpenType SVG done: a glyph's SVG document (its element glyph<gid>) is read by the SVG importer into vector art in font units, currentColor in the run's fill (and the legacy context-fill and context-stroke in its fill and stroke), a viewBox mapped onto the em square, and then drawn, exported and outlined as COLR glyphs are; in PDF real text such glyphs are text that draws nothing, with their art drawn where they sit. Not images, scripts or text inside glyph documents, nor CPAL palette variables. Evidence: tests_svg_glyphs, svg/tests/svg_glyphs.rs, tests_colourfonts::create_outlines_turns_svg_glyphs_into_groups, tests_colourfonts::pdf_real_text_draws_svg_glyphs_as_art_and_keeps_their_characters, tests_colourfonts::expand_appearance_keeps_the_colour_glyphs_of_type_with_effects, render::tests_colrglyphs::colour_glyphs_go_with_type_that_a_geometry_effect_reshapes, tests_bitmaps, tests_colr, render::tests_bitmapglyphs, render::tests_colrglyphs, pdf::tests::colour_bitmap_glyphs_export_as_images, pdf::tests::colr_glyphs_export_as_vector_art, svg/tests/colour_glyphs.rs, eps colour_bitmap_glyphs_* and colr_glyphs_*, tests_pathops::create_outlines_turns_bitmap_glyphs_into_images, tests_pathops::create_outlines_turns_colr_glyphs_into_layer_groups
Colour fonts (bitmap, COLR, OpenType SVG) partial bitmap glyphs (sbix, CBDT) done: the largest strike's PNG, transformed with the type, fill and stroke ignored; PDF Type 3 glyphs or images, SVG images with outlined text (live text leaves emoji to the viewer, their fonts not embedded), EPS and legacy .ai images, Create Outlines images; not sbix duplicate, flipped, JPEG or TIFF glyphs, or CBDT BGRA or mask data, ruby, envelopes or warps. COLR (v0 and v1) done: a glyph's layers as vector art (solid colours, linear and radial gradients, clip glyphs and boxes, blend modes, transforms, palette 0, the foreground colour from the run's fill, variable fonts at the face's instance), transformed with the type; drawn on the canvas, written as paths in SVG, EPS, legacy .ai and PDF with outlined text, as text in PDF (Type 3 glyphs), and Create Outlines makes groups of editable paths. Paints documents have no form for draw the glyph as an image (256 px per em): sweep gradients, Porter-Duff compositing, radial gradients from a circle that isn't the centre, repeating or reflecting gradients. Not ruby, envelopes or warps. OpenType SVG done: a glyph's SVG document (its element glyph<gid>) is read by the SVG importer into vector art in font units, currentColor in the run's fill (and the legacy context-fill and context-stroke in its fill and stroke), the root's viewBox (or else its size) fitted into the em square and centred, the glyph's element drawn on its own as if used (what its parents apply doesn't reach it), and then drawn, exported and outlined as COLR glyphs are; in PDF real text such glyphs are text that draws nothing, with their art drawn where they sit. Not images, scripts or text inside glyph documents, nor CPAL palette variables. Evidence: tests_svg_glyphs, svg/tests/svg_glyphs.rs, tests_colourfonts::create_outlines_turns_svg_glyphs_into_groups, tests_colourfonts::pdf_real_text_draws_svg_glyphs_as_art_and_keeps_their_characters, tests_bitmaps, tests_colr, render::tests_bitmapglyphs, render::tests_colrglyphs, pdf::tests::colour_bitmap_glyphs_export_as_images, pdf::tests::colr_glyphs_export_as_vector_art, svg/tests/colour_glyphs.rs, eps colour_bitmap_glyphs_* and colr_glyphs_*, tests_pathops::create_outlines_turns_bitmap_glyphs_into_images, tests_pathops::create_outlines_turns_colr_glyphs_into_layer_groups
Every-line and Single-line composers done tuned by eye, never compared side by side
Optical Margin Alignment done Type › Optical Margin Alignment, type.opticalMarginAlignment: per type object, with one setting for all the frames of a thread, in point and area type of left-to-right paragraphs, and at the brackets of type on a path whose first paragraph runs left to right; right-to-left paragraphs of point and area type, and type on a path whose first paragraph runs right to left, do not hang
System Layout done Character panel menu › System Layout, type.systemLayout: the whole document, off by default and for documents from before it, saved only when on. On, every text object advances by whole points (at least one when a character takes space). New point, area and path type, threaded frames, placed text, graph and dimension labels and pasted plain text inherit it. Evidence: tests::system_layout_rounds_positive_advances_to_whole_points, typecmd::area_tests::system_layout_sets_the_document_and_every_text_object, panels::character::tests::system_layout_menu_item_toggles_the_document
Fractional Widths done Character panel menu › Fractional Widths, type.fractionalWidths: per type object, and every frame of its threads. On by default and for documents from before it; saved only when off. Off, each character that takes space advances by a whole number of points, at least one, so small type does not run together. Evidence: tests::fractional_widths_off_rounds_positive_advances_to_whole_points, typecmd::area_tests::fractional_widths_is_set_per_object_and_saved_only_when_off, panels::character::tests::fractional_widths_menu_item_toggles_the_type_object
Roman Hanging Punctuation done Paragraph panel menu › Roman Hanging Punctuation, text.setFormat {romanHangingPunctuation} (#2756): per paragraph, Optical Margin Alignment's punctuation and amounts without the letters; paragraph styles carry it. Evidence: tests::roman_hanging_punctuation_hangs_punctuation_but_not_letters, typecmd::area_tests::roman_hanging_punctuation_is_set_per_paragraph_and_saved_only_when_on. Whole paragraphs hang as published with both composers, ragged, centred and justified, with Line-end Punctuation Half Width and bidirectional lines; Justification's Glyph Scaling leaves the hung marks at their width, and Standard burasagari counts what hangs at a line's start as room before hanging a comma (tests_hang)
Hyphenation… and Justification… options done Hyphenation… (ui.hyphenation, text.setFormat) sets each paragraph's Words Longer Than, After First, Before Last, Hyphen Limit, Hyphenation Zone (Single-line Composer only) and Hyphenate Capitalized Words, and paragraph styles carry them (#2310). Justification… (ui.justification, text.setFormat, #2755) sets Word Spacing, Letter Spacing and Glyph Scaling (Minimum, Desired, Maximum), Auto Leading and Single Word Justification; Desired applies to every line, justified lines and the Every-line Composer use the ranges. Vertical type isn't glyph scaled; type on a path doesn't use them. Evidence: crates/text/src/tests_justify.rs, dialogs::justification::tests
Roman Hanging Punctuation done Paragraph panel menu › Roman Hanging Punctuation, text.setFormat {romanHangingPunctuation} (#2756): per paragraph, Optical Margin Alignment's punctuation and amounts without the letters; paragraph styles carry it. Evidence: tests::roman_hanging_punctuation_hangs_punctuation_but_not_letters, typecmd::area_tests::roman_hanging_punctuation_is_set_per_paragraph_and_saved_only_when_on
Hyphenation… and Justification… options done Hyphenation… (ui.hyphenation, text.setFormat) sets each paragraph's Words Longer Than, After First, Before Last, Hyphen Limit, Hyphenation Zone (Single-line Composer only) and Hyphenate Capitalized Words, and paragraph styles carry them (#2310). Justification… (ui.justification, text.setFormat, #2755) sets Word Spacing, Letter Spacing and Glyph Scaling (Minimum, Desired, Maximum), Auto Leading and Single Word Justification; Desired applies to every line, justified lines and the Every-line Composer use the ranges. Vertical type isn't glyph scaled; type on a path doesn't use them. Auto Leading also sets the Leading the Character panel shows for Auto type, the leading Alt+↑/↓ (type.step) steps from, per paragraph, and the lines Fill with Placeholder Text counts. Evidence: crates/text/src/tests_justify.rs, dialogs::justification::tests, tests_prefs::auto_leading_steps_and_fills_from_the_paragraph_auto_leading, panels::character test leading_field_shows_the_paragraph_auto_leading
Tab stops and leaders; Tabs panel partial Tabs panel and stops with leaders in the model (text.tabs.set); a stop drags from where the press landed (#1458); leaders fill the tab's gap, repeated on a grid so they line up from line to line (#1877)
Hidden characters (Show Hidden Characters) done type.hiddenCharacters
Spell check (Check Spelling, Auto Spell Check, custom dictionary) missing menu stubs; needs an openly licensed dictionary
Smart Punctuation, Change Case, Find & Replace done
Caret: the arrows and Delete step over whole clusters (Thai consonant with its marks, combining accents, emoji); Backspace removes one character done in text with right-to-left characters the arrows move in visual order and stop on both sides of a character drawn with no width, such as a zero width non-joiner
Touch Type tool done moves, scales and rotates one character through its kerning, baseline shift, scales and rotation (text.touchType); the first character of a line and right-to-left characters move only up and down
Retype (identify fonts in outlines/images) missing Illustrator's uses a cloud model
Snap to Glyph done View › Snap to Glyph (view.snapToGlyph): with Smart Guides on, new point type and drawing tools snap to live-text baselines and glyph bounds (Targets::for_drawing, tools::text_tests::snap_to_glyph_lines_up_new_point_type_with_a_baseline)
Thai, Lao, Khmer, Myanmar: shaping (marks, reordering), lines broken between words, word-by-word caret and double-click done words found by ICU4X's line segmenter: dictionaries on the desktop, LSTM models on the web
Middle Eastern: bidirectional layout, Paragraph Direction done
Middle Eastern: digit types (Character panel menu › Digits: Default, Arabic, Hindi, Farsi) done text.setFormat / text.setRangeStyle {digits}; the text keeps the typed digits, the glyphs and SVG export follow the style
Middle Eastern: Character Direction, kashidas, Middle Eastern composers, split caret missing
CJK: input methods (marked text, candidate window) done
CJK: kinsoku (Hard, Soft, None), Line-end Punctuation Half Width, tate-chu-yoko (auto) done / partial custom kinsoku sets, the Mojikumi Settings dialog and the other mojikumi sets missing
CJK: Proportional Metrics (palt in horizontal type, vpal in vertical type) done #966
CJK: manual tate-chu-yoko done Character panel menu › Tate-chu-yoko (text.setFormat / text.setRangeStyle {tateChuYoko}), with Show East Asian Options: marked characters stand side by side across one em of a vertical column, squeezed to the em when wider; two or three half-width digits still do so without the mark; horizontal type keeps the mark and does not move them. Up/Down and Left/Right settings remain. Evidence: tests_vertical::manual_tate_chu_yoko_sets_marked_characters_across_one_em, typecmd::tate_chu_yoko_is_a_character_attribute_saved_only_when_on
CJK: ruby, manual tate-chu-yoko partial ruby (ふりがな) for live text (type.ruby): a reading over a byte range, above (right of the column in vertical type) or below, start/centre/end alignment, size, overhang or squeeze; saved natively, laid out with its line growing, drawn on the canvas, in SVG and PDF (as outlines where ruby is present); manual tate-chu-yoko missing
No Break done Character panel menu (text.setFormat / text.setRangeStyle {noBreak}): the marked characters stay on one line, including across a space; a run that does not fit after earlier text moves together, and a run longer than the line stays together. Evidence: layout::wrapping_tests::no_break_keeps_marked_characters_on_one_line, tests::no_break_keeps_marked_words_on_one_line, typecmd::no_break_is_a_character_attribute_saved_only_when_on
CJK: ruby missing #633
Inline symbols in text beyond Illustrator not scored
Align Stroke (inside, outside) on live type's character stroke beyond Illustrator not scored; stroke.set {align} and text.setRangeStyle {strokeOptions: {align}}; saved natively, drawn around the glyphs on the canvas and in PDF, EPS and SVG (live text, stroke on the glyph outlines); visual bounds grow with it (#2294)

Character Styles menu New/Redefine and footer New capture the first selected character of a nonempty Type selection, including exact style-run and UTF-8 boundaries; New adds a definition without applying it. New/Redefine commands accept optional end for range capture. Start-only command affinity, existing UI caret/object behavior and paragraph capture at start remain unchanged. Pointer regressions assert captured definitions, linked-text updates and local overrides, complete-document Undo/Redo and saved state, with whole-object, collapsed-caret and range-Apply controls. Capture closes prior typing while preserving the Type selection. Live text and Select All regressions exercise menu New/Redefine and footer New, asserting that further typing retains the captured definition and that typing, capture and further typing have separate Undo/Redo steps. Focused engine and egui input tests pass for boundary capture, all three live-typing capture routes and the existing compatibility controls. Full workspace CI passes.

Revision history

Date Change Summary
2026-10-23 minor Colour fonts: colour glyphs (COLR, SVG) go with type that effects reshape, into Expand Appearance and EMF/WMF export, where they were left out with the type's outlines; bitmap glyphs not yet; scores unchanged
2026-10-23 minor Colour fonts: OpenType SVG glyphs follow the SVG table's coordinate rules: a root size without a viewBox sets up the em, a viewBox that isn't square is centred in it, and a glyph element nested in others is drawn on its own; scores unchanged
2026-10-23 minor Colour fonts: OpenType SVG colour fonts draw and export as vector art: each glyph's SVG document read by the SVG importer, in the run's colours where it uses currentColor (or the legacy context-fill/context-stroke); drawn, exported and outlined as COLR glyphs are; scores unchanged
2026-10-23 minor Hanging punctuation: Glyph Scaling of justified lines no longer widens the marks that hang (they hang exactly their published share), and Standard burasagari counts what hangs at a line's start before deciding a comma overflows; paragraph-level tests with both composers (crates/text/src/tests_hang.rs); scores unchanged
2026-10-20 minor Auto Leading outside the layout: the Character panel's Leading, the Alt+↑/↓ leading nudge and Fill with Placeholder Text follow the paragraph's Auto Leading; scores unchanged
2026-10-23 minor Colour fonts: COLR colour fonts (v0 and v1) draw and export as vector art: layers with solid colours, gradients, clips and blend modes on the canvas, in SVG, EPS, legacy .ai and PDF, and as editable paths with Create Outlines; paints documents lack (sweep gradients, compositing) as images of the glyph; scores unchanged
2026-10-22 minor Font pickers list recently applied families first (#3515), using the existing recent-font limit; search, filters, previews and keyboard selection share the same rows. Scores and estimates unchanged.
2026-10-21 minor Snap to Glyph marked done in the checklist (#3124); scores unchanged at this rounding
2026-10-21 minor Manual Tate-chu-yoko: Character panel menu marks characters that stand across one em of a vertical column; ruby and the up/down settings remain; scores unchanged
2026-10-21 minor System Layout: Character panel menu sets whole-point advances for every text object in the document (off by default); scores and hours unchanged
2026-10-22 minor Ruby (ふりがな) for live text: type.ruby sets/removes a reading over a byte range, above or below (right/left of the column in vertical type), aligned, sized and overhanging or squeezed; saved natively, laid out with line growth, drawn on the canvas and in SVG/PDF (outlines where ruby is present); scores unchanged
2026-10-21 minor Fractional Widths: Character panel menu turns whole-point advances on or off per type object (on by default); System Layout remains a stub; scores and hours unchanged
2026-10-21 minor Type on a path threads, mixed with area type in one thread: its text that doesn't fit flows on into the next frame, and its red out port, just past its end bracket, loads the Selection tool with that text as area type's does; a new frame threaded from it at a point is type on a path of its shape; scores unchanged
2026-10-21 minor No Break: marked characters stay on one line; scores unchanged
2026-10-17 minor Roman Hanging Punctuation (#2756): per-paragraph hanging of Latin punctuation outside the margin; scores unchanged
2026-10-17 minor Justification… (#2755): word and letter spacing, glyph scaling, Auto Leading and Single Word Justification per paragraph; the default word spacing range is 80/100/133%, so justified lines break differently than with the old fixed 80–150%; scores unchanged
2026-10-17 minor A click on area type's red out port loads the Selection tool with the overflow text; the next click threads it into a closed path or a new frame of the same shape there, a drag into a new rectangle (text.thread.add, #2572 in part). The out port moved up the frame's right side, clear of the corner handle. Scores and hours unchanged.
2026-10-16 minor Native font-family labels fall back from English-only typographic names to localized legacy names (#2208). English labels and native typographic precedence are preserved; synthetic loaded/catalog tests. Scores and estimates unchanged.
2026-10-16 minor Align Stroke on live type: the characters' stroke goes inside or outside the glyphs without creating outlines, for every run or a range; kept in the native file and in canvas, PDF, EPS and SVG output (#2294); beyond Illustrator, scores and hours unchanged
2026-10-14 minor Cmd+Shift+C (Align center) works on Windows and Linux too, where egui reported it as a copy; a double-click on area type's bottom middle handle turns on Auto Size (#1940); scores and hours unchanged
2026-10-14 minor MCP add_text exposes the existing vertical option for point, area and path type; horizontal remains the default; scores and hours unchanged.
2026-10-14 minor Vertical fullwidth question and exclamation marks keep their nominal glyph upright when the font has no vertical alternate; scores and hours unchanged.
2026-10-14 minor Tab leaders are drawn: the leader's characters fill the tab's gap in the tab's font and size, whole copies on a grid from the frame's edge so leaders line up across lines (fixes #1877); scores and hours unchanged
2026-10-14 minor Type inside symbols, pattern tiles, graph designs and opacity masks gets its layout bounds back on opening a native file, so warped type in a symbol looks the same after save and reopen (#1833, #1738). Score unchanged (estimated)
2026-10-14 minor Escape while typing ends the edit, keeps the type selected and switches to the Selection tool (#1802, #1686, #1656); Select › Same matches type on its characters' fill and stroke (#1746, #1737); text.create, text.createInPath and the MCP add_text tool take justify, so point type can be centred on or end at its point (#1752, #1748); scores and hours unchanged
2026-10-13 minor Area type in a non-rectangular shape moves a word too wide for the top lines down to the first line that holds it instead of breaking it (#1617, fixes #1615); Stylistic sets (ss01–ss20), stylistic and titling alternates, proportional and lining figures, and superscript and subscript glyphs can be turned on as OpenType features of a character style (text.setStyle {features}), and the OpenType panel keeps them (#1611, fixes #1607); scores and hours unchanged
2026-10-13 minor Paragraph/Properties alignment buttons show mixed alignment without changing range commands; headless regressions, full integration CI and visual review pass; other mixed paragraph fields, scores and hours unchanged
2026-10-13 minor The font scan on Linux also reads the folders fontconfig's configuration lists, such as TeX fonts under /usr/share/texmf/fonts (#1548, fixes #1529; not verified on Linux); scores and hours unchanged
2026-10-13 minor Character Styles range capture samples the first selected character at run boundaries and closes prior typing; boundary and typing-history input tests and full workspace CI pass; lifecycle and range controls retained; scores and hours unchanged
2026-10-13 minor The commands that make or restyle type, and MCP add_text, report area type that does not fit its frame, and add_text takes Auto Size and Shrink Text to Fit (#1500, fixes #1471); a tab stop in the Tabs panel drags from where the press landed, a stop just added included (#1487, fixes #1458); scores and hours unchanged
2026-10-22 minor Colour fonts: colour emoji fonts with bitmap glyphs (sbix: Apple Color Emoji; CBDT: Noto Color Emoji) draw on the canvas and export: PDF Type 3 glyphs or images, SVG images with outlined text, EPS and legacy .ai images, Create Outlines images; scores unchanged
2026-10-13 minor Fit Headline no longer pushes the tracking to its ceiling and loses glyphs when the frame holds one line (#1445, fixes #1444); text frames, wrap shapes and type paths with coordinates beyond a billion points hold no text, and layout limits its search for room, instead of hanging (#1451); scores and hours unchanged
2026-10-12 minor Character styles retain explicit Auto leading, propagate resets and preserve local leading overrides; scores and hours unchanged
2026-10-12 minor A character no installed font had is looked for again after the fonts are rescanned, so installing a font fixes it without a restart (#1376, from #992); scores and hours unchanged
2026-10-16 minor Fallback glyphs keep the text's weight and slant; Bold Italic of a missing family keeps the bold (#2491); scores and hours unchanged
2026-10-16 minor A variable font whose name table says Light but whose default instance is Regular (Noto Sans Hebrew) lists and weighs its default face as Regular (#2521); scores and hours unchanged
2026-10-12 minor Full-name font matching and Missing Fonts searches (#1258): synthetic static/variable font regressions; Windows font-service QA pending; scores and hours unchanged
2026-10-11 minor Middle Eastern: digit types done (Character panel menu › Digits: Default, Arabic, Hindi, Farsi; text.setFormat / text.setRangeStyle {digits}); Character Direction, kashidas, composers and the split caret still missing; scores unchanged at this rounding
2026-10-11 minor Thai, Lao, Khmer and Myanmar words for the caret (Ctrl/Alt+arrows) and double-click; combining marks count as part of a word; score unchanged (estimated)
2026-10-11 minor Font menu: a Thai script filter beside Japanese and Latin; score unchanged (estimated)
2026-10-11 minor Thai, Lao, Khmer and Myanmar text breaks its lines between words (ICU4X line segmenter) instead of only at spaces; score unchanged (estimated)
2026-10-11 minor The Type tool's arrows and Delete move by grapheme cluster, never between a Thai consonant and its vowel or tone marks; score unchanged (estimated)
2026-10-11 minor Thai (Lao, Khmer, Myanmar) missing from the font in use falls back to an installed font made for the script instead of whichever face covering it loaded first; score unchanged (estimated)
2026-10-11 minor Proportional Metrics done: palt in horizontal type, vpal in vertical type (#966, #1082); ruby and manual tate-chu-yoko still missing
2026-10-10 minor #1034: transformed character controls and regression coverage; preserving group font sizes remains a separate enhancement. Scores/hours unchanged at this rounding.
2026-10-10 major First checklist, split out of the parity table's Type core and Type advanced rows