diff options
| author | jackyzha0 <[email protected]> | 2021-03-06 14:44:15 -0800 |
|---|---|---|
| committer | jackyzha0 <[email protected]> | 2021-03-06 14:44:15 -0800 |
| commit | e9a7416fabbbb0155c09ee86e7843a4d87e0c118 (patch) | |
| tree | 4243141cd2f151c65a0b4a8d34213b762aeef516 /frontend | |
| parent | code input style finalizations (diff) | |
| download | ctrl-v-e9a7416fabbbb0155c09ee86e7843a4d87e0c118.tar.xz ctrl-v-e9a7416fabbbb0155c09ee86e7843a4d87e0c118.zip | |
code renderer virtualization, better visuals
Diffstat (limited to 'frontend')
| -rw-r--r-- | frontend/package.json | 1 | ||||
| -rw-r--r-- | frontend/src/components/Form/Input.js | 2 | ||||
| -rw-r--r-- | frontend/src/components/Form/mixins.js | 14 | ||||
| -rw-r--r-- | frontend/src/components/Inputs/Code.js | 14 | ||||
| -rw-r--r-- | frontend/src/components/decorators/CharLimit.js | 2 | ||||
| -rw-r--r-- | frontend/src/components/renderers/Code.js | 38 | ||||
| -rw-r--r-- | frontend/yarn.lock | 81 |
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" |