From 456327339642d9e6d579dad17c60cbda3dc385a8 Mon Sep 17 00:00:00 2001 From: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:00:54 +0100 Subject: [PATCH] Merge pull request #21680 from overleaf/rd-dyslexic-font Add OpenDyslexic Mono typeface font to the source editor GitOrigin-RevId: 8826e51cfa50f1d5ffc2217fb86fb4d1dec21b92 --- .../web/frontend/extracted-translations.json | 2 + services/web/frontend/fonts/README.md | 1 + services/web/frontend/fonts/build-fonts.mjs | 8 ++ .../frontend/fonts/open-dyslexic-mono/OFL.txt | 94 ++++++++++++++++++ .../OpenDyslexicMono-Regular.woff2 | Bin 0 -> 32516 bytes .../open-dyslexic-mono/open-dyslexic-mono.css | 6 ++ .../settings/settings-font-family.tsx | 58 ++++++++--- .../js/features/history/extensions/theme.ts | 3 +- .../source-editor/extensions/theme.ts | 3 +- .../stylesheets/app/editor/left-menu.less | 14 +++ .../stylesheets/bootstrap-5/main-style.scss | 1 + .../bootstrap-5/pages/editor/left-menu.scss | 14 +++ .../web/frontend/stylesheets/main-style.less | 1 + services/web/locales/en.json | 2 + .../editor-left-menu.spec.tsx | 3 +- .../settings/settings-font-family.test.tsx | 5 + 16 files changed, 196 insertions(+), 19 deletions(-) create mode 100644 services/web/frontend/fonts/open-dyslexic-mono/OFL.txt create mode 100644 services/web/frontend/fonts/open-dyslexic-mono/OpenDyslexicMono-Regular.woff2 create mode 100644 services/web/frontend/fonts/open-dyslexic-mono/open-dyslexic-mono.css diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 80abedb18d..ddccaff26b 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -215,6 +215,7 @@ "clear_cached_files": "", "clear_search": "", "click_here_to_view_sl_in_lng": "", + "click_to_give_feedback": "", "clicking_delete_will_remove_sso_config_and_clear_saml_data": "", "clone_with_git": "", "close": "", @@ -934,6 +935,7 @@ "new_compile_domain_notice": "", "new_file": "", "new_folder": "", + "new_font_open_dyslexic": "", "new_name": "", "new_password": "", "new_project": "", diff --git a/services/web/frontend/fonts/README.md b/services/web/frontend/fonts/README.md index 9f08062694..c07309c0a1 100644 --- a/services/web/frontend/fonts/README.md +++ b/services/web/frontend/fonts/README.md @@ -7,6 +7,7 @@ This directory contains fonts used by the Overleaf web application. * [Merriweather](https://github.com/SorkinType/Merriweather) * [Noto Sans](https://notofonts.github.io/#latin-greek-cyrillic) * [Noto Serif](https://notofonts.github.io/#latin-greek-cyrillic) +* [OpenDyslexic Mono](https://github.com/antijingoist/opendyslexic/tree/master) * [Open Sans](https://github.com/googlefonts/opensans) * [Source Code Pro](https://github.com/adobe-fonts/source-code-pro) * [STIX Two Math](https://github.com/stipub/stixfonts/) diff --git a/services/web/frontend/fonts/build-fonts.mjs b/services/web/frontend/fonts/build-fonts.mjs index 4d5231d54c..8387509132 100644 --- a/services/web/frontend/fonts/build-fonts.mjs +++ b/services/web/frontend/fonts/build-fonts.mjs @@ -71,6 +71,14 @@ const families = [ license: 'https://raw.githubusercontent.com/notofonts/latin-greek-cyrillic/refs/heads/main/OFL.txt', }, + { + folder: 'open-dyslexic-mono', + url: 'https://github.com/antijingoist/opendyslexic', + fonts: [ + 'https://github.com/antijingoist/open-dyslexic/blob/master/otf/OpenDyslexicMono-Regular.otf', + ], + license: 'https://github.com/antijingoist/opendyslexic/blob/master/OFL.txt', + }, { folder: 'open-sans', url: 'https://github.com/googlefonts/opensans', diff --git a/services/web/frontend/fonts/open-dyslexic-mono/OFL.txt b/services/web/frontend/fonts/open-dyslexic-mono/OFL.txt new file mode 100644 index 0000000000..bb867823f2 --- /dev/null +++ b/services/web/frontend/fonts/open-dyslexic-mono/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2019-07-29, Abbie Gonzalez (https://abbiecod.es|support@abbiecod.es), +with Reserved Font Name OpenDyslexic. +Copyright (c) 12/2012 - 2019 +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/services/web/frontend/fonts/open-dyslexic-mono/OpenDyslexicMono-Regular.woff2 b/services/web/frontend/fonts/open-dyslexic-mono/OpenDyslexicMono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..19583fabd29d826a966ae1144c311ed4dcd011a3 GIT binary patch literal 32516 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 literal 0 HcmV?d00001 diff --git a/services/web/frontend/fonts/open-dyslexic-mono/open-dyslexic-mono.css b/services/web/frontend/fonts/open-dyslexic-mono/open-dyslexic-mono.css new file mode 100644 index 0000000000..b0e01c800d --- /dev/null +++ b/services/web/frontend/fonts/open-dyslexic-mono/open-dyslexic-mono.css @@ -0,0 +1,6 @@ +@font-face { + font-family: 'OpenDyslexic Mono'; + src: url('./OpenDyslexicMono-Regular.woff2') format('woff2'); + font-style: normal; + font-weight: normal; +} diff --git a/services/web/frontend/js/features/editor-left-menu/components/settings/settings-font-family.tsx b/services/web/frontend/js/features/editor-left-menu/components/settings/settings-font-family.tsx index e239e509b7..21e2117edd 100644 --- a/services/web/frontend/js/features/editor-left-menu/components/settings/settings-font-family.tsx +++ b/services/web/frontend/js/features/editor-left-menu/components/settings/settings-font-family.tsx @@ -2,27 +2,53 @@ import { useTranslation } from 'react-i18next' import { FontFamily } from '../../../source-editor/extensions/theme' import { useProjectSettingsContext } from '../../context/project-settings-context' import SettingsMenuSelect from './settings-menu-select' +import OLTooltip from '@/features/ui/components/ol/ol-tooltip' +import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher' +import MaterialIcon from '@/shared/components/material-icon' export default function SettingsFontFamily() { const { t } = useTranslation() const { fontFamily, setFontFamily } = useProjectSettingsContext() return ( - - onChange={setFontFamily} - value={fontFamily} - options={[ - { - value: 'monaco', - label: 'Monaco / Menlo / Consolas', - }, - { - value: 'lucida', - label: 'Lucida / Source Code Pro', - }, - ]} - label={t('font_family')} - name="fontFamily" - /> +

+ + onChange={setFontFamily} + value={fontFamily} + options={[ + { + value: 'monaco', + label: 'Monaco / Menlo / Consolas', + }, + { + value: 'lucida', + label: 'Lucida / Source Code Pro', + }, + { + value: 'opendyslexicmono', + label: 'OpenDyslexic Mono', + }, + ]} + label={t('font_family')} + name="fontFamily" + /> + + + } + bs5={} + /> + + +
) } diff --git a/services/web/frontend/js/features/history/extensions/theme.ts b/services/web/frontend/js/features/history/extensions/theme.ts index 6bf83e98ea..fda9c3185b 100644 --- a/services/web/frontend/js/features/history/extensions/theme.ts +++ b/services/web/frontend/js/features/history/extensions/theme.ts @@ -1,7 +1,7 @@ import { EditorView } from '@codemirror/view' import { Compartment, TransactionSpec } from '@codemirror/state' -export type FontFamily = 'monaco' | 'lucida' +export type FontFamily = 'monaco' | 'lucida' | 'opendyslexicmono' export type LineHeight = 'compact' | 'normal' | 'wide' export type Options = { @@ -26,6 +26,7 @@ export const lineHeights: Record = { const fontFamilies: Record = { monaco: ['Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'monospace'], lucida: ['Lucida Console', 'Source Code Pro', 'monospace'], + opendyslexicmono: ['OpenDyslexic Mono', 'monospace'], } const createThemeFromOptions = ({ diff --git a/services/web/frontend/js/features/source-editor/extensions/theme.ts b/services/web/frontend/js/features/source-editor/extensions/theme.ts index 4988743f00..f38289cce2 100644 --- a/services/web/frontend/js/features/source-editor/extensions/theme.ts +++ b/services/web/frontend/js/features/source-editor/extensions/theme.ts @@ -8,7 +8,7 @@ const optionsThemeConf = new Compartment() const selectedThemeConf = new Compartment() export const themeOptionsChange = Annotation.define() -export type FontFamily = 'monaco' | 'lucida' +export type FontFamily = 'monaco' | 'lucida' | 'opendyslexicmono' export type LineHeight = 'compact' | 'normal' | 'wide' export type OverallTheme = '' | 'light-' @@ -62,6 +62,7 @@ export const lineHeights: Record = { const fontFamilies: Record = { monaco: ['Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'monospace'], lucida: ['Lucida Console', 'Source Code Pro', 'monospace'], + opendyslexicmono: ['OpenDyslexic Mono', 'monospace'], } const createThemeFromOptions = ({ diff --git a/services/web/frontend/stylesheets/app/editor/left-menu.less b/services/web/frontend/stylesheets/app/editor/left-menu.less index f84ccc4cf7..6708783ac4 100644 --- a/services/web/frontend/stylesheets/app/editor/left-menu.less +++ b/services/web/frontend/stylesheets/app/editor/left-menu.less @@ -146,6 +146,20 @@ } } + .left-menu-setting-position { + position: relative; + + .left-menu-setting { + margin-top: 0 !important; + } + + .left-menu-setting-icon { + position: absolute; + right: 65%; + top: 25%; + } + } + .left-menu-setting { padding: 0 9px; display: flex; diff --git a/services/web/frontend/stylesheets/bootstrap-5/main-style.scss b/services/web/frontend/stylesheets/bootstrap-5/main-style.scss index 62459a9514..eb705b461d 100644 --- a/services/web/frontend/stylesheets/bootstrap-5/main-style.scss +++ b/services/web/frontend/stylesheets/bootstrap-5/main-style.scss @@ -5,6 +5,7 @@ @import '../../fonts/source-code-pro/source-code-pro.css'; @import '../../fonts/STIXTwoMath/stix-two-math.css'; @import '../../fonts/noto-serif/noto-serif.css'; +@import '../../fonts/open-dyslexic-mono/open-dyslexic-mono.css'; @import '../../fonts/material-symbols/material-symbols.css'; @import '../../fonts/font-awesome/font-awesome.css'; diff --git a/services/web/frontend/stylesheets/bootstrap-5/pages/editor/left-menu.scss b/services/web/frontend/stylesheets/bootstrap-5/pages/editor/left-menu.scss index b4cb7b909b..0711652c8e 100644 --- a/services/web/frontend/stylesheets/bootstrap-5/pages/editor/left-menu.scss +++ b/services/web/frontend/stylesheets/bootstrap-5/pages/editor/left-menu.scss @@ -129,6 +129,20 @@ } } + .left-menu-setting-position { + position: relative; + + .left-menu-setting { + margin-top: 0 !important; + } + + .left-menu-setting-icon { + position: absolute; + right: 65%; + top: 30%; + } + } + .left-menu-setting { padding: 0 var(--spacing-02); display: flex; diff --git a/services/web/frontend/stylesheets/main-style.less b/services/web/frontend/stylesheets/main-style.less index 81651dfb9b..ac6f36646a 100644 --- a/services/web/frontend/stylesheets/main-style.less +++ b/services/web/frontend/stylesheets/main-style.less @@ -5,6 +5,7 @@ @import (less) '../fonts/source-code-pro/source-code-pro.css'; @import (less) '../fonts/STIXTwoMath/stix-two-math.css'; @import (less) '../fonts/noto-serif/noto-serif.css'; +@import (less) '../fonts/open-dyslexic-mono/open-dyslexic-mono.css'; @import (less) '../fonts/material-symbols/material-symbols.css'; @is-overleaf-light: false; diff --git a/services/web/locales/en.json b/services/web/locales/en.json index ba2734c919..89bf1dfc9c 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -289,6 +289,7 @@ "clearing": "Clearing", "click_here_to_view_sl_in_lng": "Click here to use __appName__ in <0>__lngName__", "click_link_to_proceed": "Click __clickText__ below to proceed.", + "click_to_give_feedback": "Click to give feedback.", "clicking_delete_will_remove_sso_config_and_clear_saml_data": "Clicking <0>Delete will remove your SSO configuration and unlink all users. You can only do this when SSO is disabled in your Group settings.", "clone_with_git": "Clone with Git", "close": "Close", @@ -1328,6 +1329,7 @@ "new_compile_domain_notice": "We’ve recently migrated PDF downloads to a new domain. Something might be blocking your browser from accessing that new domain, <0>__compilesUserContentDomain__. This could be caused by network blocking or a strict browser plugin rule. Please follow our <1>troubleshooting guide.", "new_file": "New file", "new_folder": "New folder", + "new_font_open_dyslexic": "New font: OpenDyslexic Mono is designed to improve readability for those with dyslexia.", "new_name": "New Name", "new_password": "New Password", "new_project": "New Project", diff --git a/services/web/test/frontend/components/editor-left-menu/editor-left-menu.spec.tsx b/services/web/test/frontend/components/editor-left-menu/editor-left-menu.spec.tsx index 56eedfc462..2e465cb12f 100644 --- a/services/web/test/frontend/components/editor-left-menu/editor-left-menu.spec.tsx +++ b/services/web/test/frontend/components/editor-left-menu/editor-left-menu.spec.tsx @@ -729,12 +729,13 @@ describe('', function () { cy.get('#settings-menu-fontFamily option').then( options => { const values = [...options].map(o => o.value) - expect(values).to.deep.eq(['monaco', 'lucida']) + expect(values).to.deep.eq(['monaco', 'lucida', 'opendyslexicmono']) const texts = [...options].map(o => o.text) expect(texts).to.deep.eq([ 'Monaco / Menlo / Consolas', 'Lucida / Source Code Pro', + 'OpenDyslexic Mono', ]) } ) diff --git a/services/web/test/frontend/features/editor-left-menu/components/settings/settings-font-family.test.tsx b/services/web/test/frontend/features/editor-left-menu/components/settings/settings-font-family.test.tsx index 651006cbce..02ba0919f2 100644 --- a/services/web/test/frontend/features/editor-left-menu/components/settings/settings-font-family.test.tsx +++ b/services/web/test/frontend/features/editor-left-menu/components/settings/settings-font-family.test.tsx @@ -19,5 +19,10 @@ describe('', function () { const optionLucida = within(select).getByText('Lucida / Source Code Pro') expect(optionLucida.getAttribute('value')).to.equal('lucida') + + const optionOpenDyslexicMono = within(select).getByText('OpenDyslexic Mono') + expect(optionOpenDyslexicMono.getAttribute('value')).to.equal( + 'opendyslexicmono' + ) }) })