/// The typefaces bundled with the client (spec 8.2: the reader chooses). /// Pure data, shared by the settings page that offers them and the renderer /// that applies them. library; /// One bundled family: the name used in pubspec.yaml and stored in settings, /// the id of its display name in the locale file, and where to look when it /// has no glyph for a character. typedef ReaderFont = ({String family, String labelId, List fallback}); /// Offered in this order: the two sans faces first, then the two serifs. /// Adding a font is four files in assets/fonts, one `fonts` entry in /// pubspec.yaml, one entry here, one label in the locale file, and its licence /// beside the files. /// /// Each face names where to look for a character it has no glyph for. Hebrew /// comes from a bundled Hebrew face, matched to the shape of the chosen one, /// so it never depends on what the device happens to have installed. The /// serifs also cover Greek, Cyrillic and a wide Latin range, so each falls /// back to the other; the sans faces are narrow and have no bundled sans to /// turn to, so for those the platform answers, and it answers a sans with a /// sans. Scripts nothing here covers, such as Arabic and the CJK languages, /// always come from the platform. const readerFonts = [ ( family: 'Atkinson Hyperlegible', labelId: 'settings-font-atkinson', fallback: [hebrewSans], ), ( family: 'Luciole', labelId: 'settings-font-luciole', fallback: [hebrewSans], ), ( family: 'Literata', labelId: 'settings-font-literata', fallback: ['Charis SIL', hebrewSerif], ), ( family: 'Charis SIL', labelId: 'settings-font-charis', fallback: ['Literata', hebrewSerif], ), ]; /// Bundled to be fallen back on, never offered: the reader picks a face for /// the Latin text they are reading, and Hebrew follows its shape. const hebrewSans = 'Noto Sans Hebrew'; const hebrewSerif = 'Noto Serif Hebrew'; const defaultFontFamily = 'Atkinson Hyperlegible'; /// Where to look after [family], or nothing when it is not one of ours. List fallbackFor(String family) { for (final font in readerFonts) { if (font.family == family) return font.fallback; } return const []; }