From 13628274b72a3161123db493f867547e86f7dbc2 Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Sat, 31 Oct 2026 15:41:31 -0700 Subject: [PATCH] OpenType: the panel turns Stylistic and Titling Alternates on and off, and offers Proportional Lining figures The OpenType panel gains Stylistic Alternates (salt) and Titling Alternates (titl) checkboxes after Swash. The Figure menu lists Default Figure, Tabular Lining, Proportional Lining, Proportional Oldstyle and Tabular Oldstyle. Proportional Lining sets pnum and lnum and turns tnum and onum off; Tabular Lining keeps lnum, Proportional Oldstyle keeps pnum, and Default Figure and Tabular Oldstyle turn both off. Every catalog has rows for the three new labels. --- crates/ui-egui/src/i18n/bg.tsv | 3 + crates/ui-egui/src/i18n/bs.tsv | 3 + crates/ui-egui/src/i18n/ca.tsv | 3 + crates/ui-egui/src/i18n/cs.tsv | 3 + crates/ui-egui/src/i18n/da.tsv | 3 + crates/ui-egui/src/i18n/de.tsv | 3 + crates/ui-egui/src/i18n/el.tsv | 3 + crates/ui-egui/src/i18n/es.tsv | 3 + crates/ui-egui/src/i18n/fi.tsv | 3 + crates/ui-egui/src/i18n/fr.tsv | 3 + crates/ui-egui/src/i18n/hu.tsv | 3 + crates/ui-egui/src/i18n/id.tsv | 3 + crates/ui-egui/src/i18n/it.tsv | 3 + crates/ui-egui/src/i18n/ja.tsv | 3 + crates/ui-egui/src/i18n/ka.tsv | 3 + crates/ui-egui/src/i18n/ko.tsv | 3 + crates/ui-egui/src/i18n/nl.tsv | 3 + crates/ui-egui/src/i18n/pl.tsv | 3 + crates/ui-egui/src/i18n/pt-br.tsv | 3 + crates/ui-egui/src/i18n/ru.tsv | 3 + crates/ui-egui/src/i18n/sv.tsv | 3 + crates/ui-egui/src/i18n/tr.tsv | 3 + crates/ui-egui/src/i18n/uk.tsv | 3 + crates/ui-egui/src/i18n/vi.tsv | 3 + crates/ui-egui/src/i18n/zh-hans.tsv | 3 + crates/ui-egui/src/i18n/zh-hant.tsv | 3 + crates/ui-egui/src/panels/opentype.rs | 197 ++++++++++++++++++++++---- docs/target-app-parity.md | 1 + 28 files changed, 252 insertions(+), 24 deletions(-) diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index cb018daf7..9c34a3bff 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -2416,6 +2416,7 @@ digits Tamil Тамилски digits Telugu Телугу digits Kannada Каннада digits Malayalam Малаялам + Proportional Lining Пропорционални подравнени цифри Proportional Oldstyle Пропорционални стари цифри Pucker & Bloat… Свиване и раздуване… Pucker Tool Инструмент „Свиване“ @@ -3203,6 +3204,7 @@ digits Malayalam Малаялам Swap Fill and Stroke (Shift+X) Размяна на запълването и щриха (Shift+X) Swap start and end arrowheads Размяна на началната и крайната стрелка Swap the selected object for the file, keeping its place and transform Замяна на избрания обект с файла, като се запазват мястото и трансформациите му + Stylistic Alternates Стилистични алтернативи Swash Декоративен елемент Swatch Conflict Конфликт на образци Swatch Conflicts Конфликти на образци @@ -3272,6 +3274,7 @@ digits Malayalam Малаялам Tabs Табулатори Tabular Lining Таблични подравнени цифри Tabular Oldstyle Таблични стари цифри + Titling Alternates Алтернативи за заглавия Target Цел Target Contents Целево съдържание Target: Цел: diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index aad1ce608..d79eeecca 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -1780,13 +1780,16 @@ digits Malayalam Malajalam Fractions Razlomci Ligatures are off while the text is tracked. Ligature su isključene dok tekst ima razmak slova. Ordinals Redni brojevi + Proportional Lining Proporcionalne brojke Proportional Oldstyle Proporcionalne stare brojke Reset OpenType Features Vrati OpenType mogućnosti na početno Select text to set its OpenType features. Odaberite tekst da postavite njegove OpenType mogućnosti. Standard Ligatures Standardne ligature + Stylistic Alternates Stilske alternative Swash Ukrasni potez Tabular Lining Tabelarne brojke Tabular Oldstyle Tabelarne stare brojke + Titling Alternates Alternative za naslove Every-line Composer Slagač svih redova First-line Left Indent Lijeva uvlaka prvog reda Hyphenation… Rastavljanje riječi… diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index c874a4e36..34d1de77f 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -3098,6 +3098,7 @@ digits Malayalam Malaiàlam Proof Setup Configuració de prova Properties Propietats Proportional Metrics Mètriques proporcionals + Proportional Lining Xifres proporcionals alineades Proportional Oldstyle Oldstyle proporcional PRs PRs Public Domain Domini públic @@ -4118,6 +4119,7 @@ digits Malayalam Malaiàlam Swap Fill and Stroke (Shift+X) Intercanvia el farciment i el traç (Maj+X) Swap start and end arrowheads Intercanvia les puntes de fletxa inicial i final Swap the selected object for the file, keeping its place and transform Substitueix l’objecte seleccionat pel fitxer, mantenint-ne la posició i la transformació + Stylistic Alternates Alternatives estilístiques Swash Volada Swatch Conflict Conflicte de mostres Swatch Conflicts Conflictes de mostres @@ -4175,6 +4177,7 @@ digits Malayalam Malaiàlam Tabs Tabulacions Tabular Lining Xifres tabulars alineades Tabular Oldstyle Xifres tabulars antigues + Titling Alternates Alternatives de titulars Tag Etiqueta Tag (open) Etiqueta (oberta) Taper Afusament diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 1d1869553..fc059b440 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -1806,13 +1806,16 @@ digits Malayalam Malajálamské Fractions Zlomky Ligatures are off while the text is tracked. Ligatury jsou vypnuté, když má text prostrkání. Ordinals Řadové číslovky + Proportional Lining Proporcionální verzálkové Proportional Oldstyle Proporcionální minuskové Reset OpenType Features Obnovit funkce OpenType Select text to set its OpenType features. Vyberte text, abyste mohli nastavit jeho funkce OpenType. Standard Ligatures Standardní ligatury + Stylistic Alternates Stylistické alternativy Swash Ozdobné tvary Tabular Lining Tabulkové verzálkové Tabular Oldstyle Tabulkové minuskové + Titling Alternates Titulkové alternativy Every-line Composer Sazba všech řádků First-line Left Indent Odsazení prvního řádku zleva Hyphenation… Dělení slov… diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index 399c067ad..690b2699b 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -1622,13 +1622,16 @@ digits Malayalam Malayalam Fractions Brøker Ligatures are off while the text is tracked. Ligaturer er slået fra, mens der er sporing på teksten. Ordinals Ordenstal + Proportional Lining Proportionale versalcifre Proportional Oldstyle Proportionale mediævalcifre Reset OpenType Features Nulstil OpenType-funktioner Select text to set its OpenType features. Markér tekst for at angive dens OpenType-funktioner. Standard Ligatures Standardligaturer + Stylistic Alternates Stilistiske alternativer Swash Sving Tabular Lining Tabulære versalcifre Tabular Oldstyle Tabulære mediævalcifre + Titling Alternates Titelalternativer Every-line Composer Hverlinjesætter First-line Left Indent Venstre indrykning af første linje Hyphenation… Orddeling… diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 80adbe117..c6bf0ad76 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -2435,6 +2435,7 @@ digits Tamil Tamil digits Telugu Telugu digits Kannada Kannada digits Malayalam Malayalam + Proportional Lining Proportionale Versalziffern Proportional Oldstyle Proportionale Mediävalziffern Pucker & Bloat… Zusammenziehen und aufblasen… Pucker Tool Zusammenziehen-Werkzeug @@ -3241,6 +3242,7 @@ effect Points Punkte Swap Fill and Stroke (Shift+X) Fläche und Kontur vertauschen (Shift+X) Swap start and end arrowheads Pfeilspitzen an Anfang und Ende vertauschen Swap the selected object for the file, keeping its place and transform Das ausgewählte Objekt durch die Datei ersetzen; Position und Transformation bleiben erhalten + Stylistic Alternates Stilistische Varianten Swash Schwungschrift Swatch Conflict Farbfeldkonflikt Swatch Conflicts Farbfeldkonflikte @@ -3293,6 +3295,7 @@ effect Points Punkte Tabs Tabulatoren Tabular Lining Tabellarische Versalziffern Tabular Oldstyle Tabellarische Mediävalziffern + Titling Alternates Titelschriftvarianten Target Ziel Target Contents Inhalt als Ziel auswählen Target: Ziel: diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index 535bc98be..f5c0ccedc 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -1954,6 +1954,7 @@ font-technology Variable Μεταβλητές Subtract Αφαίρεση Superscript Εκθέτης Superscript: Εκθέτης: + Stylistic Alternates Εναλλακτικοί χαρακτήρες στυλ Swash Διακοσμητικά τελειώματα Swatches Δείγματα χρωμάτων New Group Νέα ομάδα @@ -3074,6 +3075,7 @@ digits Tamil Ταμιλικά digits Telugu Τελούγκου digits Kannada Κανάντα digits Malayalam Μαλαγιάλαμ + Proportional Lining Ισοϋψείς αναλογικοί αριθμοί Proportional Oldstyle Αναλογικοί παλαιοτυπικοί αριθμοί Pucker & Bloat… Συρρίκνωση και διόγκωση… Pucker Tool Συρρίκνωση (Pucker Tool) @@ -3694,6 +3696,7 @@ digits Malayalam Μαλαγιάλαμ Tabs Στηλοθέτες Tabular Lining Ισοϋψείς αριθμοί σταθερού πλάτους Tabular Oldstyle Παλαιοτυπικοί αριθμοί σταθερού πλάτους + Titling Alternates Εναλλακτικοί χαρακτήρες τίτλων Target Στόχος Target Contents Περιεχόμενα στόχου Tate-chu-yoko Tate-chu-yoko diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 5a56e70b0..858750161 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -2473,6 +2473,7 @@ digits Tamil Tamil digits Telugu Telugu digits Kannada Canarés digits Malayalam Malayálam + Proportional Lining Proporcionales de caja alta Proportional Oldstyle Estilo antiguo proporcional Pucker & Bloat… Fruncir y engordar… Pucker Tool Herramienta Fruncir @@ -3275,6 +3276,7 @@ digits Malayalam Malayálam Swap Fill and Stroke (Shift+X) Intercambiar relleno y trazo (Shift+X) Swap start and end arrowheads Intercambiar puntas de flecha inicial y final Swap the selected object for the file, keeping its place and transform Sustituir el objeto seleccionado por el archivo, conservando su posición y transformación + Stylistic Alternates Alternativas estilísticas Swash Decorativa Swatch Conflict Conflicto de muestras Swatch Conflicts Conflictos de muestras @@ -3344,6 +3346,7 @@ digits Malayalam Malayálam Tabs Tabulaciones Tabular Lining Tabulares de caja alta Tabular Oldstyle Tabulares de estilo antiguo + Titling Alternates Alternativas de titulares Target Destino Target Contents Contenido de destino Target: Destino: diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 2a4564b93..f1aa49a30 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -1767,13 +1767,16 @@ digits Malayalam Malajalam Fractions Murtoluvut Ligatures are off while the text is tracked. Ligatuurit eivät ole käytössä, kun tekstin merkkiväliä on muutettu. Ordinals Järjestysluvut + Proportional Lining Suhteelliset numerot Proportional Oldstyle Suhteelliset vanhanaikaiset numerot Reset OpenType Features Palauta OpenType-ominaisuudet Select text to set its OpenType features. Valitse teksti, jonka OpenType-ominaisuudet haluat asettaa. Standard Ligatures Vakioligatuurit + Stylistic Alternates Tyylivaihtoehdot Swash Koukerot Tabular Lining Taulukkonumerot Tabular Oldstyle Vanhanaikaiset taulukkonumerot + Titling Alternates Otsikkovaihtoehdot Every-line Composer Kaikkien rivien asettelu First-line Left Indent Ensimmäisen rivin vasen sisennys Hyphenation… Tavutus… diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index a7a46033a..fc18c34aa 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -2471,6 +2471,7 @@ digits Tamil Tamoul digits Telugu Télougou digits Kannada Kannada digits Malayalam Malayalam + Proportional Lining Chiffres proportionnels alignés Proportional Oldstyle Elzévirien proportionnel Pucker & Bloat… Contraction et dilatation… Pucker Tool Outil Contraction @@ -3273,6 +3274,7 @@ digits Malayalam Malayalam Swap Fill and Stroke (Shift+X) Permuter le fond et le contour (Maj+X) Swap start and end arrowheads Permuter les pointes de flèche de début et de fin Swap the selected object for the file, keeping its place and transform Remplacer l’objet sélectionné par le fichier, en conservant sa position et sa transformation + Stylistic Alternates Variantes stylistiques Swash Lettres ornées Swatch Conflict Conflit de nuances Swatch Conflicts Conflits de nuances @@ -3342,6 +3344,7 @@ digits Malayalam Malayalam Tabs Tabulations Tabular Lining Chiffres tabulaires alignés Tabular Oldstyle Chiffres tabulaires elzéviriens + Titling Alternates Variantes de titrage Target Cible Target Contents Contenu de la cible Target: Cible : diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index eec246113..9935eaa4a 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -3001,6 +3001,7 @@ mark-style Japanese Japán Proof Setup Színpróba beállítása Properties Tulajdonságok Proportional Metrics Arányos metrika + Proportional Lining Arányos modern Proportional Oldstyle Arányos régies Public Domain Közkincs Pucker Összehúzás @@ -3944,6 +3945,7 @@ mark-style Japanese Japán Swap Fill and Stroke (Shift+X) Kitöltés és körvonal cseréje (Shift+X) Swap start and end arrowheads Kezdő és záró nyílhegy cseréje Swap the selected object for the file, keeping its place and transform A kijelölt objektum cseréje a fájlra, a helye és az átalakítása megtartásával + Stylistic Alternates Stilisztikai változatok Swash Cifra változatok Swatch Conflict Színminta-ütközés Swatch Conflicts Színminta-ütközések @@ -3989,6 +3991,7 @@ mark-style Japanese Japán Tabs Tabulátorok Tabular Lining Táblázatos modern Tabular Oldstyle Táblázatos régies + Titling Alternates Címváltozatok Tag Címke Tag (open) Címke (nyitott) Target Célzás diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index e5904b11c..4ecabcc93 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -1622,13 +1622,16 @@ digits Malayalam Malayalam Fractions Pecahan Ligatures are off while the text is tracked. Ligatur nonaktif saat teks diberi tracking. Ordinals Ordinal + Proportional Lining Lining proporsional Proportional Oldstyle Oldstyle proporsional Reset OpenType Features Setel ulang fitur OpenType Select text to set its OpenType features. Pilih teks untuk mengatur fitur OpenType-nya. Standard Ligatures Ligatur standar + Stylistic Alternates Alternatif gaya Swash Swash Tabular Lining Lining tabular Tabular Oldstyle Oldstyle tabular + Titling Alternates Alternatif judul Every-line Composer Komposer tiap baris First-line Left Indent Indentasi kiri baris pertama Hyphenation… Pemenggalan kata… diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index bf53ef52d..7c82ec424 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -2504,6 +2504,7 @@ digits Tamil Tamil digits Telugu Telugu digits Kannada Kannada digits Malayalam Malayalam + Proportional Lining Proporzionali allineati Proportional Oldstyle Proporzionali stile antico Pucker & Bloat… Contrai e gonfia… Pucker Tool Strumento Contrai @@ -3309,6 +3310,7 @@ digits Malayalam Malayalam Swap Fill and Stroke (Shift+X) Inverti riempimento e traccia (Shift+X) Swap start and end arrowheads Inverti punte di freccia iniziale e finale Swap the selected object for the file, keeping its place and transform Sostituisci l'oggetto selezionato con il file, mantenendone posizione e trasformazione + Stylistic Alternates Alternative stilistiche Swash Ornamentale Swatch Conflict Conflitto campioni Swatch Conflicts Conflitti campioni @@ -3378,6 +3380,7 @@ digits Malayalam Malayalam Tabs Tabulazioni Tabular Lining Tabulari allineati Tabular Oldstyle Tabulari stile antico + Titling Alternates Alternative per titoli Target Destinazione Target Contents Contenuto destinazione Target: Destinazione: diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 718561e26..4d97ac742 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -3041,6 +3041,7 @@ mark-style Japanese 日本式 Superscript: 上付き文字: Swap Fill and Stroke 塗りと線を入れ替え Swap start and end arrowheads 始点と終点の矢印を入れ替え + Stylistic Alternates スタイル代替字 Swash スワッシュ Swatch Conflict スウォッチの競合 Swatch Conflicts スウォッチの競合 @@ -3615,6 +3616,7 @@ file-filter Templates テンプレート Preset {} プリセット {} Preview in Browser needs the desktop app (the web downloads files instead) ブラウザーでプレビューにはデスクトップアプリが必要です (Web アプリではファイルがダウンロードされます) Print presets プリントプリセット + Proportional Lining プロポーショナルライニング Proportional Oldstyle プロポーショナルオールドスタイル Punctuation 句読点 Radius 1 半径 1 @@ -3696,6 +3698,7 @@ file-filter Templates テンプレート System Layout システムレイアウト Tabular Lining 等幅ライニング Tabular Oldstyle 等幅オールドスタイル + Titling Alternates タイトル代替字 Tate-chu-yoko 縦中横 Temperature 色温度 Template テンプレート diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 9091ca509..b10c28a80 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -1525,13 +1525,16 @@ digits Malayalam მალაიალამური Fractions წილადები Ligatures are off while the text is tracked. ტექსტზე ტრეკინგის დროს ლიგატურები გამორთულია. Ordinals რიგობითი რიცხვები + Proportional Lining პროპორციული ხაზოვანი Proportional Oldstyle პროპორციული ძველებური Reset OpenType Features OpenType შესაძლებლობების ჩამოყრა Select text to set its OpenType features. OpenType შესაძლებლობების დასაყენებლად მონიშნეთ ტექსტი. Standard Ligatures სტანდარტული ლიგატურები + Stylistic Alternates სტილისტური ალტერნატივები Swash მოხატული ასოები (swash) Tabular Lining ცხრილური ხაზოვანი Tabular Oldstyle ცხრილური ძველებური + Titling Alternates სათაურის ალტერნატივები Every-line Composer აბზაცის მიხედვით აწყობა First-line Left Indent პირველი სტრიქონის მარცხენა შეწევა Hyphenation… სიტყვების გადატანა… diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index cdf3b7937..86f82fad4 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -3030,6 +3030,7 @@ mark-style Japanese 일본식 Superscript: 위 첨자: Swap Fill and Stroke 칠과 선 바꾸기 Swap start and end arrowheads 시작과 끝 화살촉 바꾸기 + Stylistic Alternates 스타일 대체 글자 Swash 스워시 Swatch Conflict 견본 충돌 Swatch Conflicts 견본 충돌 @@ -3603,6 +3604,7 @@ file-filter Templates 템플릿 Preset {} 프리셋 {} Preview in Browser needs the desktop app (the web downloads files instead) 브라우저에서 미리 보기는 데스크톱 앱이 필요합니다(웹에서는 파일이 다운로드됩니다) Print presets 인쇄 프리셋 + Proportional Lining 비례 라이닝 Proportional Oldstyle 비례 올드스타일 Punctuation 문장 부호 Radius 1 반지름 1 @@ -3684,6 +3686,7 @@ file-filter Templates 템플릿 System Layout 시스템 레이아웃 Tabular Lining 고정폭 라이닝 Tabular Oldstyle 고정폭 올드스타일 + Titling Alternates 제목 대체 글자 Tate-chu-yoko 다테추요코 Temperature 색온도 Template 템플릿 diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index 1bd09afd9..39d58c856 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -1636,13 +1636,16 @@ digits Malayalam Malayalam Fractions Breuken Ligatures are off while the text is tracked. Ligaturen staan uit terwijl de tekst wordt gespatieerd. Ordinals Rangtelwoorden + Proportional Lining Proportionele lining Proportional Oldstyle Proportionele oldstyle Reset OpenType Features OpenType-functies herstellen Select text to set its OpenType features. Selecteer tekst om de OpenType-functies in te stellen. Standard Ligatures Standaardligaturen + Stylistic Alternates Stilistische alternatieven Swash Swash Tabular Lining Tabulaire lining Tabular Oldstyle Tabulaire oldstyle + Titling Alternates Titelalternatieven Every-line Composer Compositie per alinea First-line Left Indent Eerste regel links inspringen Hyphenation… Afbreken… diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 9e6894342..6b6141546 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -1725,13 +1725,16 @@ digits Malayalam Malajalam Fractions Ułamki Ligatures are off while the text is tracked. Ligatury są wyłączone, gdy tekst ma zmienione światło. Ordinals Liczebniki porządkowe + Proportional Lining Proporcjonalne nowoczesne Proportional Oldstyle Proporcjonalne nautyczne Reset OpenType Features Resetuj funkcje OpenType Select text to set its OpenType features. Zaznacz tekst, aby ustawić jego funkcje OpenType. Standard Ligatures Ligatury standardowe + Stylistic Alternates Alternatywy stylistyczne Swash Ozdobniki Tabular Lining Tabelaryczne nowoczesne Tabular Oldstyle Tabelaryczne nautyczne + Titling Alternates Alternatywy tytułowe Every-line Composer Kompozytor wielowierszowy First-line Left Indent Wcięcie pierwszego wiersza Hyphenation… Dzielenie wyrazów… diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 53bee8c06..9c79f3edb 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -2702,6 +2702,7 @@ digits Malayalam Malaiala Superscript: Sobrescrito: Swap Fill and Stroke Trocar Preenchimento e Traçado Swap start and end arrowheads Trocar pontas de seta inicial e final + Stylistic Alternates Variantes Estilísticas Swash Ornamento Swatch Conflict Conflito de Amostra Swatch Conflicts Conflitos de Amostra @@ -4619,6 +4620,7 @@ axis Both Ambos Preset {} Predefinido {} Preview in Browser needs the desktop app (the web downloads files instead) A visualização no navegador exige o aplicativo para desktop (na web, os arquivos são baixados) Print presets Predefinidos de impressão + Proportional Lining Alinhado Proporcional Proportional Oldstyle Antigo Proporcional Punctuation Pontuação Radius 1 Raio 1 @@ -4722,6 +4724,7 @@ axis Both Ambos System Layout Layout do Sistema Tabular Lining Alinhado Tabular Tabular Oldstyle Antigo Tabular + Titling Alternates Variantes de Titulação Tate-chu-yoko Tate-chu-yoko Temperature Temperatura Templates Modelos diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 93b2543de..de3223891 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -2500,6 +2500,7 @@ digits Tamil Тамильские digits Telugu Телугу digits Kannada Каннада digits Malayalam Малаялам + Proportional Lining Пропорциональные цифры Proportional Oldstyle Пропорциональные старого стиля Pucker & Bloat… Сморщивание и раздувание… Pucker Tool Инструмент «Сморщивание» @@ -3305,6 +3306,7 @@ digits Malayalam Малаялам Swap Fill and Stroke (Shift+X) Поменять заливку и обводку (Shift+X) Swap start and end arrowheads Поменять начальную и конечную стрелки Swap the selected object for the file, keeping its place and transform Заменить выделенный объект файлом, сохранив его положение и преобразование + Stylistic Alternates Стилистические альтернативы Swash Росчерк Swatch Conflict Конфликт образцов Swatch Conflicts Конфликты образцов @@ -3374,6 +3376,7 @@ digits Malayalam Малаялам Tabs Табуляции Tabular Lining Табличные цифры Tabular Oldstyle Табличные старого стиля + Titling Alternates Альтернативы для заголовков Target Объект Target Contents Содержимое объекта Target: Объект: diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index ef3a7b65c..61f1c1f98 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -2416,6 +2416,7 @@ digits Tamil Tamil digits Telugu Telugu digits Kannada Kannada digits Malayalam Malayalam + Proportional Lining Proportionella versalsiffror Proportional Oldstyle Proportionella medievalsiffror Pucker & Bloat… Dra ihop och svullna… Pucker Tool Verktyget Dra ihop @@ -3203,6 +3204,7 @@ digits Malayalam Malayalam Swap Fill and Stroke (Shift+X) Byt plats på fyllning och kontur (Shift+X) Swap start and end arrowheads Byt plats på start- och slutpilspets Swap the selected object for the file, keeping its place and transform Ersätt det markerade objektet med filen och behåll dess placering och transformering + Stylistic Alternates Stilistiska alternativ Swash Swash Swatch Conflict Färgrutekonflikt Swatch Conflicts Färgrutekonflikter @@ -3272,6 +3274,7 @@ digits Malayalam Malayalam Tabs Tabbstopp Tabular Lining Tabellsiffror, versala Tabular Oldstyle Medievalsiffror i tabellbredd + Titling Alternates Rubrikalternativ Target Mål Target Contents Målets innehåll Target: Mål: diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 85abd24cc..938c51915 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -2293,6 +2293,7 @@ digits Tamil Tamilce digits Telugu Telugu digits Kannada Kannada digits Malayalam Malayalam + Proportional Lining Orantılı Astar Proportional Oldstyle Orantılı Eski Stil Pucker & Bloat… Büzüşme ve Şişkinlik… Pucker Tool Büzme Aracı @@ -3099,6 +3100,7 @@ digits Malayalam Malayalam Swap Fill and Stroke (Shift+X) Dolgu ve Konturu Değiştir (Shift+X) Swap start and end arrowheads Başlangıç ve bitiş ok uçlarını değiştirin Swap the selected object for the file, keeping its place and transform Seçilen nesneyi, yerini koruyarak dosyayla değiştirin ve dönüştürün + Stylistic Alternates Stilistik Alternatifler Swash çalkalama Swatch Conflict Renk Örneği Çatışması Swatch Conflicts Renk Örneği Çatışmaları @@ -3168,6 +3170,7 @@ digits Malayalam Malayalam Tabs Sekmeler Tabular Lining Sekmeli Astar Tabular Oldstyle Tablolu Eski Stil + Titling Alternates Başlık Alternatifleri Target Hedef Target Contents Hedef İçerikler Target: Hedef: diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 686d8c4a1..d9d01c69d 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -2496,6 +2496,7 @@ digits Tamil Тамільські digits Telugu Телугу digits Kannada Каннада digits Malayalam Малаялам + Proportional Lining Пропорційні цифри Proportional Oldstyle Пропорційні цифри старого стилю Pucker & Bloat… Зморщування та роздування … Pucker Tool Інструмент «Зморщування» @@ -3302,6 +3303,7 @@ effect Points Точки Swap Fill and Stroke (Shift+X) Змінити заливку та обведення (Shift+X) Swap start and end arrowheads Поміняти початкову та кінцеву стрілки Swap the selected object for the file, keeping its place and transform Замінити виділений об’єкт файлом, зберігши його положення та перетворення + Stylistic Alternates Стилістичні альтернативи Swash Розчерк Swatch Conflict Конфлікт зразків Swatch Conflicts Конфлікти зразків @@ -3371,6 +3373,7 @@ effect Points Точки Tabs Табуляції Tabular Lining Табличні цифри Tabular Oldstyle Табличні цифри старого стилю + Titling Alternates Альтернативи для заголовків Target Об’єкт Target Contents Вміст об’єкта Target: Об’єкт: diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 5b5ad327d..e2bbed903 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -2783,6 +2783,7 @@ mark-style Japanese Kiểu Nhật Proof Setup Thiết lập thử nghiệm Properties Thuộc tính Proportional Metrics Số liệu theo tỷ lệ + Proportional Lining Số tỷ lệ đứng Proportional Oldstyle Kiểu cũ theo tỷ lệ Pucker & Bloat… Nhíu & Phồng… Pucker Tool Công cụ Nhíu @@ -3661,6 +3662,7 @@ mark-style Japanese Kiểu Nhật Swap Fill and Stroke (Shift+X) Đổi màu tô và nét (Shift+X) Swap start and end arrowheads Đổi đầu mũi tên bắt đầu và kết thúc Swap the selected object for the file, keeping its place and transform Thay đối tượng đã chọn bằng tệp, giữ nguyên vị trí và biến đổi + Stylistic Alternates Ký tự thay thế theo phong cách Swash Swash Swatch Conflict Xung đột mẫu màu Swatch Conflicts Xung đột mẫu màu @@ -3699,6 +3701,7 @@ mark-style Japanese Kiểu Nhật Tabs Tab Tabular Lining Số bảng đứng Tabular Oldstyle Số bảng kiểu cũ + Titling Alternates Ký tự thay thế cho tiêu đề Taper Thu dần Target Mục tiêu Target Contents Nội dung mục tiêu diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index f3246d7a4..ae44d9548 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -2376,6 +2376,7 @@ digits Tamil 泰米尔数字 digits Telugu 泰卢固数字 digits Kannada 卡纳达数字 digits Malayalam 马拉雅拉姆数字 + Proportional Lining 比例齐线数字 Proportional Oldstyle 比例旧式数字 Pucker & Bloat… 缩拢与膨胀… Pucker Tool 收缩工具 @@ -3141,6 +3142,7 @@ digits Malayalam 马拉雅拉姆数字 Swap Fill and Stroke (Shift+X) 切换填色和描边 (Shift+X) Swap start and end arrowheads 对调起点与终点箭头 Swap the selected object for the file, keeping its place and transform 以文件替换选择的对象,并保留其位置与变形 + Stylistic Alternates 风格替代字 Swash 花饰字 Swatch Conflict 色板冲突 Swatch Conflicts 色板冲突 @@ -3210,6 +3212,7 @@ digits Malayalam 马拉雅拉姆数字 Tabs 制表符 Tabular Lining 等宽齐线数字 Tabular Oldstyle 等宽旧式数字 + Titling Alternates 标题替代字 Target 目标 Target Contents 目标内容 Target: 目标: diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 831924ac2..454747090 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -3317,6 +3317,7 @@ digits Tamil 坦米爾數字 digits Telugu 泰盧固數字 digits Kannada 坎那達數字 digits Malayalam 馬來亞拉姆數字 + Proportional Lining 比例齊線數字 Proportional Oldstyle 比例舊式數字 Pucker & Bloat… 縮攏與膨脹… Pucker Tool 縮攏工具 @@ -4120,6 +4121,7 @@ digits Malayalam 馬來亞拉姆數字 Swap Fill and Stroke (Shift+X) 對調填色與筆畫 (Shift+X) Swap start and end arrowheads 對調起點與終點箭頭 Swap the selected object for the file, keeping its place and transform 以檔案取代選取的物件,並保留其位置與變形 + Stylistic Alternates 風格替代字 Swash 花體字 Swatch Conflict 色票衝突 Swatch Conflicts 色票衝突 @@ -4189,6 +4191,7 @@ digits Malayalam 馬來亞拉姆數字 Tabs 定位點 Tabular Lining 等寬齊線數字 Tabular Oldstyle 等寬舊式數字 + Titling Alternates 標題替代字 Target 目標 Target Contents 目標內容 Target: 目標: diff --git a/crates/ui-egui/src/panels/opentype.rs b/crates/ui-egui/src/panels/opentype.rs index 2be67f8e8..3f3bcb659 100644 --- a/crates/ui-egui/src/panels/opentype.rs +++ b/crates/ui-egui/src/panels/opentype.rs @@ -3,16 +3,74 @@ use egui::Ui; use serde_json::json; -use vectorcraft_text::OtFeatures; +use vectorcraft_text::{EXTRA_FEATURES, OtFeatures}; use super::character::{text_editing, text_style}; use crate::VectorcraftApp; use crate::widgets::{self, menu_item}; -/// A checkbox row: label and the feature flag it toggles. -type Toggle = (&'static str, fn(&mut OtFeatures) -> &mut bool); +/// The feature a checkbox row toggles: a named flag, or a tag of [`EXTRA_FEATURES`]. +#[derive(Clone, Copy)] +enum Flag { + Field(fn(&mut OtFeatures) -> &mut bool), + Extra(&'static str), +} -const FIGURES: [&str; 4] = ["Default Figure", "Tabular Lining", "Proportional Oldstyle", "Tabular Oldstyle"]; +/// A checkbox row: label and the feature it toggles. +type Toggle = (&'static str, Flag); + +const FIGURES: [&str; 5] = ["Default Figure", "Tabular Lining", "Proportional Lining", "Proportional Oldstyle", "Tabular Oldstyle"]; + +/// The bit of [`OtFeatures::extra`] that turns `tag` on (0 for a tag outside [`EXTRA_FEATURES`]). +fn extra_bit(tag: &str) -> u32 { + EXTRA_FEATURES.iter().position(|t| *t == tag).map_or(0, |i| 1 << i) +} + +impl Flag { + fn get(self, f: &OtFeatures) -> bool { + match self { + Flag::Field(field) => *field(&mut f.clone()), + Flag::Extra(tag) => f.extra & extra_bit(tag) != 0, + } + } + + fn put(self, f: &mut OtFeatures, on: bool) { + match self { + Flag::Field(field) => *field(f) = on, + Flag::Extra(tag) if on => f.extra |= extra_bit(tag), + Flag::Extra(tag) => f.extra &= !extra_bit(tag), + } + } +} + +/// The Figure menu entry `f` shows: Default Figure, Tabular Lining, Proportional Lining +/// (`pnum` and `lnum`), Proportional Oldstyle or Tabular Oldstyle. +fn figure(f: &OtFeatures) -> usize { + let proportional_lining = extra_bit("pnum") | extra_bit("lnum"); + match (f.tabular_figures, f.oldstyle_figures) { + (false, false) if f.extra & proportional_lining == proportional_lining => 2, + (false, false) => 0, + (true, false) => 1, + (false, true) => 3, + (true, true) => 4, + } +} + +/// `f` with Figure menu entry `i` chosen: the entry's features on, the other figure features off. +/// Tabular Lining keeps an `lnum` the type already has and clears `pnum`; Proportional Oldstyle +/// keeps a `pnum` and clears `lnum`; Default Figure and Tabular Oldstyle clear both. +fn set_figure(f: &mut OtFeatures, i: usize) { + f.tabular_figures = i == 1 || i == 4; + f.oldstyle_figures = i >= 3; + f.extra &= !match i { + 1 => extra_bit("pnum"), + 3 => extra_bit("lnum"), + _ => extra_bit("pnum") | extra_bit("lnum"), + }; + if i == 2 { + f.extra |= extra_bit("pnum") | extra_bit("lnum"); + } +} /// Apply `f` to the selection's features (the Type tool range, or whole objects). fn set(app: &mut VectorcraftApp, f: OtFeatures) { @@ -36,31 +94,16 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { let mut next = cur; ui.horizontal(|ui| { widgets::dim_label(ui, tl!("Figure:")); - let fig = match (cur.tabular_figures, cur.oldstyle_figures) { - (false, false) => 0, - (true, false) => 1, - (false, true) => 2, - (true, true) => 3, - }; + let fig = figure(&cur); if let Some(i) = widgets::dropdown(ui, "ot-figure", FIGURES[fig], &FIGURES, 170.0) { - next.tabular_figures = i == 1 || i == 3; - next.oldstyle_figures = i >= 2; + set_figure(&mut next, i); } }); widgets::divider(ui); - let rows: [Toggle; 7] = [ - (tl!("Standard Ligatures"), |f| &mut f.ligatures), - (tl!("Contextual Alternates"), |f| &mut f.contextual), - (tl!("Discretionary Ligatures"), |f| &mut f.discretionary_ligatures), - (tl!("Swash"), |f| &mut f.swash), - (tl!("Small Caps"), |f| &mut f.small_caps), - (tl!("Ordinals"), |f| &mut f.ordinals), - (tl!("Fractions"), |f| &mut f.fractions), - ]; - for (label, field) in rows { - let on = *field(&mut next.clone()); + for (label, flag) in rows() { + let on = flag.get(&next); if widgets::check(ui, label, on, true) { - *field(&mut next) = !on; + flag.put(&mut next, !on); } } if cur.ligatures && vectorcraft_text::ligatures_suppressed_by(st.tracking) && !vectorcraft_text::explicit_ligatures(&st.features) { @@ -71,6 +114,21 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { } } +/// The panel's checkbox rows, in the order they are drawn. +fn rows() -> [Toggle; 9] { + [ + (tl!("Standard Ligatures"), Flag::Field(|f| &mut f.ligatures)), + (tl!("Contextual Alternates"), Flag::Field(|f| &mut f.contextual)), + (tl!("Discretionary Ligatures"), Flag::Field(|f| &mut f.discretionary_ligatures)), + (tl!("Swash"), Flag::Field(|f| &mut f.swash)), + (tl!("Stylistic Alternates"), Flag::Extra("salt")), + (tl!("Titling Alternates"), Flag::Extra("titl")), + (tl!("Small Caps"), Flag::Field(|f| &mut f.small_caps)), + (tl!("Ordinals"), Flag::Field(|f| &mut f.ordinals)), + (tl!("Fractions"), Flag::Field(|f| &mut f.fractions)), + ] +} + pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) { if menu_item(ui, tl!("Reset OpenType Features"), text_style(app).is_some(), false) { set(app, OtFeatures::default()); @@ -96,4 +154,95 @@ mod tests { set(&mut app, OtFeatures { ligatures: false, fractions: true, ..Default::default() }); assert_eq!(text_style(&app).unwrap().0.features, ["-liga", "frac"]); } + + fn selected_text() -> VectorcraftApp { + let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), Default::default()); + app.session.execute("file.new", &json!({"width": 100, "height": 100})).unwrap(); + let id = app.session.execute("text.create", &json!({"x": 10, "y": 40, "text": "Ag 12"})).unwrap()["id"].clone(); + app.session.execute("select.set", &json!({"ids": [id]})).unwrap(); + app + } + + fn features(app: &VectorcraftApp) -> OtFeatures { + OtFeatures::from_tags(text_style(app).unwrap().0.features.iter().map(String::as_str)) + } + + /// The Stylistic Alternates and Titling Alternates rows turn `salt` and `titl` on and off + /// on the selected type. + #[test] + fn alternates_rows_set_and_clear_their_features() { + for (label, tag) in [("Stylistic Alternates", "salt"), ("Titling Alternates", "titl")] { + let mut app = selected_text(); + let Some((_, flag)) = rows().into_iter().find(|(l, _)| *l == label) else { + panic!("no {label} row"); + }; + let mut f = features(&app); + assert!(!flag.get(&f), "{label} starts off"); + flag.put(&mut f, true); + set(&mut app, f); + assert_eq!(text_style(&app).unwrap().0.features, [tag], "{label} on"); + assert!(flag.get(&features(&app))); + let mut f = features(&app); + flag.put(&mut f, false); + set(&mut app, f); + assert!(text_style(&app).unwrap().0.features.is_empty(), "{label} off"); + } + } + + /// The Figure menu lists its five entries in order; Proportional Lining sets `pnum` and + /// `lnum` and clears `tnum` and `onum`, Tabular Lining clears `pnum`, Proportional Oldstyle + /// clears `lnum`, and Default Figure and Tabular Oldstyle clear `pnum` and `lnum`. + #[test] + fn proportional_lining_figures() { + assert_eq!(FIGURES, ["Default Figure", "Tabular Lining", "Proportional Lining", "Proportional Oldstyle", "Tabular Oldstyle"]); + let mut app = selected_text(); + let mut f = features(&app); + set_figure(&mut f, 4); + set(&mut app, f); + assert_eq!(text_style(&app).unwrap().0.features, ["onum", "tnum"]); + let mut f = features(&app); + set_figure(&mut f, 2); + set(&mut app, f); + assert_eq!(text_style(&app).unwrap().0.features, ["pnum", "lnum"]); + assert_eq!(figure(&features(&app)), 2); + for (i, want) in [(0, vec![]), (1, vec!["tnum", "lnum"]), (3, vec!["onum", "pnum"]), (4, vec!["onum", "tnum"])] { + let mut f = features(&app); + set_figure(&mut f, 2); + set_figure(&mut f, i); + set(&mut app, f); + assert_eq!(text_style(&app).unwrap().0.features, want, "{}", FIGURES[i]); + assert_eq!(figure(&features(&app)), i); + } + // `pnum` alone is not Proportional Lining. + assert_eq!(figure(&OtFeatures::from_tags(["pnum"])), 0); + } + + /// Choosing Proportional Oldstyle on type with `pnum` and `onum` keeps `pnum`. + #[test] + fn proportional_oldstyle_keeps_pnum() { + let mut app = selected_text(); + set(&mut app, OtFeatures::from_tags(["pnum", "onum"])); + let mut f = features(&app); + assert_eq!(figure(&f), 3); + set_figure(&mut f, 3); + set(&mut app, f); + let tags = text_style(&app).unwrap().0.features; + assert!(tags.iter().any(|t| t == "pnum"), "{tags:?}"); + assert!(tags.iter().any(|t| t == "onum"), "{tags:?}"); + assert_eq!(figure(&features(&app)), 3); + } + + /// Choosing Tabular Lining on type with `lnum`, or with `tnum` and `lnum`, keeps `lnum`. + #[test] + fn tabular_lining_keeps_lnum() { + for start in [&["lnum"][..], &["tnum", "lnum"][..]] { + let mut app = selected_text(); + set(&mut app, OtFeatures::from_tags(start.iter().copied())); + let mut f = features(&app); + set_figure(&mut f, 1); + set(&mut app, f); + assert_eq!(text_style(&app).unwrap().0.features, ["tnum", "lnum"], "{start:?}"); + assert_eq!(figure(&features(&app)), 1); + } + } } diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 69b8bd604..c1dd45760 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -853,6 +853,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur - **Type:** Character size, leading, baseline shift and horizontal-scale controls account for object/group transforms (#1034): exact document-point sizes, mixed-value display and keyboard increments, range edits, resettable horizontal stretch, undo/redo and native save/reopen (`tests_typescale`, Character panel tests). Point size is the transformed em-height axis, independent of glyph ink bounds; affine rotation, reflection and shear are retained. Group scaling still scales text; preserving font sizes is a separate enhancement. Behaviour reference: [Transform text](https://helpx.adobe.com/illustrator/desktop/design-with-text/edit-format-text/transform-text.html) (public documentation). Text Wrap, Type on a Path effects (Rainbow/Skew/3D Ribbon/Stair Step/Gravity) and Options (Flip, Align to Path, Spacing; OK keeps the type where it is), type on a path's start, centre and end brackets (Selection and Direct Selection drag them to set where the type runs, slide it along its path and, across the path, flip it: #429), Character and Paragraph Styles (override-preserving redefine), paragraph attributes per paragraph (alignment, indents, spacing, hyphenation, hanging punctuation, tab stops, paragraph style, direction, mojikumi and leading model; the Paragraph, Tabs and Paragraph Styles panels act on the paragraphs the Type tool's selection or caret touches, Return continues the paragraph's style, threads and SVG keep them), Area Type Options (rows/columns/inset/first baseline, Text Flow by rows or by columns (#4978), vertical Align Top/Center/Bottom/Justify per row/column, reflowing non-rectangular frames and text wrap), threaded text across any closed shapes, Fit Headline, the Every-line Composer for justified and ragged text (paragraph-wide breaks for an even rag, Single-line per object from the Paragraph panel menu or `text.setFormat {composer}`). Area type resizes like Illustrator's type areas: a bounding-box handle drag (Selection tool) or Area Type Options Width/Height size the frame and the text reflows at its size (threads too); Direct Selection drags a frame corner or edge (`text.reshapeArea`), and an anchor of the path of type on a path outside perspective, the type reflowing along it (`text.reshapePath`, #3980). Point type still scales. Auto Size: the frame height follows the text after every edit, in the same undo step (rectangular frames of horizontal type in one row; columns get the least height that holds them; a height set by hand or threading turns it off), and the "Auto Size New Area Type" preference gives it to new area type. Shrink Text to Fit (beyond Illustrator): overflowing area type scales its sizes, leading and baseline shifts down by the largest factor (in 0.1 pt steps of the first run, down to a minimum percentage) that fits, at layout time so every export sees it. `text.areaOptions` and `document.inspect` report overflow and the shrink factor. The Selection tool shows the type widget beside selected type's bounding box (hollow on point type, filled on area type); double-clicking it converts between them (Type › Convert To Area Type / Convert To Point Type), keeping the text and its styles in place. Variable fonts list every named instance as a style of their family (Figtree Light to Black and their italics, Bahnschrift, Segoe UI Variable), and the instance chosen is shaped, drawn, outlined and measured at its axis settings; PDF and SVG embed it as that instance. The Character panel's Variable Font sliders set each axis (see Fonts). Beyond Illustrator: inline graphics (`text.insertInline`, Type ▸ Insert Inline Symbol) set a document symbol in a run of type as one character that flows, wraps and justifies like a glyph (InDesign-style inline objects, e.g. mana symbols in card rules text): sized to a multiple of the font size, centred on the cap height, opening up tall lines, following Redefine Symbol; a character of its run's size for Character Alignment and Top-to-Top leading, placed by the bidi reordering in right-to-left text (a neutral U+FFFC); drawn on the canvas, kept as live text plus a `` in SVG and as vector art in PDF; Backspace removes it whole. Hebrew and Arabic are laid out right to left with the Unicode bidirectional algorithm (embedded Latin and numbers keep their direction, lines put in visual order after wrapping) in point, area and path type, with caret, selection and arrow keys in visual order; each paragraph's direction comes from its first strong character unless Paragraph Direction sets it (Paragraph panel with Show Indic Options, `text.setFormat {direction}`), and new type aligns to the start of its direction. SVG export outlines right-to-left text. Arabic typefaces: builds made with a craft-fonts checkout that holds its Arabic families (Noto Sans Arabic, the Arabic fallback, plus Cairo, Tajawal, Almarai, IBM Plex Sans Arabic, Noto Kufi Arabic, Amiri, Alexandria, Fustat, Reem Kufi, Aref Ruqaa and Gulzar once craft-fonts adds them, storytold/craft-fonts#11; releases get them when their craft-fonts pin moves) list them in the font menus on desktop; the web build fetches them from beside the wasm (Noto Sans Arabic before start, so Arabic never shows as boxes, the rest in the background). Font Size and Leading are combo boxes in the Character and Properties panels (Font Size in the Control bar too, beside the Character link, font family and style): type, step with ↑/↓ or the spinner, scrub the label, or pick a preset (6–72 pt, shown in the type unit; Leading also Auto), each pick one undo step; Kerning and Tracking list -100…200; a size, leading, kerning or tracking the selected text doesn't share shows blank (#458). Type › Bold and Italic (beyond Illustrator, as page layout apps have them; Cmd+Shift+B / Cmd+Shift+I while the Type tool edits text) switch the selected type to its family's own Bold or Italic face and back, keeping its width (a Narrow face stays Narrow); a family without that face says so (#724). The commands that make or restyle type (and the MCP `add_text` tool) say in their result when area type does not fit its frame, and `add_text` takes Auto Size and Shrink Text to Fit (#1500, fixes #1471). Cmd+Shift+C (Align center) works on Windows and Linux too (#1940). A double-click on area type's bottom middle handle turns on Auto Size (#1940). Print and Print Preview warn about the area type and type on a path that prints without the text that doesn't fit, and give their ids. A tab stop in the Tabs panel drags from where the press landed, a stop just added included (#1487, fixes #1458). 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). 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). The Every-line Composer composes a paragraph whose characters differ in line metrics (type size, font, leading or vertical scale, or an inline graphic taller than the text) in rectangular area type, rows and columns included. In area type of another shape, or with text wrap, such a paragraph is broken with the Single-line Composer. The Character panel's Small Caps, Superscript and Subscript buttons and the panel menu's items of the same names turn small caps and the superscript or subscript position on and off for the selected type, or for the text the Type tool has selected (`text.setFormat` or `text.setRangeStyle` `{smallCaps, position}`), in Document Setup's proportions. Turning Superscript on turns Subscript off, and turning Subscript on turns Superscript off. A button or item shows as on when the first selected character (at a caret, the character before it) has its attribute. + The OpenType panel's Stylistic Alternates and Titling Alternates checkboxes turn `salt` and `titl` on and off for the selected type, and its Figure menu lists Default Figure, Tabular Lining, Proportional Lining, Proportional Oldstyle and Tabular Oldstyle; Proportional Lining sets `pnum` and `lnum` and turns `tnum` and `onum` off, Tabular Lining turns `pnum` off and keeps `lnum`, Proportional Oldstyle turns `lnum` off and keeps `pnum`, and Default Figure and Tabular Oldstyle turn `pnum` and `lnum` off. Behavior reference: [Format text with OpenType features](https://helpx.adobe.com/illustrator/desktop/design-with-text/special-characters-glyphs/format-text-with-opentype-features.html) and [Use swashes, titling alternates, or stylistic alternates](https://helpx.adobe.com/illustrator/desktop/design-with-text/special-characters-glyphs/use-swashes-titling-alternates-or-stylistic-alternates.html) (public documentation). Tests: `panels::opentype::tests`. - **Paragraph alignment:** the shared Paragraph/Properties alignment row leaves every button unselected when the paragraphs it acts on differ. Auto resolves per paragraph; choosing an alignment uses the existing command. Headless paragraph_mixed_alignment_* regressions exercise mixed → Center → Undo, caret/uniform states, Unicode range boundaries, Auto/direction, split runs and grouped text. These regressions and full integration CI pass. Original captures confirm mixed → Center → Undo in the existing alignment-button layout. The [public Paragraph panel guide](https://helpx.adobe.com/illustrator/desktop/design-with-text/edit-format-text/paragraph-panel-overview.html) lists the seven controls, but does not specify mixed-state rendering. Other paragraph fields remain outside this change; scores and hours unchanged. For Auto Size area type in columns, the bisection for the frame's height runs on the lines of the one-column layout, and its result is checked with at most two layouts of the columns. When the text wraps around objects or does not fit the one-column layout, or when the check fails, the columns are laid out at every step of the bisection, as before. Typing at the start of a story of 50,000 characters in 2 columns took 1,670 ms a keystroke and now takes 292 ms (release build, `auto_height_in_columns_typing_timing`). Exports to PDF, EPS, SVG, EMF, WMF and the raster formats warn about the area type and type on a path that they draw without the text that doesn't fit, and give their ids, as Print and Print Preview do.