Compare commits

...
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 f2e15cf8f8 Release 0.8.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 21:43:17 -04:00
Rees 2f6311cc37 M15: keep inherited proofing choices in Language dialog (#2717) (#2736)
Read effective character formatting so unchanged OK preserves language and no-proof choices inherited from defaults and styles.
2026-10-17 17:00:10 -06:00
NetterSilverandClaude Haiku 5.5 5834dc5a19 Shorten Russian "Accessibility" label so it fits the options sidebar (#2672)
Fixes #2668

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-17 16:59:29 -06:00
skylar taylor-barrick eae2421761 Merge pull request #2307 from dylanmtaylor/ci/nix-workflow
ci: add nix check workflow
2026-10-15 21:24:56 -06:00
Dylan M. Taylor 40c4ebc432 ci: add nix check workflow 2026-10-15 20:49:45 -04:00
skylar taylor-barrick 86adfd34eb refactor(pdf): adopt the shared PDF writer (PDFW)
PDFW: Migrate WordCraft PDF export to the shared writer while preserving application layout and export policy.

Refresh includes current main through fd0bb2fb. The exact merged tree passed all six local CI gates, 2,769 native tests, 39 PDF tests, 16 WASM package checks, and 104 paired exports / 117 pages on native and executed Node/WASM. Fresh Ubuntu, Windows and macOS Printing checks passed at df28b78.

PR #1558. Preserve the qualified branch history and immutable shared dependency revision.
2026-10-15 12:17:16 -06:00
9 changed files with 138 additions and 30 deletions
+33
View File
@@ -0,0 +1,33 @@
# Evaluates the Nix flake (no build, about a minute): `nix build` / `nix develop` stop at evaluation
# when Cargo.lock gains something nix/package.nix can't vendor, and nothing else would notice.
name: Nix
on:
push:
branches: [main]
paths: ["flake.nix", "flake.lock", "nix/**", "Cargo.lock", ".github/workflows/nix.yml"]
pull_request:
paths: ["flake.nix", "flake.lock", "nix/**", "Cargo.lock", ".github/workflows/nix.yml"]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: nix-${{ github.ref }}
cancel-in-progress: true
jobs:
eval:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: cachix/install-nix-action@13d8dd58da0234aa297dedd986986ccb8e7f3e24 # v31.11.1
- name: nix flake check --no-build
run: |
if [ -f flake.nix ]; then
nix flake check --no-build --all-systems
else
echo "No flake.nix present in this repository; skipping check."
fi
Generated
+20 -20
View File
@@ -5131,7 +5131,7 @@ dependencies = [
[[package]]
name = "wordcraft"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"arboard",
"clipboard-win",
@@ -5163,7 +5163,7 @@ dependencies = [
[[package]]
name = "wordcraft-cli"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"serde_json",
"sys-locale",
@@ -5176,11 +5176,11 @@ dependencies = [
[[package]]
name = "wordcraft-control-key"
version = "0.7.0"
version = "0.8.0"
[[package]]
name = "wordcraft-doc"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"proptest",
"serde",
@@ -5192,7 +5192,7 @@ dependencies = [
[[package]]
name = "wordcraft-docbin"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"cfb",
"image",
@@ -5208,7 +5208,7 @@ dependencies = [
[[package]]
name = "wordcraft-docx"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"aes",
"base64",
@@ -5230,7 +5230,7 @@ dependencies = [
[[package]]
name = "wordcraft-engine"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"cfb",
"encoding_rs",
@@ -5259,7 +5259,7 @@ dependencies = [
[[package]]
name = "wordcraft-fonts"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"harfrust 0.13.3",
"kurbo",
@@ -5272,7 +5272,7 @@ dependencies = [
[[package]]
name = "wordcraft-formats"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"cfb",
"chardetng",
@@ -5289,14 +5289,14 @@ dependencies = [
[[package]]
name = "wordcraft-geom"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"serde",
]
[[package]]
name = "wordcraft-layout"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"image",
"js-sys",
@@ -5315,7 +5315,7 @@ dependencies = [
[[package]]
name = "wordcraft-mcp"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"log",
"serde_json",
@@ -5327,7 +5327,7 @@ dependencies = [
[[package]]
name = "wordcraft-metafile"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"kurbo",
"thiserror 2.0.21",
@@ -5335,7 +5335,7 @@ dependencies = [
[[package]]
name = "wordcraft-pdf"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"craft-pdf",
"hayro-cmap",
@@ -5355,7 +5355,7 @@ dependencies = [
[[package]]
name = "wordcraft-proof"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"log",
"miniz_oxide 0.8.9",
@@ -5364,7 +5364,7 @@ dependencies = [
[[package]]
name = "wordcraft-render"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"image",
"log",
@@ -5378,7 +5378,7 @@ dependencies = [
[[package]]
name = "wordcraft-ui-egui"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"craft-ui",
"egui",
@@ -5404,7 +5404,7 @@ dependencies = [
[[package]]
name = "wordcraft-web"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"eframe",
"egui",
@@ -5423,7 +5423,7 @@ dependencies = [
[[package]]
name = "wordcraft-zotero"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"log",
"proptest",
@@ -5536,7 +5536,7 @@ checksum = "9440ea3e5aeabb0ac63af70daf835274065238cdd0cec83418f417eae38bacee"
[[package]]
name = "xtask"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"serde_json",
]
+1 -1
View File
@@ -4,7 +4,7 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/wordcraft", "apps/wordcraft-cli", "xtask"]
[workspace.package]
version = "0.7.0"
version = "0.8.0"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
+3 -1
View File
@@ -2,7 +2,7 @@
**Stage: alpha** · next: beta, ~15 points (60% → 75% ready for real work) and ~150–230 h away
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** trivial (table style editor formats every part, #714); previously trivial: VML freeforms read and kept on save; previously trivial: progress log: consistent preferred cell widths; previously trivial: multi-paragraph field instructions no longer add blank lines; previously trivial: page-break-only list paragraphs hide their labels; previously trivial: progress log: grouped `flowChartOr` shapes draw their circle and crossing spokes; previously trivial: progress log: copies keep their formatting in other programs, #1523; previously trivial: progress log: privacy options on save, #1062; previously trivial: progress log: equation pictures in theme colours on Windows, #1002; previously trivial: symbol fonts, #776; previously trivial: the save prompt answers from the keyboard, #861; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously trivial: formatting revisions landed, #41; previously trivial: Draw tab ink, #307, and Draw Table and Eraser, #303, landed: catalog 402/434; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; restructured to the craftrules progress-docs standard) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-17 · **Change:** trivial (Language dialog keeps inherited proofing language and no-proof choices (#2717)); previously trivial (table style editor formats every part, #714); previously trivial: VML freeforms read and kept on save; previously trivial: progress log: consistent preferred cell widths; previously trivial: multi-paragraph field instructions no longer add blank lines; previously trivial: page-break-only list paragraphs hide their labels; previously trivial: progress log: grouped `flowChartOr` shapes draw their circle and crossing spokes; previously trivial: progress log: copies keep their formatting in other programs, #1523; previously trivial: progress log: privacy options on save, #1062; previously trivial: progress log: equation pictures in theme colours on Windows, #1002; previously trivial: symbol fonts, #776; previously trivial: the save prompt answers from the keyboard, #861; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously trivial: formatting revisions landed, #41; previously trivial: Draw tab ink, #307, and Draw Table and Eraser, #303, landed: catalog 402/434; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; restructured to the craftrules progress-docs standard) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** trivial (progress log: print-area strings translated in every catalog; previously trivial: progress log: ODT sections, #1379; previously trivial: progress log: table deletes, Change Case and Unlink Fields respect Track Changes and locked content controls, #1329; previously trivial: progress log: rounded rectangle corners, #1476; previously trivial: progress log: Save As type list, #1399; previously trivial: progress log: privacy options on save, #1062; previously trivial: progress log: equation pictures in theme colours on Windows, #1002; previously trivial: symbol fonts, #776; previously trivial: the save prompt answers from the keyboard, #861; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously trivial: formatting revisions landed, #41; previously trivial: Draw tab ink, #307, and Draw Table and Eraser, #303, landed: catalog 402/434; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; restructured to the craftrules progress-docs standard) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Printing update:** 2026-10-12 · direct desktop printing through craft-print; details below.
@@ -139,6 +139,7 @@ Ranked, to beta (detail and remaining milestones in [docs/roadmap.md](docs/roadm
| 2026-10-14 | Tab stops edited on the ruler: the corner selector picks Left/Center/Right/Decimal/Bar, a click sets a stop (Alt skips the snap), dragging moves it with a guide line and position tooltip, dragging off the ruler clears it; markers draw per kind and mirror for RTL; one `para.tabs` call and one undo step per gesture |
| 2026-10-12 | Fields keep `w:dirty` through DOCX saves (#877): a begin marker flagged by a generator that couldn't compute a result (pandoc-style TOC placeholders) keeps the flag on open/save — as a buffered field or a range field — so Word still refreshes it on open; computing a result (Update Field, Update Table) clears it, like Word's F9 |
|---|---|
| 2026-10-17 | Language dialog keeps inherited proofing language and no-proof choices (#2717). Opening and accepting unchanged no longer replaces style-derived values with English US and proofing enabled. |
| 2026-10-14 | Consistent preferred cell widths override a stale table grid when both totals agree, for fixed and AutoFit tables. Conflicting widths, spans and percentages remain unchanged. |
| 2026-10-14 | Legacy VML freeforms (`v:shape` with its own `path`), such as the rule lines in many older headers, are read as freeform shapes: they show on screen and in PDFs and are saved back as DrawingML custom geometry instead of vanishing |
| 2026-10-14 | Field instructions spanning paragraphs no longer add blank lines during pagination; empty result paragraphs still take a line. |
@@ -403,6 +404,7 @@ Ranked, to beta (detail and remaining milestones in [docs/roadmap.md](docs/roadm
| Date | Change | Summary |
|---|---|---|
| 2026-10-17 | trivial | Language dialog keeps inherited proofing language and no-proof choices (#2717); readiness estimates unchanged |
| 2026-10-14 | trivial | Progress log: row table border exceptions |
| 2026-10-12 | minor | Czech proofing review: short-word splits rank after deletion, NOSUGGEST excludes suggestions while accepting typed forms, affix comments apply only to headers, ratios keep spaces and repeated-word messages use Czech quotes; synthetic engine end-to-end and latency checks |
| 2026-10-12 | minor | Czech spelling from the installed Hunspell dictionary, runtime-table suggestions and generic checks; Czech interface writes cs-CZ documents; no Czech hyphenation patterns bundled; estimates unchanged |
+70 -3
View File
@@ -426,9 +426,10 @@ pub struct LanguageForm {
impl LanguageForm {
pub fn read(app: &WordApp) -> LanguageForm {
let s = &app.session;
let here = s.typing_props();
let lang = here.lang.clone().or_else(|| s.doc.styles.default_chr.lang.clone()).unwrap_or_else(|| "en-US".into());
LanguageForm { lang, no_proof: here.no_proof.unwrap_or(false), detect: s.prefs.detect_language }
let style = s.doc.para_at(&s.sel.focus).and_then(|p| p.props.style.as_deref());
let here = s.doc.styles.resolve_char(style, &s.typing_props());
let lang = here.lang.unwrap_or_else(|| "en-US".into());
LanguageForm { lang, no_proof: here.no_proof, detect: s.prefs.detect_language }
}
/// `review.language` parameters for OK.
@@ -892,6 +893,72 @@ mod tests {
assert_eq!(language_name("xx-YY"), "xx-YY", "an unknown tag shows as itself");
}
/// #2717: language and no-proof can come from defaults or either kind of style.
#[test]
fn language_dialog_reads_inherited_proofing() {
for source in ["default", "paragraph", "character"] {
let mut a = app();
a.run("select.all", json!({})).unwrap();
let proofing = wordcraft_doc::CharProps { lang: Some("en-GB".into()), no_proof: Some(true), ..Default::default() };
match source {
"default" => a.session.doc.styles.default_chr.overlay(&proofing),
"paragraph" => a.session.doc.styles.styles.iter_mut().find(|s| s.id == "Normal").unwrap().chr.overlay(&proofing),
_ => {
a.session.doc.styles.styles.push(wordcraft_doc::Style {
id: "ProofingCharacter".into(),
kind: wordcraft_doc::StyleKind::Character,
chr: proofing,
..Default::default()
});
let (from, to) = a.session.sel.ordered();
let (from, to) = (from.clone(), to.clone());
a.session.doc.format_range(&from, &to, &|c| c.style = Some("ProofingCharacter".into())).unwrap();
}
}
let f = LanguageForm::read(&a);
assert_eq!((f.lang.as_str(), f.no_proof), ("en-GB", true), "{source}");
a.run("review.language", json!({"lang": "fr-FR", "noProof": false})).unwrap();
let f = LanguageForm::read(&a);
assert_eq!((f.lang.as_str(), f.no_proof), ("fr-FR", false), "direct formatting overrides {source}");
}
}
/// #2717: opening and accepting the dialog must not reset inherited proofing.
#[test]
fn language_dialog_ok_keeps_inherited_proofing() {
use egui_kittest::kittest::Queryable;
let mut a = app();
a.run("ui.language", json!({"value": "en"})).unwrap();
let normal = a.session.doc.styles.styles.iter_mut().find(|s| s.id == "Normal").unwrap();
normal.chr.lang = Some("en-GB".into());
normal.chr.no_proof = Some(true);
a.run("select.all", json!({})).unwrap();
let before = a.session.doc.clone();
a.run("review.language", json!({})).unwrap();
let mut h = egui_kittest::Harness::builder().with_size(egui::vec2(1440.0, 900.0)).build_ui_state(
|ui, app: &mut WordApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
a,
);
h.run_steps(3);
h.get_by_label("Cancel").click();
h.run_steps(3);
assert_eq!(h.state().session.doc, before, "cancel must not format the selection");
h.state_mut().run("review.language", json!({})).unwrap();
h.run_steps(3);
h.get_by_label("OK").click();
h.run_steps(3);
assert!(h.state().dialog.is_none());
let state = h.state_mut().run("format.state", json!({})).unwrap();
assert_eq!(state["lang"], "en-GB");
assert_eq!(state["noProof"], true);
h.state_mut().run("edit.undo", json!({})).unwrap();
assert_eq!(h.state().session.doc, before, "one undo restores the inherited formatting");
}
/// #407: Envelopes starts from the selected address; Add to Document puts an envelope
/// section before the letter without asking to save (nothing is replaced).
#[test]
+1 -1
View File
@@ -22,7 +22,7 @@
Accept Принять
Accept All Changes Принять все изменения
Accept This Change Принять это изменение
Accessibility Специальные возможности
Accessibility Доступность
Add Добавить
Add a comment Добавить комментарий
Add a Table Добавить таблицу
Can't render this file because it contains an unexpected character in line 7 and column 25.
+2 -2
View File
@@ -787,8 +787,8 @@ mod tests {
let bounds = text.visual_bounding_rect();
assert!(row.contains_rect(bounds.intersect(clip)), "{language} {percent}% {selected}: {label} paints outside {row:?}");
if language == "ru" && id == "accessibility" {
assert_eq!(label, "Специальные возможности");
assert!(bounds.right() > row.right(), "exercise a label wider than the row");
assert_eq!(label, "Доступность");
assert!(clip.contains_rect(bounds), "{language} {percent}% {selected}: {label} must fit its row");
}
if language == "en" && ["general", "display", "save"].contains(&id) {
assert!(clip.contains_rect(bounds), "short labels must remain fully visible");
+4 -1
View File
@@ -1,6 +1,6 @@
# Where WordCraft falls short of Word
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** trivial (VML freeforms read and kept on save; previously trivial: consistent preferred cell widths; previously trivial: multi-paragraph field instructions no longer add blank lines; previously trivial: page-break-only list paragraphs hide their labels; previously trivial: floating-table overlap ignores empty line-break lines; previously trivial: copies keep their formatting on the clipboard as HTML, #1523; previously trivial: sample-text formulas on Enter, #1067; previously trivial: #29: copied equations as MathML, OMML open as #1297, #816; previously trivial: the Font list no longer keeps every previewed font in memory, #848; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously trivial: formatting revisions landed, #41; previously trivial: Draw Table and Eraser landed, #303; previously minor: beta distance restated: ~15 points, ~150–230 h; previously: first version; every known shortfall from the 2026-10-10 re-measure, ranked) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-17 · **Change:** trivial (Language dialog keeps inherited proofing language and no-proof choices (#2717)); previously trivial (VML freeforms read and kept on save; previously trivial: consistent preferred cell widths; previously trivial: multi-paragraph field instructions no longer add blank lines; previously trivial: page-break-only list paragraphs hide their labels; previously trivial: floating-table overlap ignores empty line-break lines; previously trivial: copies keep their formatting on the clipboard as HTML, #1523; previously trivial: sample-text formulas on Enter, #1067; previously trivial: #29: copied equations as MathML, OMML open as #1297, #816; previously trivial: the Font list no longer keeps every previewed font in memory, #848; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously trivial: formatting revisions landed, #41; previously trivial: Draw Table and Eraser landed, #303; previously minor: beta distance restated: ~15 points, ~150–230 h; previously: first version; every known shortfall from the 2026-10-10 re-measure, ranked) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Printing update:** 2026-10-12 · direct desktop printing through craft-print; details below.
@@ -83,10 +83,13 @@ The same gaps grouped the way the parity documents are, for agents working in on
- **Localization gaps:** #8, #11, #16, #17; native-speaker review of every catalog (human).
- **Stability and performance gaps:** #3, #20.
The Language dialog reads effective character formatting, including document defaults, paragraph styles and character styles. Accepting it unchanged keeps inherited language and no-proof choices (#2717); explicit direct formatting still takes precedence. Other proofing and Windows-specific reports remain separate.
## Revision history
| Date | Change | Summary |
|---|---|---|
| 2026-10-17 | trivial | Language dialog keeps inherited proofing language and no-proof choices (#2717); readiness estimates unchanged |
| 2026-10-14 | trivial | Row table border exceptions fixed; other row table exceptions remain unsupported |
| 2026-10-12 | minor | Czech proofing review: short-word splits rank after deletion, NOSUGGEST excludes suggestions while accepting typed forms, affix comments apply only to headers, ratios keep spaces and repeated-word messages use Czech quotes; synthetic engine end-to-end and latency checks |
| 2026-10-12 | minor | Czech spelling from the installed Hunspell dictionary, runtime-table suggestions and generic checks; Czech interface writes cs-CZ documents; no Czech hyphenation patterns bundled; estimates unchanged |
+4 -1
View File
@@ -1,6 +1,6 @@
# UI parity with Microsoft Word
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** trivial (Modify Table Style formats every table style part, #714); previously trivial: a click on the ribbon chrome hands the keyboard to the page in the same frame, #1093 follow-up; previously trivial: Page Setup vertical alignment, #1320; previously trivial: the app opens on the Home tab every launch, as in Word; previously trivial: no document behind the Start screen, #1129; previously trivial: equation pictures share a few textures, #1002; previously trivial: selection bar in the left margin, #856; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously major: first version; ribbon, dialogs, shortcuts and on-canvas interaction measured from `crates/ui-egui` and the command registry) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-17 · **Change:** trivial (Language dialog keeps inherited proofing language and no-proof choices (#2717)); previously trivial (Modify Table Style formats every table style part, #714); previously trivial: a click on the ribbon chrome hands the keyboard to the page in the same frame, #1093 follow-up; previously trivial: Page Setup vertical alignment, #1320; previously trivial: the app opens on the Home tab every launch, as in Word; previously trivial: no document behind the Start screen, #1129; previously trivial: equation pictures share a few textures, #1002; previously trivial: selection bar in the left margin, #856; previously trivial: table column and row markers on the rulers, #700; previously trivial: table borders and the resize handle drag on the page, #217; previously major: first version; ribbon, dialogs, shortcuts and on-canvas interaction measured from `crates/ui-egui` and the command registry) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
How WordCraft looks and feels next to Word: ribbon, dialogs, panes, keyboard, mouse and touch.
Typing behaviour has its own checklist ([`typing-parity.md`](typing-parity.md)). All assets are our
@@ -55,10 +55,13 @@ Document title opens Rename Document; the account badge opens Options › Genera
| Screen readers (VoiceOver, Narrator, Orca) | AccessKit on; the document canvas describes paragraphs, headings (level), list items, tables, links, pictures (alt text) and the caret and selection, for the pages on screen (#488); Windows Magnifier follows the caret, also onto an empty line after Enter or Shift+Enter (#1119); not yet tried with real screen readers | full | 50% | 5–8 |
| Right-to-left (mirrored) interface | ❌ | ✅ (Arabic, Hebrew Word) | 0% | in localization |
The Language dialog reads effective character formatting, including document defaults, paragraph styles and character styles. Accepting it unchanged keeps inherited language and no-proof choices (#2717); explicit direct formatting still takes precedence. Other proofing and Windows-specific reports remain separate.
## Revision history
| Date | Change | Summary |
|---|---|---|
| 2026-10-17 | trivial | Language dialog keeps inherited proofing language and no-proof choices (#2717); readiness estimates unchanged |
| 2026-10-13 | trivial | New/Modify Table Style: No Border on a part that inherits its lines hides them; emptying the font box makes the part's font inherited again (#1288) |
| 2026-10-14 | trivial | Tab stops edited on the ruler: corner kind selector, click to set, drag to move or off to clear, per-kind markers mirrored for RTL; each gesture one `para.tabs` call and one undo step; Rulers 85% → 90% |
| 2026-10-12 | trivial | Tables on the page: one selected cell (Select Cell, or a click along its left edge) is a cell selection when its border is dragged: the border moves in its row only (#962) |