zoom controls
This commit is contained in:
@@ -16,6 +16,14 @@ export default function Editor({ content, setContent, contentType }) {
|
|||||||
return 'dark';
|
return 'dark';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
const [fontSize, setFontSize] = useState(() => {
|
||||||
|
const preference = ls.get('fontsize');
|
||||||
|
if (preference && preference >= 10 && preference <= 22) {
|
||||||
|
return preference;
|
||||||
|
} else {
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (theme === 'dark') {
|
if (theme === 'dark') {
|
||||||
@@ -23,7 +31,15 @@ export default function Editor({ content, setContent, contentType }) {
|
|||||||
} else {
|
} else {
|
||||||
ls.set('theme', theme);
|
ls.set('theme', theme);
|
||||||
}
|
}
|
||||||
}, [theme])
|
}, [theme]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (fontSize === 16) {
|
||||||
|
ls.remove('fontsize');
|
||||||
|
} else {
|
||||||
|
ls.set('fontsize', fontSize);
|
||||||
|
}
|
||||||
|
}, [fontSize]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (contentType) {
|
if (contentType) {
|
||||||
@@ -31,10 +47,22 @@ export default function Editor({ content, setContent, contentType }) {
|
|||||||
}
|
}
|
||||||
}, [contentType]);
|
}, [contentType]);
|
||||||
|
|
||||||
|
function zoom(delta) {
|
||||||
|
const result = fontSize + delta;
|
||||||
|
if (result && result >= 10 && result <= 22) {
|
||||||
|
setFontSize(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
<ThemeProvider theme={themes[theme]}>
|
<ThemeProvider theme={themes[theme]}>
|
||||||
<EditorControls code={content} setCode={setContent} language={language} setLanguage={setLanguage} theme={theme} setTheme={setTheme} />
|
<EditorControls
|
||||||
<EditorTextArea code={content} setCode={setContent} language={language} />
|
code={content} setCode={setContent}
|
||||||
|
language={language} setLanguage={setLanguage}
|
||||||
|
theme={theme} setTheme={setTheme}
|
||||||
|
zoom={zoom}
|
||||||
|
/>
|
||||||
|
<EditorTextArea code={content} setCode={setContent} language={language} fontSize={fontSize} />
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect, useCallback } from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { gzip } from 'pako';
|
import { gzip } from 'pako';
|
||||||
import history from 'history/browser';
|
import history from 'history/browser';
|
||||||
@@ -8,7 +8,7 @@ import { MenuButton, Button } from './Menu';
|
|||||||
import { languageIds } from '../highlighting';
|
import { languageIds } from '../highlighting';
|
||||||
import themes from '../style/themes';
|
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 [saving, setSaving] = useState(false);
|
||||||
const [recentlySaved, setRecentlySaved] = useState(false);
|
const [recentlySaved, setRecentlySaved] = useState(false);
|
||||||
|
|
||||||
@@ -16,22 +16,7 @@ export default function EditorControls({ code, setCode, language, setLanguage, t
|
|||||||
setRecentlySaved(false);
|
setRecentlySaved(false);
|
||||||
}, [code, language])
|
}, [code, language])
|
||||||
|
|
||||||
useEffect(() => {
|
const save = useCallback(() => {
|
||||||
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() {
|
|
||||||
if (!code || recentlySaved) {
|
if (!code || recentlySaved) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -45,8 +30,27 @@ export default function EditorControls({ code, setCode, language, setLanguage, t
|
|||||||
copy(window.location.href);
|
copy(window.location.href);
|
||||||
document.title = 'paste | ' + pasteId;
|
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() {
|
function reset() {
|
||||||
setCode('');
|
setCode('');
|
||||||
setLanguage('plain');
|
setLanguage('plain');
|
||||||
@@ -69,6 +73,8 @@ export default function EditorControls({ code, setCode, language, setLanguage, t
|
|||||||
<MenuButton label="language" value={language} setValue={setLanguage} ids={languageIds} />
|
<MenuButton label="language" value={language} setValue={setLanguage} ids={languageIds} />
|
||||||
</Section>
|
</Section>
|
||||||
<Section>
|
<Section>
|
||||||
|
<Button onClick={() => zoom(1)}>[+ </Button>
|
||||||
|
<Button onClick={() => zoom(-1)}> -]</Button>
|
||||||
<MenuButton label="theme" value={theme} setValue={setTheme} ids={Object.keys(themes)} />
|
<MenuButton label="theme" value={theme} setValue={setTheme} ids={Object.keys(themes)} />
|
||||||
<Button as="a" href="https://github.com/lucko/paste" target="_blank" rel="noreferrer">[about]</Button>
|
<Button as="a" href="https://github.com/lucko/paste" target="_blank" rel="noreferrer">[about]</Button>
|
||||||
</Section>
|
</Section>
|
||||||
@@ -85,6 +91,7 @@ const Header = styled.header`
|
|||||||
background: ${props => props.theme.secondary};
|
background: ${props => props.theme.secondary};
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
user-select: none;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const Section = styled.div`
|
const Section = styled.div`
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import ReactEditor from 'react-simple-code-editor';
|
|||||||
import EditorPrismStyle from './EditorPrismStyle';
|
import EditorPrismStyle from './EditorPrismStyle';
|
||||||
import { getHighlighter } from '../highlighting';
|
import { getHighlighter } from '../highlighting';
|
||||||
|
|
||||||
export default function EditorTextArea({ code, setCode, language }) {
|
export default function EditorTextArea({ code, setCode, language, fontSize }) {
|
||||||
const highlight = getHighlighter(language);
|
const highlight = getHighlighter(language);
|
||||||
|
|
||||||
function highlightWithLineNumbers(input, grammar) {
|
function highlightWithLineNumbers(input, grammar) {
|
||||||
@@ -21,6 +21,7 @@ export default function EditorTextArea({ code, setCode, language }) {
|
|||||||
highlight={highlightWithLineNumbers}
|
highlight={highlightWithLineNumbers}
|
||||||
placeholder={'Type some code...'}
|
placeholder={'Type some code...'}
|
||||||
padding={10}
|
padding={10}
|
||||||
|
size={fontSize}
|
||||||
textareaId='code-area'
|
textareaId='code-area'
|
||||||
/>
|
/>
|
||||||
</EditorPrismStyle>
|
</EditorPrismStyle>
|
||||||
@@ -29,9 +30,9 @@ export default function EditorTextArea({ code, setCode, language }) {
|
|||||||
|
|
||||||
const StyledReactEditor = styled(ReactEditor)`
|
const StyledReactEditor = styled(ReactEditor)`
|
||||||
counter-reset: line;
|
counter-reset: line;
|
||||||
font-size: 16px;
|
font-size: ${props => props.size}px;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
min-height: calc(100vh - 2em);
|
min-height: calc(100vh - 2rem);
|
||||||
|
|
||||||
#code-area {
|
#code-area {
|
||||||
outline: none;
|
outline: none;
|
||||||
|
|||||||
Reference in New Issue
Block a user