diff --git a/package.json b/package.json index 97cae7178..d322bc3cb 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "@testing-library/jest-dom": "5.10.0", "@testing-library/react": "10.2.1", "@testing-library/user-event": "11.4.1", + "@types/codemirror": "^0.0.95", "@types/jest": "26.0.0", "@types/node": "12.12.47", "@types/node-sass": "4.11.1", @@ -20,6 +21,7 @@ "@typescript-eslint/eslint-plugin": "3.2.0", "@typescript-eslint/parser": "3.2.0", "bootstrap": "4.5.0", + "codemirror": "^5.54.0", "eslint-config-react-app": "5.2.1", "eslint-config-standard": "14.1.1", "eslint-plugin-flowtype": "5.1.3", @@ -37,6 +39,7 @@ "react": "16.13.1", "react-bootstrap": "1.0.1", "react-bootstrap-typeahead": "5.0.0-rc.3", + "react-codemirror2": "^7.2.0", "react-dom": "16.13.1", "react-i18next": "11.5.0", "react-redux": "7.2.0", diff --git a/src/components/application-loader/loading-screen.tsx b/src/components/application-loader/loading-screen.tsx index f23f98b22..bae89f469 100644 --- a/src/components/application-loader/loading-screen.tsx +++ b/src/components/application-loader/loading-screen.tsx @@ -9,7 +9,7 @@ export interface LoadingScreenProps { export const LoadingScreen: React.FC = ({ failedTitle }) => { return ( -
+
diff --git a/src/components/editor/editor-window/editor-window.scss b/src/components/editor/editor-window/editor-window.scss new file mode 100644 index 000000000..5b0e0ce7e --- /dev/null +++ b/src/components/editor/editor-window/editor-window.scss @@ -0,0 +1,6 @@ +@import '../../../../node_modules/codemirror/lib/codemirror.css'; +@import './one-dark.css'; + +.CodeMirror { + height: 100%; +} diff --git a/src/components/editor/editor-window/editor-window.tsx b/src/components/editor/editor-window/editor-window.tsx index 553069420..c96817a66 100644 --- a/src/components/editor/editor-window/editor-window.tsx +++ b/src/components/editor/editor-window/editor-window.tsx @@ -1,10 +1,66 @@ -import React from 'react' +import 'codemirror/addon/comment/comment' +import 'codemirror/addon/display/placeholder' +import 'codemirror/addon/edit/closebrackets' +import 'codemirror/addon/edit/closetag' +import 'codemirror/addon/edit/continuelist' +import 'codemirror/addon/edit/matchbrackets' +import 'codemirror/addon/edit/matchtags' +import 'codemirror/addon/fold/foldcode' +import 'codemirror/addon/fold/foldgutter' +import 'codemirror/addon/search/match-highlighter' +import 'codemirror/addon/selection/active-line' +import 'codemirror/keymap/sublime.js' +import 'codemirror/mode/gfm/gfm.js' +import React, { useState } from 'react' +import { Controlled as ControlledCodeMirror } from 'react-codemirror2' +import './editor-window.scss' const EditorWindow: React.FC = () => { + const [content, setContent] = useState('') return ( -
- Hello, EditorWindow! -
+ { + setContent(value) + }} + onChange={(editor, data, value) => { + console.log('change!') + }} + /> ) } diff --git a/src/components/editor/editor-window/one-dark.css b/src/components/editor/editor-window/one-dark.css new file mode 100644 index 000000000..79534044d --- /dev/null +++ b/src/components/editor/editor-window/one-dark.css @@ -0,0 +1,221 @@ +/** + * Atom One Dark Theme + * + * Copyright (c) 2015 Hikio - twitter.com/hik_io + * + * 06/26/2015 + * + * Licensed under MIT + * GitHub https://github.com/hikio/brackets-one-dark + */ +/* +Modified by jackycute 2015 +borrow some color from tomorrow-night-eighties +*/ +/* Editor */ +.dark .panel, +.dark #main-toolbar { + background: #1d222a; +} +.dark #working-set-list-container, +.dark #editor-holder .pane-header { + background: #15181e; +} +.dark .working-set-header, +.dark #project-files-header .btn-alt-quiet { + background: rgba(204, 217, 255, 0.05); +} +.dark .working-set-header > span { + background: transparent; +} +.dark .sidebar-selection, +.dark .filetree-selection, +.dark .sidebar-selection-extension, +.dark .filetree-selection-extension { + background: #282c34; +} +.dark #status-bar, +.dark #status-indicators { + background: #15181e; + border-top-color: #1d222a; +} +.dark a, +.dark .open-files-container li.selected a { + color: #528bff; +} +/* Code Styling */ +.cm-s-one-dark.CodeMirror, +.cm-s-one-dark .CodeMirror-scroll { + /* background-color: #282c34;*/ + background-color: #1e2126; + color: #abb2bf; +} +.cm-s-one-dark .CodeMirror-activeline-background { + background: transparent; +} +.cm-s-one-dark.CodeMirror-focused .CodeMirror-activeline-background { + background: rgba(204, 217, 255, 0.05); +} +.show-line-padding .cm-s-one-dark.CodeMirror-focused .CodeMirror-activeline-background { + box-shadow: inset 15px 0 0 0 #000; +} +.cm-s-one-dark.CodeMirror-focused .CodeMirror-activeline .CodeMirror-gutter-elt { + background: transparent; + color: #5c6370; +} +.cm-s-one-dark.CodeMirror-focused .CodeMirror-activeline .inline-widget .CodeMirror-gutter-elt { + color: red; +} +.cm-s-one-dark .cm-string-2, +.cm-s-one-dark .cm-hr { + color: #56b6c2; +} +.cm-s-one-dark .cm-number, +.cm-s-one-dark .cm-attribute, +.cm-s-one-dark .cm-qualifier, +.cm-s-one-dark .cm-plus, +.cm-s-one-dark .cm-atom { + color: #eda35e; +} +.cm-s-one-dark .cm-def { + color: #c678dd; +} +.cm-s-one-dark .cm-property, +.cm-s-one-dark .cm-variable, +.cm-s-one-dark .cm-variable-2, +.cm-s-one-dark .cm-variable-3, +.cm-s-one-dark .cm-operator, + /*.cm-meta,*/ +.cm-s-one-dark .cm-bracket { + color: #f76e79; +} +/*borrow from tomorrow-night-eighties*/ +.cm-s-one-dark .cm-variable { + color: #99cc99; +} +.cm-s-one-dark .cm-variable-2 { + color: #6699cc; +} + +.cm-s-one-dark .cm-comment { + color: #5c6370; + font-style: italic; +} +.cm-s-one-dark .cm-error, +.cm-s-one-dark .cm-minus { + color: #be5046; +} +.cm-s-one-dark .cm-header { + color: #eda35e; +} +.cm-s-one-dark .cm-link { + color: #98c379; + text-decoration: none; +} +.cm-s-one-dark .cm-rangeinfo { + color: #c678dd; +} +.cm-s-one-dark .cm-keyword, +.cm-s-one-dark .cm-builtin, +.cm-s-one-dark .cm-tag { + color: #e06c75; +} +.cm-s-one-dark .cm-m-markdown.cm-keyword, +.cm-s-one-dark .cm-m-markdown.cm-builtin, +.cm-s-one-dark .cm-m-markdown.cm-tag { + color: #98c379; +} +.cm-s-one-dark .cm-string { + /* color: #98c379;*/ + color: #6699cc; +} +/* Extra CSS */ +.cm-s-one-dark .CodeMirror-searching { + color: #fff !important; + border: 1px solid #528bff; + margin: 0 -1px; + background-color: rgba(204, 217, 255, 0.09); + box-shadow: 0px 0px 6px rgba(66, 133, 244, 0.4); +} +.cm-s-one-dark .CodeMirror-searching.searching-current-match { + color: #fff; + background-color: #528bff; + box-shadow: 0px 0px 6px rgba(66, 133, 244, 0.8); +} +.cm-s-one-dark .CodeMirror-cursor { + border-left: 2px solid #528bff !important; +} +.cm-fat-cursor .CodeMirror-cursor { + border-left: 2px solid #3C5B9E !important; + background: #3C5B9E; +} +.cm-s-one-dark .CodeMirror-gutters { + /* background-color: #282c34;*/ + background-color: #1e2126; + border-right: 1px solid rgba(204, 217, 255, 0.05); +} +.cm-s-one-dark .CodeMirror-linenumber { + color: #393e46; +} +.cm-s-one-dark.CodeMirror .CodeMirror-selected { + background: rgba(204, 217, 255, 0.05); +} +.cm-s-one-dark.CodeMirror-focused .CodeMirror-selected { + background: rgba(204, 217, 255, 0.09); +} +.cm-s-one-dark .CodeMirror-matchingbracket, +.cm-s-one-dark .CodeMirror-matchingtag { + /* Ensure visibility against gray inline editor background */ + background-color: rgba(204, 217, 255, 0.09); + color: #abb2bf !important; + border-bottom: 1px solid #528bff; +} +.cm-s-one-dark .CodeMirror-overwrite .CodeMirror-cursor { + border-left: none !important; + border-bottom: 1px solid #fff; + width: 0.5em; +} +.cm-s-one-dark.CodeMirror .CodeMirror { + background: transparent; +} +.cm-s-one-dark.CodeMirror .CodeMirror .CodeMirror-gutters { + background: transparent; + border-right: none; +} +.cm-s-one-dark.CodeMirror .CodeMirror .CodeMirror-activeline-background { + background: transparent; +} +.cm-s-one-dark.CodeMirror .CodeMirror .CodeMirror-activeline .CodeMirror-gutter-elt { + background: transparent; + color: #5c6370; +} +.cm-s-one-dark.CodeMirror .CodeMirror-focused .CodeMirror-activeline-background { + background: #000; +} +.cm-s-one-dark.CodeMirror .CodeMirror-focused .CodeMirror-activeline .CodeMirror-gutter-elt { + background: rgba(204, 217, 255, 0.05); + color: #fff; +} +.cm-s-one-dark .CodeMirror-foldgutter-open:after { + color: #393e46; +} +.cm-s-one-dark .CodeMirror-foldgutter-folded:after { + color: #5c6370; +} +.cm-s-one-dark .CodeMirror.over-gutter .CodeMirror-foldgutter-open:after, +.cm-s-one-dark.CodeMirror-focused .CodeMirror-activeline .CodeMirror-foldgutter-open:after { + color: #5c6370; +} +.cm-s-one-dark .CodeMirror-foldmarker { + border-color: #393e46; + color: #abb2bf; + background: rgba(204, 217, 255, 0.05); +} +/* Non-editor styling */ +.image-view, +.not-editor { + background-color: #282c34; +} +.view-pane .image-view { + color: #abb2bf; +} diff --git a/src/components/editor/editor.tsx b/src/components/editor/editor.tsx index 14e659664..c579ef746 100644 --- a/src/components/editor/editor.tsx +++ b/src/components/editor/editor.tsx @@ -1,6 +1,5 @@ import React from 'react' import { useSelector } from 'react-redux' -import { useParams } from 'react-router' import { ApplicationState } from '../../redux' import { ShowIf } from '../common/show-if/show-if' import { EditorWindow } from './editor-window/editor-window' @@ -14,12 +13,10 @@ interface RouteParameters { const Editor: React.FC = () => { const editorMode: EditorMode = useSelector((state: ApplicationState) => state.editorConfig.editorMode) - const { id } = useParams() return (
-

{id}

diff --git a/src/components/landing/landing-layout.tsx b/src/components/landing/landing-layout.tsx index 513d7c98d..652eeebdb 100644 --- a/src/components/landing/landing-layout.tsx +++ b/src/components/landing/landing-layout.tsx @@ -5,7 +5,7 @@ import { Footer } from './layout/footer/footer' export const LandingLayout: React.FC = ({ children }) => { return ( - + {children}