feat: editor preview styling + code highlighting
This commit is contained in:
		@@ -65,7 +65,7 @@
 | 
			
		||||
        codemirror(ref='cm', v-model='code', :options='cmOptions', @ready='onCmReady', @input='onCmInput')
 | 
			
		||||
      .editor-code-preview
 | 
			
		||||
        .editor-code-preview-title Preview
 | 
			
		||||
        .editor-code-preview-content(v-html='previewHTML')
 | 
			
		||||
        .editor-code-preview-content.markdown-content(ref='editorPreview', v-html='previewHTML')
 | 
			
		||||
      v-speed-dial(v-model='fabInsertMenu', :open-on-hover='true', direction='top', transition='slide-y-reverse-transition', :fixed='true', :right='!isMobile', :left='isMobile', :bottom='true')
 | 
			
		||||
        v-btn(color='blue', fab, dark, v-model='fabInsertMenu', slot='activator')
 | 
			
		||||
          v-icon add_circle
 | 
			
		||||
@@ -111,12 +111,16 @@ import 'codemirror/addon/search/match-highlighter.js'
 | 
			
		||||
 | 
			
		||||
// Markdown-it
 | 
			
		||||
import MarkdownIt from 'markdown-it'
 | 
			
		||||
import Prism from '../libs/prism/prism.js'
 | 
			
		||||
 | 
			
		||||
const md = new MarkdownIt({
 | 
			
		||||
  html: true,
 | 
			
		||||
  breaks: true,
 | 
			
		||||
  linkify: true,
 | 
			
		||||
  typography: true
 | 
			
		||||
  typography: true,
 | 
			
		||||
  highlight(str, lang) {
 | 
			
		||||
    return `<pre class="line-numbers"><code class="language-${lang}">${str}</code></pre>`
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
@@ -127,7 +131,7 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      fabMainMenu: false,
 | 
			
		||||
      fabInsertMenu: false,
 | 
			
		||||
      code: '# Header 1\n\nSample **Text**\n\n## Header 2\nSample Text',
 | 
			
		||||
      code: '# Header 1\n\nSample **Text**\nhttp://wiki.js.org\n\n## Header 2\nSample Text\n\n```javascript\nvar test = require("test");\n\n// some comment\nconst foo = bar(\'param\') + 1.234;\n```',
 | 
			
		||||
      cmOptions: {
 | 
			
		||||
        tabSize: 2,
 | 
			
		||||
        mode: 'text/markdown',
 | 
			
		||||
@@ -174,6 +178,9 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
    onCmInput: _.debounce(function (newContent) {
 | 
			
		||||
      this.previewHTML = md.render(newContent)
 | 
			
		||||
      this.$nextTick(function() {
 | 
			
		||||
        Prism.highlightAllUnder(this.$refs.editorPreview)
 | 
			
		||||
      })
 | 
			
		||||
    }, 500)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										172
									
								
								client/libs/prism/prism.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								client/libs/prism/prism.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,172 @@
 | 
			
		||||
/* PrismJS 1.11.0
 | 
			
		||||
http://prismjs.com/download.html?themes=prism-dark&languages=markup+css+clike+javascript+c+bash+basic+cpp+csharp+arduino+ruby+elixir+fsharp+go+graphql+handlebars+haskell+ini+java+json+kotlin+latex+less+makefile+markdown+matlab+nginx+objectivec+perl+php+powershell+pug+python+typescript+rust+scss+scala+smalltalk+sql+stylus+swift+vbnet+yaml&plugins=line-numbers */
 | 
			
		||||
/**
 | 
			
		||||
 * prism.js Dark theme for JavaScript, CSS and HTML
 | 
			
		||||
 * Based on the slides of the talk “/Reg(exp){2}lained/”
 | 
			
		||||
 * @author Lea Verou
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
code[class*="language-"],
 | 
			
		||||
pre[class*="language-"] {
 | 
			
		||||
	color: white;
 | 
			
		||||
	background: none;
 | 
			
		||||
	text-shadow: 0 -.1em .2em black;
 | 
			
		||||
	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
 | 
			
		||||
	text-align: left;
 | 
			
		||||
	white-space: pre;
 | 
			
		||||
	word-spacing: normal;
 | 
			
		||||
	word-break: normal;
 | 
			
		||||
	word-wrap: normal;
 | 
			
		||||
	line-height: 1.5;
 | 
			
		||||
 | 
			
		||||
	-moz-tab-size: 4;
 | 
			
		||||
	-o-tab-size: 4;
 | 
			
		||||
	tab-size: 4;
 | 
			
		||||
 | 
			
		||||
	-webkit-hyphens: none;
 | 
			
		||||
	-moz-hyphens: none;
 | 
			
		||||
	-ms-hyphens: none;
 | 
			
		||||
	hyphens: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media print {
 | 
			
		||||
	code[class*="language-"],
 | 
			
		||||
	pre[class*="language-"] {
 | 
			
		||||
		text-shadow: none;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pre[class*="language-"],
 | 
			
		||||
:not(pre) > code[class*="language-"] {
 | 
			
		||||
	background: hsl(30, 20%, 25%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Code blocks */
 | 
			
		||||
pre[class*="language-"] {
 | 
			
		||||
	padding: 1em;
 | 
			
		||||
	margin: .5em 0;
 | 
			
		||||
	overflow: auto;
 | 
			
		||||
	border: .3em solid hsl(30, 20%, 40%);
 | 
			
		||||
	border-radius: .5em;
 | 
			
		||||
	box-shadow: 1px 1px .5em black inset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Inline code */
 | 
			
		||||
:not(pre) > code[class*="language-"] {
 | 
			
		||||
	padding: .15em .2em .05em;
 | 
			
		||||
	border-radius: .3em;
 | 
			
		||||
	border: .13em solid hsl(30, 20%, 40%);
 | 
			
		||||
	box-shadow: 1px 1px .3em -.1em black inset;
 | 
			
		||||
	white-space: normal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.comment,
 | 
			
		||||
.token.prolog,
 | 
			
		||||
.token.doctype,
 | 
			
		||||
.token.cdata {
 | 
			
		||||
	color: hsl(30, 20%, 50%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.punctuation {
 | 
			
		||||
	opacity: .7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.namespace {
 | 
			
		||||
	opacity: .7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.property,
 | 
			
		||||
.token.tag,
 | 
			
		||||
.token.boolean,
 | 
			
		||||
.token.number,
 | 
			
		||||
.token.constant,
 | 
			
		||||
.token.symbol {
 | 
			
		||||
	color: hsl(350, 40%, 70%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.selector,
 | 
			
		||||
.token.attr-name,
 | 
			
		||||
.token.string,
 | 
			
		||||
.token.char,
 | 
			
		||||
.token.builtin,
 | 
			
		||||
.token.inserted {
 | 
			
		||||
	color: hsl(75, 70%, 60%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.operator,
 | 
			
		||||
.token.entity,
 | 
			
		||||
.token.url,
 | 
			
		||||
.language-css .token.string,
 | 
			
		||||
.style .token.string,
 | 
			
		||||
.token.variable {
 | 
			
		||||
	color: hsl(40, 90%, 60%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.atrule,
 | 
			
		||||
.token.attr-value,
 | 
			
		||||
.token.keyword {
 | 
			
		||||
	color: hsl(350, 40%, 70%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.regex,
 | 
			
		||||
.token.important {
 | 
			
		||||
	color: #e90;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.important,
 | 
			
		||||
.token.bold {
 | 
			
		||||
	font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.token.italic {
 | 
			
		||||
	font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.entity {
 | 
			
		||||
	cursor: help;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.deleted {
 | 
			
		||||
	color: red;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pre.line-numbers {
 | 
			
		||||
	position: relative;
 | 
			
		||||
	padding-left: 3.8em;
 | 
			
		||||
	counter-reset: linenumber;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pre.line-numbers > code {
 | 
			
		||||
	position: relative;
 | 
			
		||||
    white-space: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.line-numbers .line-numbers-rows {
 | 
			
		||||
	position: absolute;
 | 
			
		||||
	pointer-events: none;
 | 
			
		||||
	top: 0;
 | 
			
		||||
	font-size: 100%;
 | 
			
		||||
	left: -3.8em;
 | 
			
		||||
	width: 3em; /* works for line-numbers below 1000 lines */
 | 
			
		||||
	letter-spacing: -1px;
 | 
			
		||||
	border-right: 1px solid #999;
 | 
			
		||||
 | 
			
		||||
	-webkit-user-select: none;
 | 
			
		||||
	-moz-user-select: none;
 | 
			
		||||
	-ms-user-select: none;
 | 
			
		||||
	user-select: none;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	.line-numbers-rows > span {
 | 
			
		||||
		pointer-events: none;
 | 
			
		||||
		display: block;
 | 
			
		||||
		counter-increment: linenumber;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		.line-numbers-rows > span:before {
 | 
			
		||||
			content: counter(linenumber);
 | 
			
		||||
			color: #999;
 | 
			
		||||
			display: block;
 | 
			
		||||
			padding-right: 0.8em;
 | 
			
		||||
			text-align: right;
 | 
			
		||||
		}
 | 
			
		||||
							
								
								
									
										47
									
								
								client/libs/prism/prism.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								client/libs/prism/prism.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -2,17 +2,18 @@
 | 
			
		||||
 | 
			
		||||
@import 'base/icons';
 | 
			
		||||
 | 
			
		||||
@import "libs/animate";
 | 
			
		||||
@import "../libs/animate/animate";
 | 
			
		||||
 | 
			
		||||
@import 'components/button';
 | 
			
		||||
@import 'components/markdown-content';
 | 
			
		||||
@import 'components/navigator';
 | 
			
		||||
@import 'components/panel';
 | 
			
		||||
@import 'components/setup';
 | 
			
		||||
@import 'components/toggle';
 | 
			
		||||
@import 'components/typography';
 | 
			
		||||
 | 
			
		||||
@import 'libs/twemoji-awesome';
 | 
			
		||||
@import 'node_modules/highlight.js/styles/atom-one-dark';
 | 
			
		||||
@import '../libs/twemoji/twemoji-awesome';
 | 
			
		||||
@import '../libs/prism/prism.css';
 | 
			
		||||
@import 'node_modules/diff2html/dist/diff2html.min';
 | 
			
		||||
 | 
			
		||||
@import 'pages/welcome';
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								client/scss/components/markdown-content.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								client/scss/components/markdown-content.scss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
.markdown-content {
 | 
			
		||||
  font-size: 1rem;
 | 
			
		||||
  color: mc('blue-grey', '900');
 | 
			
		||||
 | 
			
		||||
  // --------------------------------------------
 | 
			
		||||
  // Headers
 | 
			
		||||
  // --------------------------------------------
 | 
			
		||||
 | 
			
		||||
  h1, h2, h3, h4, h5, h6 {
 | 
			
		||||
    color: mc('blue-grey', '800');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  > * + h1, > * + h2, > * + h3, > * + h4 {
 | 
			
		||||
    margin-top: 1rem;
 | 
			
		||||
  }
 | 
			
		||||
  h1 {
 | 
			
		||||
    font-size: 1.5rem;
 | 
			
		||||
    border-bottom: 1px solid mc('blue-grey', '100');
 | 
			
		||||
    margin-bottom: 1rem;
 | 
			
		||||
  }
 | 
			
		||||
  h2 {
 | 
			
		||||
    font-size: 1.25rem;
 | 
			
		||||
    border-bottom: 1px dotted mc('blue-grey', '100');
 | 
			
		||||
    margin-bottom: .75rem;
 | 
			
		||||
  }
 | 
			
		||||
  h3 {
 | 
			
		||||
    font-size: 1.15rem;
 | 
			
		||||
    margin-bottom: .5rem;
 | 
			
		||||
  }
 | 
			
		||||
  h4 {
 | 
			
		||||
    font-size: 1.1rem;
 | 
			
		||||
  }
 | 
			
		||||
  h5 {
 | 
			
		||||
    font-size: 1.05rem;
 | 
			
		||||
  }
 | 
			
		||||
  h6 {
 | 
			
		||||
    font-size: 1.025rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // --------------------------------------------
 | 
			
		||||
  // Code Blocks
 | 
			
		||||
  // --------------------------------------------
 | 
			
		||||
  > pre {
 | 
			
		||||
    border: none;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    box-shadow: initial;
 | 
			
		||||
    background-color: mc('blue-grey', '900');
 | 
			
		||||
    padding: 1rem 1rem 1rem 3rem;
 | 
			
		||||
 | 
			
		||||
    > code {
 | 
			
		||||
      box-shadow: initial;
 | 
			
		||||
      display: block;
 | 
			
		||||
      font-size: .85rem;
 | 
			
		||||
 | 
			
		||||
      &:after, &:before {
 | 
			
		||||
        content: initial;
 | 
			
		||||
        letter-spacing: initial;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user