Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
4670988
fix(zoom): release Ctrl chords in main; step app zoom with adjustZoom…
rolfheij-sil Sep 14, 2026
19bafc2
feat(zoom): explicit macOS View menu zoom items bound to content zoom
rolfheij-sil Sep 14, 2026
6f2ff8c
feat(dialogs): isAnyDialogOpen query over docked dialogs and modal ov…
rolfheij-sil Sep 14, 2026
09d86d7
feat(zoom): window-chrome Ctrl chord listener with dialog no-op
rolfheij-sil Sep 14, 2026
c78b5c1
docs(shortcuts): catalog the content-zoom chords' new handlers; drop …
rolfheij-sil Sep 14, 2026
9c466d0
chore(zoom): final-review polish — catalog context, test typing, comm…
rolfheij-sil Sep 14, 2026
6e281a8
chore(types): regenerate papi.d.ts for the overlay-store dialog query
rolfheij-sil Sep 14, 2026
5a043bb
feat(zoom): gate the content-zoom target resolver while a dialog is open
rolfheij-sil Sep 14, 2026
685305e
docs(zoom): app-zoom command docs describe the chord move; chord-rule…
rolfheij-sil Sep 14, 2026
4d99fc8
docs(zoom): document the ContentZoomRoot opt-in for extension authors
rolfheij-sil Sep 15, 2026
3810f78
docs(pt9-inventory): catalogue Paratext 9 pane zoom and correct the L…
rolfheij-sil Sep 15, 2026
9f11baa
feat(zoom): add ContentZoomRoot, the opt-in wrapper for per-area cont…
rolfheij-sil Sep 15, 2026
d3af57f
fix(zoom): plain marker attribute on ContentZoomRoot; alphabetise the…
rolfheij-sil Sep 15, 2026
79b76c2
fix(zoom): pin the library marker literal to core's constant; correct…
rolfheij-sil Sep 15, 2026
ca99bc7
docs(zoom): state PT-4577's chord hand-over without implying it has l…
rolfheij-sil Sep 15, 2026
8f8249f
feat(zoom): a tab menu can be narrowed to its zoom group
rolfheij-sil Sep 15, 2026
bbb1ed3
feat(zoom): the tab menu offers zoom in, zoom out and reset zoom
rolfheij-sil Sep 15, 2026
9497cb4
feat(zoom): Simple mode's tabs offer the zoom items
rolfheij-sil Sep 15, 2026
be9a840
refactor(zoom): index the tab menu's groups by ReferencedItem instead…
rolfheij-sil Sep 15, 2026
cf964c5
fix(zoom): one mode subscription per tab; forward-facing comments; ca…
rolfheij-sil Sep 15, 2026
a0f0017
feat(settings): the General group leads with language and scaling, su…
rolfheij-sil Sep 15, 2026
859e776
feat(settings): a percent stepper edits a zoom factor without typing …
rolfheij-sil Sep 15, 2026
2b33a24
feat(settings): the default pane zoom is set as a percentage, not a d…
rolfheij-sil Sep 15, 2026
ddcae8a
fix(settings): the percent stepper rounds to the caller's step, not t…
rolfheij-sil Sep 15, 2026
377b8f3
fix(settings): relabel via a new key; tooltips, button group and perc…
rolfheij-sil Sep 15, 2026
c0c22be
fix(settings): keep the stepper's optimistic value while its own pres…
rolfheij-sil Sep 15, 2026
274bbd8
fix(settings): the stepper's readout follows the stored value; rapid …
rolfheij-sil Sep 15, 2026
8323867
fix(zoom): drop a pane's zoom areas when its replacement content runs…
rolfheij-sil Sep 15, 2026
fd299b4
feat(zoom): mark the Scripture editor's text and footnotes as zoom areas
rolfheij-sil Sep 15, 2026
c5d9c39
feat(zoom): the Scripture editor's menu offers zoom in, zoom out and …
rolfheij-sil Sep 15, 2026
73aeba6
test(zoom): e2e for the Scripture editor's text and footnotes zoom areas
rolfheij-sil Sep 15, 2026
881972a
fix(zoom): a click in a zoom area keeps it active when the click move…
rolfheij-sil Sep 15, 2026
cbf35e0
test(zoom): name the reset step for the click gesture it exercises
rolfheij-sil Sep 15, 2026
0d252ae
test(zoom): measure the content-zoom observer's rescan cost in the ed…
rolfheij-sil Sep 15, 2026
8d7356a
fix(zoom): satisfy require-disable-comment and drop an unregistered p…
rolfheij-sil Sep 15, 2026
2247e9c
test(zoom): drop the observer-cost measurement spec; its numbers live…
rolfheij-sil Sep 15, 2026
0e504dc
fix(zoom): a click suppresses only the one focus change it causes
rolfheij-sil Sep 15, 2026
d092463
test(zoom): share the editor zoom e2e helpers; loosen the marker cont…
rolfheij-sil Sep 15, 2026
c3cf706
fix(zoom): a focus change inside the clicked area does not spend the …
rolfheij-sil Sep 15, 2026
b14be0e
test(zoom): pin that a focus hop through an unmarked element keeps th…
rolfheij-sil Sep 15, 2026
b6dbdcd
fix(settings): the app-wide scaling label is sentence case
rolfheij-sil Sep 15, 2026
7a75d08
chore(zoom): regenerate platform-bible-utils and platform-bible-react…
rolfheij-sil Sep 16, 2026
732b52a
fix(settings): the zoom stepper keeps focus and its tooltip at the bo…
rolfheij-sil Sep 16, 2026
13b292c
perf(settings): memoize the debounced settings change handler
rolfheij-sil Sep 16, 2026
b088904
fix(zoom): only a modal overlay blocks zoom, and never for an explici…
rolfheij-sil Sep 16, 2026
2257340
test(macos-menu): clear the shared command mock between cases
rolfheij-sil Sep 16, 2026
39e8c01
fix(zoom): the window-chrome chord listener captures, and consumes a …
rolfheij-sil Sep 16, 2026
ceeac23
fix(zoom): tab-menu zoom items are disabled on a pane with no zoom area
rolfheij-sil Sep 16, 2026
f44bf72
fix(zoom): a right-click arms no suppression window; the gesture wind…
rolfheij-sil Sep 16, 2026
3f2a204
fix(zoom): a Tab spends the click gesture, so deliberate focus moves …
rolfheij-sil Sep 16, 2026
0593d04
perf(tab-menu): read each web view type's contributed menu once
rolfheij-sil Sep 16, 2026
0cb69c2
test(zoom): run the keyboard-chord e2e cases
rolfheij-sil Sep 16, 2026
41e882c
docs(zoom): describe the shipped chord ownership, labels and Simple-m…
rolfheij-sil Sep 16, 2026
3622b4e
test(zoom): put the caret in a footnote before the footnotes chord ca…
rolfheij-sil Sep 16, 2026
7569470
docs(zoom): say the chrome listener's modal check is a deliberate fas…
rolfheij-sil Sep 16, 2026
746e3b9
fix(zoom): review follow-ups — bound-state hover, chord-filter order,…
rolfheij-sil Sep 16, 2026
b9c3f1f
test(settings): the restored localized-strings mock returns the hook'…
rolfheij-sil Sep 16, 2026
dcc89a4
test(settings): restore the pinned clock in a hook and drop a backwar…
rolfheij-sil Sep 17, 2026
662674b
feat(renderer): track the full-screen overlays that bypass the overla…
rolfheij-sil Sep 17, 2026
7ab492f
fix(zoom): accept Shift for every zoom chord so Ctrl+0 works on AZERT…
rolfheij-sil Sep 17, 2026
739010c
refactor(settings): the zoom stepper steps with the platform's own ar…
rolfheij-sil Sep 17, 2026
ea9edf7
fix(zoom): the numpad 0 only resets zoom while NumLock is on
rolfheij-sil Sep 17, 2026
8d06d7d
fix(zoom): the chord gate stands down behind the full-screen overlays…
rolfheij-sil Sep 17, 2026
595b036
refactor(zoom): declare the zoom chords once and build both key handl…
rolfheij-sil Sep 17, 2026
1bb9f21
fix(settings): the zoom stepper's buttons and readout follow the pres…
rolfheij-sil Sep 17, 2026
cfa680e
feat(zoom): build the macOS View menu's zoom items from the shared ch…
rolfheij-sil Sep 17, 2026
3869f8f
fix(settings): debounce the zoom stepper's writes, on a shorter wait …
rolfheij-sil Sep 17, 2026
41232d7
fix(docking): key the contributed tab-menu cache by interface mode
rolfheij-sil Sep 17, 2026
6547f75
docs(docking): the tab menu's zoom items are gated by a snapshot, not…
rolfheij-sil Sep 17, 2026
b00ed2a
fix(macos-menu): copy each menu column's submenu before combining con…
rolfheij-sil Sep 17, 2026
5ba60d5
docs(adr): record what giving up the app-wide zoom chords costs a Win…
rolfheij-sil Sep 17, 2026
9b8c1ed
test(scripture-editor): stop the zoom-marker contract test tripping o…
rolfheij-sil Sep 17, 2026
e0a9fbc
docs(e2e): drop a one-test-per-file rule the project does not have
rolfheij-sil Sep 17, 2026
6a1158f
feat(settings): the zoom stepper's tooltips say why a press does noth…
rolfheij-sil Sep 17, 2026
9d3e175
docs(zoom): the app-wide zoom commands name the snap, and the catalog…
rolfheij-sil Sep 17, 2026
8225fbe
refactor(settings): rename PercentStepper to ZoomStepper
rolfheij-sil Sep 17, 2026
2811f62
refactor(renderer): name the window-input gate for what it answers
rolfheij-sil Sep 17, 2026
3e2f452
fix(zoom): mark the window blocked before the overlay paints
rolfheij-sil Sep 17, 2026
400d791
refactor(zoom): drop the window-blocking store's unused subscription …
rolfheij-sil Sep 17, 2026
c6639d8
test(zoom): close three gaps a mutation walked straight through
rolfheij-sil Sep 17, 2026
135883b
docs(zoom): correct what this round's own changes left stale
rolfheij-sil Sep 17, 2026
1a05073
fix(settings): a change with no writer is a failure, not a silent suc…
rolfheij-sil Sep 17, 2026
7200a3c
fix(settings): log a failed setting write
rolfheij-sil Sep 17, 2026
c82702f
fix(macos-menu): combine a contributed column with the platform menu …
rolfheij-sil Sep 17, 2026
b705518
feat(settings): the reset button says why it does nothing at the defa…
rolfheij-sil Sep 17, 2026
8e667d8
perf(web-view): place the content-zoom badge once per frame
rolfheij-sil Sep 17, 2026
99e3c1e
docs(scripture-editor): say what the Scripture text zoom area contains
rolfheij-sil Sep 17, 2026
016e960
test(settings, macos-menu): pin the error clear and the View-menu ord…
rolfheij-sil Sep 17, 2026
ef50db6
perf(web-view): apply Ctrl+wheel zoom once per frame
rolfheij-sil Sep 17, 2026
22353a2
chore(types): regenerate papi.d.ts for the app-scaling setting doc
rolfheij-sil Sep 17, 2026
516aba9
style(zoom): reflow the grace-period docs the restack rewrapped
rolfheij-sil Sep 17, 2026
c01c557
fix(web-view): a Ctrl+wheel burst that turns round flushes before it …
rolfheij-sil Sep 17, 2026
5cf8329
docs(adr): name the other view that still answers the zoom chords
rolfheij-sil Sep 17, 2026
6fa0bcf
test(macos-menu): pin the template copy against the growth it actuall…
rolfheij-sil Sep 17, 2026
e4dc8c8
test(zoom): pin the error clear and the layout-phase window block
rolfheij-sil Sep 17, 2026
1fb9739
test(settings): pin the stepper's baseline window from below
rolfheij-sil Sep 17, 2026
93851f8
fix(web-view): a pinch or line-mode wheel waits for the notches befor…
rolfheij-sil Sep 17, 2026
be6632d
docs(docking): say what the tab-menu cache key does and does not guar…
rolfheij-sil Sep 17, 2026
34a9d31
test(web-view): pin the range cap on a frame of notches, not just one…
rolfheij-sil Sep 17, 2026
fba9dce
fix(overlays): the workspace-updating cover traps keyboard focus like…
rolfheij-sil Sep 18, 2026
4369af1
test(docking): mock the interface-mode hook the tab title now reads
rolfheij-sil Sep 18, 2026
7731e7b
fix(web-view): a zoom chord hands pending wheel notches over before i…
rolfheij-sil Sep 18, 2026
1e77b97
fix(zoom): stop the macOS View menu from doubling "Toggle Full Screen"
rolfheij-sil Sep 22, 2026
6471b25
fix(settings): localize the 'not writable yet' settings error
rolfheij-sil Sep 22, 2026
99fb866
test(shortcuts): move the Zoom-category catalog checks next to the re…
rolfheij-sil Sep 22, 2026
fde6951
chore(zoom): regenerate platform-bible-utils, platform-bible-react an…
rolfheij-sil Sep 22, 2026
a40650d
test(zoom): the combined View menu no longer lists a hand-added full-…
rolfheij-sil Sep 22, 2026
c8ae233
fix(overlays): hand focus to the active pane when the project-switch …
rolfheij-sil Sep 22, 2026
82f394c
chore(zoom): regenerate platform-bible-react dist after rebasing onto…
rolfheij-sil Sep 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .context/research/paratext-9-features/00_Master_Feature_Index.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Paratext 9 - Master Feature Index (v2)

**Version**: 3.8
**Date**: January 22, 2026
**Total Features**: 152 features across 16 categories
**Version**: 3.9
**Date**: September 15, 2026
**Total Features**: 153 features across 16 categories
**Methodology**: Six-source validation (MS, FR, R, M, H, C)

---
Expand Down Expand Up @@ -59,6 +59,7 @@
| 1.15 | Autocorrect | MS C |
| 1.16 | Text Normalization Utilities | MS |
| 1.17 | Editor Real-time Validation | MS M H C |
| 1.18 | Pane Zoom | MS H C |

---

Expand Down Expand Up @@ -442,6 +443,7 @@
- **Offline Support** → 16.7

### P
- **Pane Zoom** → 1.18
- **Parallel Passages Tool** → 9.2
- **Paratext Live (Real-time Collaboration)** → 10.3
- **Plugin System** → 14.1
Expand Down Expand Up @@ -536,13 +538,13 @@
## Statistics

- **Total Categories**: 16
- **Total Features**: 152
- **Total Features**: 153

**Features by validation level:**
- 6 sources: 23 features
- 5 sources: 27 features
- 4 sources: 36 features
- 3 sources: 28 features
- 3 sources: 29 features
- 2 sources: 18 features
- 1 source: 20 features

Expand All @@ -552,6 +554,7 @@

| Ver | Date | Changes |
|-----|------|---------|
| v3.9 | 2026-09-15 | Added 1.18 Pane Zoom (≡ Tab > View > Zoom; `FocusedPaneZoom`/`SecondaryViewZooms`, `FormZoomer`, `HtmlZoomHelper`, `DefaultZoomMemento`, `CommentListForm` body zoom) and corrected 2.3's "Font size and zoom controls" bullet, which pointed at the project font size rather than at pane zoom; total now 153 features |
| v3.8 | 2026-01-22 | Validation pass: fixed 13.10 sources (added C); updated statistics |
| v3.7 | 2026-01-22 | Added 2.10 Vertical Script Support based on source code analysis (supports traditional Mongolian and other vertical scripts); total now 152 features |
| v3.6 | 2026-01-22 | Added 3 features from HelpData coverage audit: 2.9 Encoding Converter, 11.9 Translation Priorities; expanded 13.10 Project Conversion (MS→MS FR H); total now 151 features |
Expand Down
55 changes: 55 additions & 0 deletions .context/research/paratext-9-features/01_Translation_Workspace.md
Original file line number Diff line number Diff line change
Expand Up @@ -1143,6 +1143,60 @@ investigation):

---

### 1.18 Pane Zoom (View > Zoom)

**Description**: Scale the text of the focused pane of a text window without changing the window's chrome, menus or toolbars. Zoom is per pane, not per window: the footnote pane of a Scripture text window keeps a zoom of its own, and the level is remembered per project and per window type between sessions. This is the display-size control users reach for; it is distinct from the project font size set in Language Settings (2.3), which is a project-wide property of the text itself.

**Sub-Features**:
- Zoom in / zoom out / actual size on the focused pane, from the ≡ Tab > View > Zoom menu and from Ctrl + Plus / Minus / Zero
- Discrete zoom steps (0.25× through 4.0×) with the current percentage shown in the menu
- The Scripture text window's footnote pane zooms separately from its text pane
- The level is remembered per project and per window type, and restored when the window reopens
- Comment/note list windows zoom their HTML body the same way

**Sources**:

| Source | Reference | Status |
|--------|-----------|--------|
| Menu Structure | Menu: `≡ Tab > View > Zoom`; Item: `zoomToolStripMenuItem` (a `ZoomMenuItem`); Owner: `TextForm` | `[MS]` |
| HelpData | Keyword: "How do I change the size at which a text is displayed?" | `[H]` |
| Code | `IZoomable` implemented by the zoomable windows; `FormZoomer` interprets the keyboard chords; `DefaultZoomMemento` persists the level | `[C]` |

**Implementation**:

| Depth | File | Found Via | Evidence |
|-------|------|-----------|----------|
| 0 | `Paratext/TextForm.Designer.cs` | Menu Structure | `zoomToolStripMenuItem = new Paratext.Base.MegaMenu.ZoomMenuItem()`, `Text = "Zoom"`, `ShortcutKeyDisplayString = "Ctrl + Plus/Minus/Zero"` |
| 0 | `Paratext/TextForm.cs` | Owner of D0 | delegates `Zoom` to `uiScriptureEditor.FocusedPaneZoom`; saves and restores `SecondaryViewZooms` |
| 1 | `ParatextBase/MegaMenu/MegaMenu.cs` | Hosts D0 | `IZoomable zoomProvider`, the `zoomSteps` ladder (0.25 … 4.0), `ZoomString` for the displayed percentage |
| 1 | `ParatextBase/MegaMenu/ZoomMenuItem.cs` | Class of D0 | the menu item itself |
| 1 | `PtxUtils.UI/IZoomable.cs` | Interface in D0/D1 | the `Zoom` contract every zoomable window implements |
| 1 | `PtxUtils.UI/Winforms/FormZoomer.cs` | Keyboard path | `ZoomAction { Larger, Smaller, Actual, NoAction }`, `InterpretKeyCode(Keys)` |
| 1 | `ParatextBase/ScriptureEditor/UsfmMultiPaneControl.cs` | Field in D0 | `FocusedPaneZoom` (the focused pane), `SecondaryViewZooms` (the footnote pane's own levels) |
| 2 | `ParatextBase/ScriptureEditor/UsfmSinglePaneControl.cs` | Owned by D1 | regenerates the pane stylesheet per zoom via `usfmXhtmlConverter.GetCss(Zoom, …)` |
| 2 | `HtmlEditor/HtmlZoomHelper.cs` | HTML-hosted windows | `Setup(IHtmlEditorAdaptor, IZoomable)`, `ZoomChanged` — the zoom path for HTML-rendered bodies |
| 2 | `ParatextBase/DefaultZoomMemento.cs` | Persistence | `SaveZoom(ScrText, formName, zoom)`, `GetZoom(ScrText, formName)`, `ResetZoom(ScrText)` over a `SerializableDictionary<string, double>` |
| 2 | `Paratext/TextFormMemento.cs` | Persistence | `Zoom` and `SecondaryViewZooms` restored with the window |
| 2 | `Paratext/ProjectComments/CommentListForm.cs` | Variant | implements `IZoomable` and zooms its list body through `HtmlZoomHelper.Setup(listControl.HtmlEditor, listControl)`; persisted in its own memento |

**UI Entry Points**:
- ≡ Tab > View > Zoom (shows the current percentage; zoom in / out / actual size)
- Menu Structure: `TextForm`, item `zoomToolStripMenuItem`
- File: `Paratext/TextForm.Designer.cs`
- Ctrl + Plus / Ctrl + Minus / Ctrl + 0 on the focused pane
- File: `PtxUtils.UI/Winforms/FormZoomer.cs`

**Related Features**:
- 1.1 Text Editor - the panes that zoom
- 1.2 Editor Views - zoom applies to every view mode
- 1.11 Insert Footnotes & Endnotes - the footnote pane that zooms separately
- 2.3 Font Management (OpenType/Graphite) - the **project** font size, a different control; zoom scales on top of it
- 10.4 Project Notes - the comment/note list windows that zoom their HTML body

**Validation**: [MS] - - - [H] [C] — Last verified: 2026-09-15

---

## Cross-References

**Related Categories**:
Expand Down Expand Up @@ -1175,6 +1229,7 @@ investigation):
| 1.15 Autocorrect | ✓ | - | - | - | ✓ | ✓ | 2026-01-20 |
| 1.16 Text Normalization | ✓ | - | - | - | - | ✓ | 2026-01-21 |
| 1.17 Editor Real-time Validation | ✓ | - | - | ✓ | ✓ | ✓ | 2026-01-22 |
| 1.18 Pane Zoom | ✓ | - | - | - | ✓ | ✓ | 2026-09-15 |
## Notes

- FormattedEditor is at repo root (`FormattedEditor/`), not under `Paratext/`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
**Focus**: Keyboards, fonts, locale data, Unicode handling
**User Roles**: All users (configuration by administrators)
**Manual Chapters**: 4 (Keyboarding)
**Last Updated**: 2026-01-22
**Last Updated**: 2026-09-15

---

Expand Down Expand Up @@ -130,7 +130,9 @@ Language and writing system features enable Paratext to support the world's lang
- Graphite font rendering (SIL Graphite)
- Per-project font assignment
- Font feature configuration
- Font size and zoom controls
- Per-project font size (the project-wide text size set here; the per-pane display zoom is a separate control — see 1.18 Pane Zoom)

> **Not the same as zoom.** This dialog sets the project's font and font *size*, a property of the project that travels with it. Scaling what one pane shows on screen is a separate feature — ≡ Tab > View > Zoom, remembered per pane and per project — catalogued as **1.18 Pane Zoom** in `01_Translation_Workspace.md`.

**Sources**:

Expand Down Expand Up @@ -181,7 +183,7 @@ Language and writing system features enable Paratext to support the world's lang
**HelpData Items**:
- ID: `1af5d594-c397-4cc4-be27-5e88759c6d27` - "How do I change the font used for my project?"
- ID: `0b4bf85c-5cc8-428c-960c-f610f1796ad6` - "How do I choose font features for Graphite fonts?"
- ID: `7e6a26d9-899a-4a6f-b3b8-aca642044750` - "How do I change the size at which a text is displayed?"
- ID: `7e6a26d9-899a-4a6f-b3b8-aca642044750` - "How do I change the size at which a text is displayed?" (display size — see 1.18 Pane Zoom)
- ID: `63426c4c-a463-4718-b80e-fc875c0e8507` - "Guide: Project > Project settings > Language settings: Font"
- Dialogs: `LanguageSettingsForm_tabFont`, `LanguageSettingsForm_tabGraphite`

Expand Down
Loading
Loading