aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
authorjackyzha0 <[email protected]>2021-03-06 14:44:15 -0800
committerjackyzha0 <[email protected]>2021-03-06 14:44:15 -0800
commite9a7416fabbbb0155c09ee86e7843a4d87e0c118 (patch)
tree4243141cd2f151c65a0b4a8d34213b762aeef516 /frontend
parentcode input style finalizations (diff)
downloadctrl-v-e9a7416fabbbb0155c09ee86e7843a4d87e0c118.tar.xz
ctrl-v-e9a7416fabbbb0155c09ee86e7843a4d87e0c118.zip
code renderer virtualization, better visuals
Diffstat (limited to 'frontend')
-rw-r--r--frontend/package.json1
-rw-r--r--frontend/src/components/Form/Input.js2
-rw-r--r--frontend/src/components/Form/mixins.js14
-rw-r--r--frontend/src/components/Inputs/Code.js14
-rw-r--r--frontend/src/components/decorators/CharLimit.js2
-rw-r--r--frontend/src/components/renderers/Code.js38
-rw-r--r--frontend/yarn.lock81
7 files changed, 106 insertions, 46 deletions
diff --git a/frontend/package.json b/frontend/package.json
index f92e8a4..4fc1fe7 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -24,6 +24,7 @@
"react-scripts": "3.4.1",
"react-simple-code-editor": "^0.11.0",
"react-syntax-highlighter": "^12.2.1",
+ "react-syntax-highlighter-virtualized-renderer": "^1.1.0",
"serialize-javascript": "^4.0.0",
"styled-components": "^5.1.0",
"use-clipboard-copy": "^0.1.2"
diff --git a/frontend/src/components/Form/Input.js b/frontend/src/components/Form/Input.js
index 7c9e413..e000cfb 100644
--- a/frontend/src/components/Form/Input.js
+++ b/frontend/src/components/Form/Input.js
@@ -1,5 +1,5 @@
import styled from 'styled-components'
-import {Border, DropShadow, InputLike, Rounded, Transition} from "./mixins";
+import {Border, DropShadow, InputLike, Rounded} from "./mixins";
export const Input = styled.input`
${Border}
diff --git a/frontend/src/components/Form/mixins.js b/frontend/src/components/Form/mixins.js
index 64b7cc0..600a861 100644
--- a/frontend/src/components/Form/mixins.js
+++ b/frontend/src/components/Form/mixins.js
@@ -8,7 +8,12 @@ export const Hover = css`
opacity: 0.5;
transition: all 0.5s cubic-bezier(.25,.8,.25,1);
- &:focus, &:hover, &:focus span {
+ & ~ pre {
+ transition: all 0.5s cubic-bezier(.25,.8,.25,1);
+ opacity: 0.5;
+ }
+
+ &:focus, &:hover, &:focus span, &:focus ~ pre {
opacity: 1;
}
`
@@ -31,6 +36,13 @@ export const InputLike = css`
margin: 1.7em 0;
`
+export const CodeLike = css`
+ font-family: JetBrains Mono !important;
+ font-size: 14px !important;
+ line-height: 1.2em !important;
+ white-space: pre-wrap;
+`
+
export const ButtonLike = css`
font-family: 'JetBrains Mono', serif;
font-weight: 700;
diff --git a/frontend/src/components/Inputs/Code.js b/frontend/src/components/Inputs/Code.js
index 5b8e06a..d5e063a 100644
--- a/frontend/src/components/Inputs/Code.js
+++ b/frontend/src/components/Inputs/Code.js
@@ -3,6 +3,7 @@ import styled from 'styled-components'
import CharLimit from "../decorators/CharLimit";
import Editor from 'react-simple-code-editor';
import {Highlighter} from "../renderers/Code";
+import {CodeLike, Hover} from "../Form/mixins";
const EditorWrapper = styled(Editor)`
overflow: visible !important;
@@ -13,30 +14,25 @@ const EditorWrapper = styled(Editor)`
}
& pre, & code, & > textarea {
- font-family: JetBrains Mono !important;
- font-size: 14px !important;
- line-height: 1.2em !important;
+ ${CodeLike}
min-height: 40vh;
}
& > textarea {
- padding: 0.8em !important;
+ ${Hover}
+ padding: 0.6em !important;
z-index: 1;
- border: none !important;
- background-color: transparent !important;
outline: none !important;
}
`
-const DefaultText = `Paste your text here`
-
export const Code = ({content, id, readOnly, setContentCallback, ...props}) => {
return (
<div>
<EditorWrapper
name="content"
readOnly={readOnly}
- placeholder={DefaultText}
+ placeholder="Paste your text here"
value={content}
id={id}
required
diff --git a/frontend/src/components/decorators/CharLimit.js b/frontend/src/components/decorators/CharLimit.js
index 5201377..fcf14d0 100644
--- a/frontend/src/components/decorators/CharLimit.js
+++ b/frontend/src/components/decorators/CharLimit.js
@@ -1,5 +1,5 @@
import React from 'react';
-import styled, { css } from 'styled-components'
+import styled from 'styled-components'
// show char limit if length > half of max
const Chars = styled.p`
diff --git a/frontend/src/components/renderers/Code.js b/frontend/src/components/renderers/Code.js
index 9243532..d110f79 100644
--- a/frontend/src/components/renderers/Code.js
+++ b/frontend/src/components/renderers/Code.js
@@ -1,8 +1,9 @@
import React from 'react';
import SyntaxHighlighter from 'react-syntax-highlighter';
+import virtualizedRenderer from 'react-syntax-highlighter-virtualized-renderer';
import { atomOneLight, ascetic, atomOneDark, dracula, ocean } from 'react-syntax-highlighter/dist/esm/styles/hljs';
import styled from 'styled-components'
-import {Rounded} from "../Form/mixins";
+import {Border, CodeLike, DropShadow, Hover, Rounded} from "../Form/mixins";
export const THEMES = Object.freeze({
'atom': atomOneLight,
@@ -19,19 +20,17 @@ export const LANGS = Object.freeze({
})
export const StyledPre = styled.pre`
- width: 100%;
- font-size: 14px;
- line-height: 1.2em;
- padding: calc(0.8em - 1px) !important;
+ ${Rounded};
+ ${Border};
+ ${DropShadow};
+ width: calc(100%);
+ padding: calc(0.6em - 1px) !important;
margin: 1.7em 0;
- background: none !important;
position: relative;
- ${Rounded}
outline: none;
- border: 1px solid #565656 !important;
& code {
- font-family: JetBrains Mono !important;
+ ${CodeLike}
}
& code:first-child:not(:only-of-type) {
@@ -51,18 +50,15 @@ export const Highlighter = ({language, lineNumbers, theme, pre = StyledPre, chil
const CodeRenderer = React.forwardRef((props, ref) => {
const Pre = (props) => <StyledPre {...props} ref={ref} />
- return (
- <div className="lt-shadow">
- <Highlighter
- lineNumbers={true}
- language={props.lang}
- theme={props.theme}
- pre={Pre}
- >
- {props.content}
- </Highlighter>
- </div>
- );
+ return (<Highlighter
+ lineNumbers={true}
+ language={props.lang}
+ theme={props.theme}
+ renderer={virtualizedRenderer()}
+ pre={Pre}
+ >
+ {props.content}
+ </Highlighter>)
});
export default CodeRenderer \ No newline at end of file
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 72d0506..27f2ab3 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -1081,6 +1081,13 @@
dependencies:
regenerator-runtime "^0.13.4"
+"@babel/runtime@^7.8.7":
+ version "7.13.9"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz#97dbe2116e2630c489f22e0656decd60aaa1fcee"
+ integrity sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/template@^7.10.1", "@babel/template@^7.4.0", "@babel/template@^7.8.6":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811"
@@ -2444,7 +2451,7 @@ babel-preset-react-app@^9.1.2:
babel-plugin-macros "2.8.0"
babel-plugin-transform-react-remove-prop-types "0.4.24"
[email protected], babel-runtime@^6.26.0:
[email protected], babel-runtime@^6.18.0, babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -3104,6 +3111,11 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
+clsx@^1.0.4:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
+ integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
+
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -3709,6 +3721,11 @@ csstype@^2.2.0:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b"
integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==
+csstype@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b"
+ integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==
+
cyclist@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
@@ -4013,6 +4030,14 @@ dom-converter@^0.2:
dependencies:
utila "~0.4"
+dom-helpers@^5.1.3:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b"
+ integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
dom-serializer@0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
@@ -5361,6 +5386,11 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+highlight.js@~9.12.0:
+ version "9.12.0"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
+ integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=
+
highlight.js@~9.15.0, highlight.js@~9.15.1:
version "9.15.10"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.10.tgz#7b18ed75c90348c045eef9ed08ca1319a2219ad2"
@@ -5681,13 +5711,6 @@ indent-string@^4.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-indent-textarea@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/indent-textarea/-/indent-textarea-2.0.2.tgz#9fc142cb0cf40c1b0320558c017eddb8dd494174"
- integrity sha512-2E/WQXpCOd3lLJoLPk8QIArLfflZNoGD6udendhbRpRpA+nkIYSNexsY9fpSCjw4poqKfuP51d9ASYucFdjm4Q==
- dependencies:
- insert-text-textarea "^2.0.0"
-
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
@@ -5764,11 +5787,6 @@ inquirer@^7.0.0:
strip-ansi "^6.0.0"
through "^2.3.6"
-insert-text-textarea@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/insert-text-textarea/-/insert-text-textarea-2.0.1.tgz#ac3ccbb05b27a1280ca9ea62349c5ef65ba7d4a0"
- integrity sha512-I4PC8aD1HjD61lqPiAxauv1r6Tc0vPk3BGauZw/oQl+1YnKhStzHOIG0K7peKZgZ7XG0N/OmbR8KMZ5wE0n1tA==
-
internal-ip@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
@@ -7075,6 +7093,14 @@ [email protected]:
fault "^1.0.2"
highlight.js "~9.15.0"
+lowlight@~1.9.1:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.2.tgz#0b9127e3cec2c3021b7795dd81005c709a42fdd1"
+ integrity sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==
+ dependencies:
+ fault "^1.0.2"
+ highlight.js "~9.12.0"
+
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -9469,6 +9495,14 @@ react-simple-code-editor@^0.11.0:
resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz#bb57c7c29b570f2ab229872599eac184f5bc673c"
integrity sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==
+react-syntax-highlighter-virtualized-renderer@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/react-syntax-highlighter-virtualized-renderer/-/react-syntax-highlighter-virtualized-renderer-1.1.0.tgz#7536d9f18f9cce736fac15031a891b8cbaabe90b"
+ integrity sha1-dTbZ8Y+cznNvrBUDGokbjLqr6Qs=
+ dependencies:
+ react-syntax-highlighter "^5.1.2"
+ react-virtualized "^9.3.0"
+
react-syntax-highlighter@^12.2.1:
version "12.2.1"
resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-12.2.1.tgz#14d78352da1c1c3f93c6698b70ec7c706b83493e"
@@ -9480,6 +9514,27 @@ react-syntax-highlighter@^12.2.1:
prismjs "^1.8.4"
refractor "^2.4.1"
+react-syntax-highlighter@^5.1.2:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-5.8.0.tgz#a220c010fd0641751d93532509ba7159cc3a4383"
+ integrity sha512-+FolT9NhFBqE4SsZDelSzsYJJS/JCnQqo4+GxLrFPoML548uvr8f4Eh5nnd5o6ERKFW7ryiygOX9SPnxdnlpkg==
+ dependencies:
+ babel-runtime "^6.18.0"
+ highlight.js "~9.12.0"
+ lowlight "~1.9.1"
+
+react-virtualized@^9.3.0:
+ version "9.22.3"
+ resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421"
+ integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==
+ dependencies:
+ "@babel/runtime" "^7.7.2"
+ clsx "^1.0.4"
+ dom-helpers "^5.1.3"
+ loose-envify "^1.4.0"
+ prop-types "^15.7.2"
+ react-lifecycles-compat "^3.0.4"
+
react@^16.12.0, react@^16.13.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"