From 5f113410b5aa0c4874cbd1fd2cabae3e394cbb29 Mon Sep 17 00:00:00 2001
From: Kushagra Gour <chinchang457@gmail.com>
Date: Sun, 5 Mar 2017 00:10:21 +0530
Subject: [PATCH] theme options for editor! fixes #84

---
 src/index.html                              | 56 ++++++++++++++-
 src/lib/codemirror/theme/dracula.css        |  7 +-
 src/lib/codemirror/theme/material.css       |  2 +-
 src/lib/codemirror/theme/pastel-on-dark.css |  1 -
 src/lib/codemirror/theme/solarized.css      | 36 +++++-----
 src/script.js                               | 75 ++++++++++++++++++---
 src/style.css                               |  2 +-
 7 files changed, 147 insertions(+), 32 deletions(-)

diff --git a/src/index.html b/src/index.html
index acefc0c..9cf1f59 100644
--- a/src/index.html
+++ b/src/index.html
@@ -3,7 +3,55 @@
 		<meta charset="utf-8">
 		<title>Web Maker</title>
 		<link rel="stylesheet" href="lib/codemirror/lib/codemirror.css">
-		<link rel="stylesheet" href="lib/codemirror/theme/monokai.css">
+
+		<link rel="stylesheet" href="/lib/codemirror/theme/3024-day.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/3024-night.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/abcdef.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/ambiance.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/base16-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/base16-light.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/bespin.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/blackboard.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/cobalt.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/colorforth.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/dracula.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/duotone-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/duotone-light.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/eclipse.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/elegant.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/erlang-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/hopscotch.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/icecoder.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/isotope.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/lesser-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/liquibyte.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/material.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/mbo.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/mdn-like.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/midnight.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/monokai.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/neat.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/neo.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/night.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/panda-syntax.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/paraiso-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/paraiso-light.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/pastel-on-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/railscasts.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/rubyblue.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/seti.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/solarized.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/the-matrix.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/tomorrow-night-bright.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/tomorrow-night-eighties.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/ttcn.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/twilight.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/vibrant-ink.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/xq-dark.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/xq-light.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/yeti.css"></link>
+		<link rel="stylesheet" href="/lib/codemirror/theme/zenburn.css"></link>
+
 		<link rel="stylesheet" href="lib/codemirror/addon/hint/show-hint.css">
 		<link rel="stylesheet" href="lib/codemirror/addon/fold/foldgutter.css">
 		<link rel="stylesheet" href="lib/hint.min.css">
@@ -315,7 +363,7 @@
 				</p>
 				<hr>
 
-				<h3>Editing</h3>
+				<h3>Editor</h3>
 				<p>
 					<label class="line">
 						Default Preprocessors
@@ -340,6 +388,10 @@
 							<option value="typescript">TypeScript</option>
 						</select>
 					</div>
+					<label class="line">
+						Theme
+						<select style="flex:1;margin:0 20px" data-setting="editorTheme" d-change="updateSetting"></select>
+					</label>
 					<label class="line">
 						<input type="checkbox" d-change="updateSetting" data-setting="preserveLastCode"> Preserve last written code
 					</label>
diff --git a/src/lib/codemirror/theme/dracula.css b/src/lib/codemirror/theme/dracula.css
index 57f979a..53a660b 100644
--- a/src/lib/codemirror/theme/dracula.css
+++ b/src/lib/codemirror/theme/dracula.css
@@ -16,7 +16,7 @@
 .cm-s-dracula .CodeMirror-gutters { color: #282a36; }
 .cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; }
 .cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; }
-.cm-s-dracula.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }
+.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }
 .cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }
 .cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }
 .cm-s-dracula span.cm-comment { color: #6272a4; }
@@ -24,8 +24,7 @@
 .cm-s-dracula span.cm-number { color: #bd93f9; }
 .cm-s-dracula span.cm-variable { color: #50fa7b; }
 .cm-s-dracula span.cm-variable-2 { color: white; }
-.cm-s-dracula span.cm-def { color: #ffb86c; }
-.cm-s-dracula span.cm-keyword { color: #ff79c6; }
+.cm-s-dracula span.cm-def { color: #50fa7b; }
 .cm-s-dracula span.cm-operator { color: #ff79c6; }
 .cm-s-dracula span.cm-keyword { color: #ff79c6; }
 .cm-s-dracula span.cm-atom { color: #bd93f9; }
@@ -35,7 +34,7 @@
 .cm-s-dracula span.cm-qualifier { color: #50fa7b; }
 .cm-s-dracula span.cm-property { color: #66d9ef; }
 .cm-s-dracula span.cm-builtin { color: #50fa7b; }
-.cm-s-dracula span.cm-variable-3 { color: #50fa7b; }
+.cm-s-dracula span.cm-variable-3 { color: #ffb86c; }
 
 .cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); }
 .cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; }
diff --git a/src/lib/codemirror/theme/material.css b/src/lib/codemirror/theme/material.css
index 91ed6ce..01d8679 100644
--- a/src/lib/codemirror/theme/material.css
+++ b/src/lib/codemirror/theme/material.css
@@ -7,7 +7,7 @@
 
 */
 
-.cm-s-material {
+.cm-s-material.CodeMirror {
   background-color: #263238;
   color: rgba(233, 237, 237, 1);
 }
diff --git a/src/lib/codemirror/theme/pastel-on-dark.css b/src/lib/codemirror/theme/pastel-on-dark.css
index 7197509..2603d36 100644
--- a/src/lib/codemirror/theme/pastel-on-dark.css
+++ b/src/lib/codemirror/theme/pastel-on-dark.css
@@ -11,7 +11,6 @@
 	background: #2c2827;
 	color: #8F938F;
 	line-height: 1.5;
-	font-size: 14px;
 }
 .cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2); }
 .cm-s-pastel-on-dark .CodeMirror-line::selection, .cm-s-pastel-on-dark .CodeMirror-line > span::selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::selection { background: rgba(221,240,255,0.2); }
diff --git a/src/lib/codemirror/theme/solarized.css b/src/lib/codemirror/theme/solarized.css
index 7882c93..1f39c7e 100644
--- a/src/lib/codemirror/theme/solarized.css
+++ b/src/lib/codemirror/theme/solarized.css
@@ -4,7 +4,7 @@ http://ethanschoonover.com/solarized
 */
 
 /*
-Solarized color pallet
+Solarized color palette
 http://ethanschoonover.com/solarized/img/solarized-palette.png
 */
 
@@ -34,7 +34,7 @@ http://ethanschoonover.com/solarized/img/solarized-palette.png
 }
 .cm-s-solarized.cm-s-dark {
   color: #839496;
-  background-color:  #002b36;
+  background-color: #002b36;
   text-shadow: #002b36 0 1px;
 }
 .cm-s-solarized.cm-s-light {
@@ -113,32 +113,34 @@ http://ethanschoonover.com/solarized/img/solarized-palette.png
   box-shadow: inset 7px 0 12px -6px #000;
 }
 
-/* Gutter border and some shadow from it  */
+/* Remove gutter border */
 .cm-s-solarized .CodeMirror-gutters {
-  border-right: 1px solid;
+  border-right: 0;
 }
 
 /* Gutter colors and line number styling based of color scheme (dark / light) */
 
 /* Dark */
 .cm-s-solarized.cm-s-dark .CodeMirror-gutters {
-  background-color:  #002b36;
-  border-color: #00232c;
+  background-color: #073642;
 }
 
 .cm-s-solarized.cm-s-dark .CodeMirror-linenumber {
+  color: #586e75;
   text-shadow: #021014 0 -1px;
 }
 
 /* Light */
 .cm-s-solarized.cm-s-light .CodeMirror-gutters {
-  background-color: #fdf6e3;
-  border-color: #eee8d5;
+  background-color: #eee8d5;
+}
+
+.cm-s-solarized.cm-s-light .CodeMirror-linenumber {
+  color: #839496;
 }
 
 /* Common */
 .cm-s-solarized .CodeMirror-linenumber {
-  color: #586e75;
   padding: 0 5px;
 }
 .cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; }
@@ -149,15 +151,19 @@ http://ethanschoonover.com/solarized/img/solarized-palette.png
   color: #586e75;
 }
 
+/* Cursor */
 .cm-s-solarized .CodeMirror-cursor { border-left: 1px solid #819090; }
 
-/*
-Active line. Negative margin compensates left padding of the text in the
-view-port
-*/
+/* Fat cursor */
+.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor { background: #77ee77; }
+.cm-s-solarized.cm-s-light .cm-animate-fat-cursor { background-color: #77ee77; }
+.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor { background: #586e75; }
+.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor { background-color: #586e75; }
+
+/* Active line */
 .cm-s-solarized.cm-s-dark .CodeMirror-activeline-background {
-  background: rgba(255, 255, 255, 0.10);
+  background: rgba(255, 255, 255, 0.06);
 }
 .cm-s-solarized.cm-s-light .CodeMirror-activeline-background {
-  background: rgba(0, 0, 0, 0.10);
+  background: rgba(0, 0, 0, 0.06);
 }
diff --git a/src/script.js b/src/script.js
index 3abc5b0..f7b39fb 100644
--- a/src/script.js
+++ b/src/script.js
@@ -1142,6 +1142,7 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
 		$('[data-setting=indentSize]').value = prefs.indentSize;
 		$('[data-setting=indentWith][value=' + (prefs.indentWith || 'spaces') + ']').checked = true;
 		$('[data-setting=isCodeBlastOn]').checked = prefs.isCodeBlastOn;
+		$('[data-setting=editorTheme]').value = prefs.editorTheme;
 	}
 
 	scope.updateSetting = function updateSetting(e) {
@@ -1157,14 +1158,17 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
 			});
 		}
 
-		scope.cm.js.setOption(
-			'indentWithTabs',
-			$('[data-setting=indentWith]:checked').value !== 'spaces'
-		);
+		['html', 'js', 'css'].forEach((type) => {
+			scope.cm[type].setOption(
+				'indentWithTabs',
+				$('[data-setting=indentWith]:checked').value !== 'spaces'
+			);
 
-		scope.cm.js.setOption('blastCode', $('[data-setting=isCodeBlastOn]').checked ? { effect: 2 } : false);
-		scope.cm.js.setOption('indentUnit', $('[data-setting=indentSize]').value);
-		scope.cm.js.setOption('tabSize', $('[data-setting=indentSize]').value);
+			scope.cm[type].setOption('blastCode', $('[data-setting=isCodeBlastOn]').checked ? { effect: 2 } : false);
+			scope.cm[type].setOption('indentUnit', $('[data-setting=indentSize]').value);
+			scope.cm[type].setOption('tabSize', $('[data-setting=indentSize]').value);
+			scope.cm[type].setOption('theme', $('[data-setting=editorTheme]').value);
+		});
 	};
 
 	function compileNodes() {
@@ -1430,7 +1434,8 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
 			cssMode: 'css',
 			isCodeBlastOn: false,
 			indentWith: 'spaces',
-			indentSize: 2
+			indentSize: 2,
+			editorTheme: 'monokai'
 		}, function syncGetCallback(result) {
 			if (result.preserveLastCode && lastCode) {
 				unsavedEditCount = 0;
@@ -1456,6 +1461,7 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
 			prefs.isCodeBlastOn = result.isCodeBlastOn;
 			prefs.indentSize = result.indentSize;
 			prefs.indentWith = result.indentWith;
+			prefs.editorTheme = result.editorTheme;
 
 			updateSettingsInUi();
 			scope.updateSetting();
@@ -1488,6 +1494,59 @@ onboardDontShowInTabOptionBtn, TextareaAutoComplete */
 			}
 		});
 
+		var options = '';
+		[
+			'selected>default',
+			'3024-day',
+			'3024-night',
+			'abcdef',
+			'ambiance',
+			'base16-dark',
+			'base16-light',
+			'bespin',
+			'blackboard',
+			'cobalt',
+			'colorforth',
+			'dracula',
+			'duotone-dark',
+			'duotone-light',
+			'eclipse',
+			'elegant',
+			'erlang-dark',
+			'hopscotch',
+			'icecoder',
+			'isotope',
+			'lesser-dark',
+			'liquibyte',
+			'material',
+			'mbo',
+			'mdn-like',
+			'midnight',
+			'monokai',
+			'neat',
+			'neo',
+			'night',
+			'panda-syntax',
+			'paraiso-dark',
+			'paraiso-light',
+			'pastel-on-dark',
+			'railscasts',
+			'rubyblue',
+			'seti',
+			'solarized dark',
+			'solarized light',
+			'the-matrix',
+			'tomorrow-night-bright',
+			'tomorrow-night-eighties',
+			'ttcn',
+			'twilight',
+			'vibrant-ink',
+			'xq-dark',
+			'xq-light',
+			'yeti',
+			'zenburn'
+		].forEach((theme) => { options += '<option value="' + theme + '">' + theme + '</option>'; });
+		document.querySelector('[data-setting="editorTheme"]').innerHTML = options;
 
 		requestAnimationFrame(compileNodes);
 	}
diff --git a/src/style.css b/src/style.css
index 7e0b103..90093d6 100644
--- a/src/style.css
+++ b/src/style.css
@@ -229,7 +229,7 @@ select, input[type="text"], textarea {
 .cm-s-monokai .CodeMirror-guttermarker-subtle {
 	opacity: 0.4;
 }
-.CodeMirror-activeline-background, .CodeMirror-activeline-gutter {
+.cm-s-monokai .CodeMirror-activeline-background, .cm-s-monokai .CodeMirror-activeline-gutter {
 	background: rgba(0,0,0,0.1) !important;
 }
 .CodeMirror-guttermarker-subtle {