Part of the compose rich-formatting epic — stacked on the rich-text foundation ticket (branch feat-richtext-foundation), which provides RichStyle.FontFamily(css) + serialization + the editor's font-resolver hook.
Scope
New res/font/ bundling 4 open-source fonts fetched from their official upstreams: Inter, Lora, Merriweather, JetBrains Mono (all SIL OFL 1.1). Commit the OFL license texts under THIRD_PARTY_LICENSES/; keep the total ≲2 MB (prefer variable fonts or regular+bold cuts). No build-time downloads (F-Droid-safe).
Font registry mapping display name ↔ email-safe CSS stack (e.g. 'Lora', Georgia, serif) ↔ Compose FontFamily; include generic Sans/Serif/Monospace entries that need no bundled file.
Toolbar dropdown (new ui/compose/format/FontPicker.kt) applying RichStyle.FontFamily(css) to the selection; "Default" clears it. Pass a real font resolver into RichTextBodyField so styled runs render in-editor.
Acceptance
CSS stack survives serialize→parse round-trip; picker reflects the selection's current font; androidTest for the picker; license texts present; recipients without the font fall back down the CSS stack.
Part of the compose rich-formatting epic — stacked on the rich-text foundation ticket (branch `feat-richtext-foundation`), which provides `RichStyle.FontFamily(css)` + serialization + the editor's font-resolver hook.
**Scope**
- New `res/font/` bundling 4 open-source fonts fetched from their official upstreams: **Inter, Lora, Merriweather, JetBrains Mono** (all SIL OFL 1.1). Commit the OFL license texts under `THIRD_PARTY_LICENSES/`; keep the total ≲2 MB (prefer variable fonts or regular+bold cuts). No build-time downloads (F-Droid-safe).
- Font registry mapping display name ↔ email-safe CSS stack (e.g. `'Lora', Georgia, serif`) ↔ Compose `FontFamily`; include generic Sans/Serif/Monospace entries that need no bundled file.
- Toolbar dropdown (new `ui/compose/format/FontPicker.kt`) applying `RichStyle.FontFamily(css)` to the selection; "Default" clears it. Pass a real font resolver into `RichTextBodyField` so styled runs render in-editor.
**Acceptance**
- CSS stack survives serialize→parse round-trip; picker reflects the selection's current font; androidTest for the picker; license texts present; recipients without the font fall back down the CSS stack.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of the compose rich-formatting epic — stacked on the rich-text foundation ticket (branch
feat-richtext-foundation), which providesRichStyle.FontFamily(css)+ serialization + the editor's font-resolver hook.Scope
res/font/bundling 4 open-source fonts fetched from their official upstreams: Inter, Lora, Merriweather, JetBrains Mono (all SIL OFL 1.1). Commit the OFL license texts underTHIRD_PARTY_LICENSES/; keep the total ≲2 MB (prefer variable fonts or regular+bold cuts). No build-time downloads (F-Droid-safe).'Lora', Georgia, serif) ↔ ComposeFontFamily; include generic Sans/Serif/Monospace entries that need no bundled file.ui/compose/format/FontPicker.kt) applyingRichStyle.FontFamily(css)to the selection; "Default" clears it. Pass a real font resolver intoRichTextBodyFieldso styled runs render in-editor.Acceptance