diff --git a/demos/src/Nodes/CodeBlockLowlight/React/index.html b/demos/src/Nodes/CodeBlockLowlight/React/index.html new file mode 100644 index 00000000..4e1f93df --- /dev/null +++ b/demos/src/Nodes/CodeBlockLowlight/React/index.html @@ -0,0 +1,15 @@ + + + + + + + +
+ + + diff --git a/demos/src/Nodes/CodeBlockLowlight/React/index.jsx b/demos/src/Nodes/CodeBlockLowlight/React/index.jsx new file mode 100644 index 00000000..90d81b3a --- /dev/null +++ b/demos/src/Nodes/CodeBlockLowlight/React/index.jsx @@ -0,0 +1,70 @@ +import React from 'react' +import { useEditor, EditorContent } from '@tiptap/react' +import Document from '@tiptap/extension-document' +import Paragraph from '@tiptap/extension-paragraph' +import Text from '@tiptap/extension-text' +import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight' +// load all highlight.js languages +import lowlight from 'lowlight' + +// load specific languages only +// import lowlight from 'lowlight/lib/core' +// import javascript from 'highlight.js/lib/languages/javascript' +// lowlight.registerLanguage('javascript', javascript) + +import './styles.scss' + +export default () => { + const editor = useEditor({ + extensions: [ + Document, + Paragraph, + Text, + CodeBlockLowlight.configure({ + lowlight, + }), + ], + content: ` +

+ That’s a boring paragraph followed by a fenced code block: +

+
for (var i=1; i <= 20; i++)
+{
+  if (i % 15 == 0)
+    console.log("FizzBuzz");
+  else if (i % 3 == 0)
+    console.log("Fizz");
+  else if (i % 5 == 0)
+    console.log("Buzz");
+  else
+    console.log(i);
+}
+

+ Press Command/Ctrl + Enter to leave the fenced code block and continue typing in boring paragraphs. +

+ `, + }) + + if (!editor) { + return null + } + + return ( + <> + + + + + + ) +} diff --git a/demos/src/Nodes/CodeBlockLowlight/React/styles.scss b/demos/src/Nodes/CodeBlockLowlight/React/styles.scss new file mode 100644 index 00000000..dfb9e8b2 --- /dev/null +++ b/demos/src/Nodes/CodeBlockLowlight/React/styles.scss @@ -0,0 +1,73 @@ +/* Basic editor styles */ +.ProseMirror { + > * + * { + margin-top: 0.75em; + } + + pre { + background: #0d0d0d; + border-radius: 0.5rem; + color: #fff; + font-family: "JetBrainsMono", monospace; + padding: 0.75rem 1rem; + + code { + background: none; + color: inherit; + font-size: 0.8rem; + padding: 0; + } + + .hljs-comment, + .hljs-quote { + color: #616161; + } + + .hljs-variable, + .hljs-template-variable, + .hljs-attribute, + .hljs-tag, + .hljs-name, + .hljs-regexp, + .hljs-link, + .hljs-name, + .hljs-selector-id, + .hljs-selector-class { + color: #f98181; + } + + .hljs-number, + .hljs-meta, + .hljs-built_in, + .hljs-builtin-name, + .hljs-literal, + .hljs-type, + .hljs-params { + color: #fbbc88; + } + + .hljs-string, + .hljs-symbol, + .hljs-bullet { + color: #b9f18d; + } + + .hljs-title, + .hljs-section { + color: #faf594; + } + + .hljs-keyword, + .hljs-selector-tag { + color: #70cff8; + } + + .hljs-emphasis { + font-style: italic; + } + + .hljs-strong { + font-weight: 700; + } + } +}