diff --git a/src/components/Editor.js b/src/components/Editor.js index 7510ac9..c255044 100644 --- a/src/components/Editor.js +++ b/src/components/Editor.js @@ -16,6 +16,14 @@ export default function Editor({ content, setContent, contentType }) { return 'dark'; } }); + const [fontSize, setFontSize] = useState(() => { + const preference = ls.get('fontsize'); + if (preference && preference >= 10 && preference <= 22) { + return preference; + } else { + return 16; + } + }); useEffect(() => { if (theme === 'dark') { @@ -23,7 +31,15 @@ export default function Editor({ content, setContent, contentType }) { } else { ls.set('theme', theme); } - }, [theme]) + }, [theme]); + + useEffect(() => { + if (fontSize === 16) { + ls.remove('fontsize'); + } else { + ls.set('fontsize', fontSize); + } + }, [fontSize]); useEffect(() => { if (contentType) { @@ -31,10 +47,22 @@ export default function Editor({ content, setContent, contentType }) { } }, [contentType]); + function zoom(delta) { + const result = fontSize + delta; + if (result && result >= 10 && result <= 22) { + setFontSize(result); + } + } + return <> - - + + } diff --git a/src/components/EditorControls.js b/src/components/EditorControls.js index 4072515..46422f4 100644 --- a/src/components/EditorControls.js +++ b/src/components/EditorControls.js @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useCallback } from 'react'; import styled from 'styled-components'; import { gzip } from 'pako'; import history from 'history/browser'; @@ -8,7 +8,7 @@ import { MenuButton, Button } from './Menu'; import { languageIds } from '../highlighting'; import themes from '../style/themes'; -export default function EditorControls({ code, setCode, language, setLanguage, theme, setTheme }) { +export default function EditorControls({ code, setCode, language, setLanguage, theme, setTheme, zoom }) { const [saving, setSaving] = useState(false); const [recentlySaved, setRecentlySaved] = useState(false); @@ -16,22 +16,7 @@ export default function EditorControls({ code, setCode, language, setLanguage, t setRecentlySaved(false); }, [code, language]) - useEffect(() => { - const listener = (e) => { - if ((e.ctrlKey || e.metaKey)) { - if (e.key === 's' || e.key === 'S') { - e.preventDefault(); - save(); - } - } - } - - window.addEventListener('keydown', listener); - return () => window.removeEventListener('keydown', listener); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - function save() { + const save = useCallback(() => { if (!code || recentlySaved) { return; } @@ -45,7 +30,26 @@ export default function EditorControls({ code, setCode, language, setLanguage, t copy(window.location.href); document.title = 'paste | ' + pasteId; }); - } + }, [code, language, recentlySaved]); + + useEffect(() => { + const listener = (e) => { + if ((e.ctrlKey || e.metaKey)) { + if (e.key === 's' || e.key === 'S') { + e.preventDefault(); + save(); + } + + if (e.key === '=' || e.key === '-') { + e.preventDefault(); + zoom(e.key === '=' ? 1 : -1); + } + } + } + + window.addEventListener('keydown', listener); + return () => window.removeEventListener('keydown', listener); + }, [save, zoom]); function reset() { setCode(''); @@ -69,6 +73,8 @@ export default function EditorControls({ code, setCode, language, setLanguage, t
+ +
@@ -85,6 +91,7 @@ const Header = styled.header` background: ${props => props.theme.secondary}; display: flex; justify-content: space-between; + user-select: none; `; const Section = styled.div` diff --git a/src/components/EditorTextArea.js b/src/components/EditorTextArea.js index 164a6b0..31607ac 100644 --- a/src/components/EditorTextArea.js +++ b/src/components/EditorTextArea.js @@ -3,7 +3,7 @@ import ReactEditor from 'react-simple-code-editor'; import EditorPrismStyle from './EditorPrismStyle'; import { getHighlighter } from '../highlighting'; -export default function EditorTextArea({ code, setCode, language }) { +export default function EditorTextArea({ code, setCode, language, fontSize }) { const highlight = getHighlighter(language); function highlightWithLineNumbers(input, grammar) { @@ -21,6 +21,7 @@ export default function EditorTextArea({ code, setCode, language }) { highlight={highlightWithLineNumbers} placeholder={'Type some code...'} padding={10} + size={fontSize} textareaId='code-area' /> @@ -29,9 +30,9 @@ export default function EditorTextArea({ code, setCode, language }) { const StyledReactEditor = styled(ReactEditor)` counter-reset: line; - font-size: 16px; + font-size: ${props => props.size}px; outline: 0; - min-height: calc(100vh - 2em); + min-height: calc(100vh - 2rem); #code-area { outline: none;