瀏覽代碼

feat: markdown spellcheck mode

NGPixel 5 年之前
父節點
當前提交
abe86928fb
共有 1 個文件被更改,包括 25 次插入2 次删除
  1. 25 2
      client/components/editor/editor-markdown.vue

+ 25 - 2
client/components/editor/editor-markdown.vue

@@ -100,9 +100,14 @@
           span {{$t('editor:markup.horizontalBar')}}
         template(v-if='$vuetify.breakpoint.mdAndUp')
           v-spacer
+          v-tooltip(bottom, color='primary', v-if='previewShown')
+            template(v-slot:activator='{ on }')
+              v-btn.animated.fadeIn.wait-p1s(icon, tile, v-on='on', @click='spellModeActive = !spellModeActive').mx-0
+                v-icon(:color='spellModeActive ? `amber` : `white`') mdi-spellcheck
+            span {{$t('editor:markup.toggleSpellcheck')}}
           v-tooltip(bottom, color='primary')
             template(v-slot:activator='{ on }')
-              v-btn.animated.fadeIn.wait-p11s(icon, tile, v-on='on', @click='previewShown = !previewShown').mx-0
+              v-btn.animated.fadeIn.wait-p2s(icon, tile, v-on='on', @click='previewShown = !previewShown').mx-0
                 v-icon mdi-book-open-outline
             span {{$t('editor:markup.togglePreviewPane')}}
     .editor-markdown-main
@@ -164,7 +169,13 @@
       transition(name='editor-markdown-preview')
         .editor-markdown-preview(v-if='previewShown')
           .editor-markdown-preview-content.contents(ref='editorPreviewContainer')
-            div(ref='editorPreview', v-html='previewHTML')
+            div(
+              ref='editorPreview'
+              v-html='previewHTML'
+              :spellcheck='spellModeActive'
+              :contenteditable='spellModeActive'
+              @blur='spellModeActive = false'
+              )
 
     v-system-bar.editor-markdown-sysbar(dark, status, color='grey darken-3')
       .caption.editor-markdown-sysbar-locale {{locale.toUpperCase()}}
@@ -372,6 +383,7 @@ export default {
       previewShown: true,
       previewHTML: '',
       helpShown: false,
+      spellModeActive: false,
       insertLinkDialog: false
     }
   },
@@ -396,6 +408,13 @@ export default {
           Array.from(this.$refs.editorPreview.querySelectorAll('pre.line-numbers')).forEach(pre => pre.classList.add('prismjs'))
         })
       }
+    },
+    spellModeActive (newValue, oldValue) {
+      if (newValue) {
+        this.$nextTick(() => {
+          this.$refs.editorPreview.focus()
+        })
+      }
     }
   },
   methods: {
@@ -828,6 +847,10 @@ $editor-height-mobile: calc(100vh - 112px - 16px);
         height: $editor-height-mobile;
       }
 
+      > div {
+        outline: none;
+      }
+
       p.line {
         overflow-wrap: break-word;
       }