this.handleMouseDown(e)} >
@@ -309,7 +313,7 @@ class MarkdownSplitEditor extends React.Component {
tabInde='0'
value={value}
onCheckboxClick={(e) => this.handleCheckboxClick(e)}
- onScroll={this.handlePreviewScroll.bind(this)}
+ onScroll={(e) => this.handlePreviewScroll(e)}
showCopyNotification={config.ui.showCopyNotification}
storagePath={storage.path}
noteKey={noteKey}
diff --git a/browser/components/SnippetTab.styl b/browser/components/SnippetTab.styl
index a31b8594..d101f318 100644
--- a/browser/components/SnippetTab.styl
+++ b/browser/components/SnippetTab.styl
@@ -3,19 +3,30 @@
flex 1
min-width 70px
overflow hidden
+ border-left 1px solid $ui-borderColor
+ border-top 1px solid $ui-borderColor
&:hover
+ background-color alpha($ui-button--active-backgroundColor, 20%)
.deleteButton
- color $ui-inactive-text-color
- &:hover
- background-color darken($ui-backgroundColor, 15%)
- &:active
- color white
- background-color $ui-active-color
+ color: $ui-text-color
+ visibility visible
+ transition 0.15s
+ .button
+ color: $ui-text-color
+ transition 0.15s
.root--active
@extend .root
min-width 100px
- border-bottom $ui-border
+ background-color alpha($ui-button--active-backgroundColor, 60%)
+ .deleteButton
+ visibility visible
+ color: $ui-text-color
+ transition 0.15s
+ .button
+ font-weight bold
+ color: $ui-text-color
+ transition 0.15s
.button
width 100%
@@ -27,8 +38,7 @@
background-color transparent
transition 0.15s
border-left 4px solid transparent
- &:hover
- background-color $ui-button--hover-backgroundColor
+ color $ui-inactive-text-color
.deleteButton
position absolute
@@ -42,6 +52,7 @@
color $ui-inactive-text-color
background-color transparent
border-radius 2px
+ visibility hidden
.input
height 29px
@@ -50,76 +61,66 @@
width 100%
outline none
+body[data-theme="default"], body[data-theme="white"]
+ .root--active
+ &:hover
+ background-color alpha($ui-button--active-backgroundColor, 60%)
+
body[data-theme="dark"]
.root
- color $ui-dark-text-color
border-color $ui-dark-borderColor
+ border-top 1px solid $ui-dark-borderColor
&:hover
- background-color $ui-dark-button--hover-backgroundColor
+ background-color alpha($ui-dark-button--active-backgroundColor, 20%)
+ transition 0.15s
+ .button
+ color $ui-dark-text-color
+ transition 0.15s
.deleteButton
- color $ui-dark-inactive-text-color
- &:hover
- background-color darken($ui-dark-button--hover-backgroundColor, 15%)
- &:active
- color $ui-dark-text-color
- background-color $ui-dark-button--active-backgroundColor
+ color $ui-dark-text-color
+ transition 0.15s
.root--active
- color $ui-dark-text-color
- border-color $ui-dark-borderColor
- &:hover
- background-color $ui-dark-button--hover-backgroundColor
- .deleteButton
- color $ui-dark-inactive-text-color
- &:hover
- background-color darken($ui-dark-button--hover-backgroundColor, 15%)
- &:active
- color $ui-dark-text-color
- background-color $ui-dark-button--active-backgroundColor
+ background-color $ui-dark-button--active-backgroundColor
+ border-left 1px solid $ui-dark-borderColor
+ border-top 1px solid $ui-dark-borderColor
+ .button
+ color $ui-dark-text-color
+ .deleteButton
+ color $ui-dark-text-color
.button
border none
- color $ui-dark-text-color
background-color transparent
transition color background-color 0.15s
border-left 4px solid transparent
- &:hover
- color $ui-dark-text-color
- background-color $ui-dark-button--hover-backgroundColor
.input
- background-color $ui-dark-button--hover-backgroundColor
+ background-color $ui-dark-button--active-backgroundColor
color $ui-dark-text-color
-
- .deleteButton
- color alpha($ui-dark-text-color, 30%)
+ transition 0.15s
body[data-theme="solarized-dark"]
.root
- color $ui-solarized-dark-text-color
- border-color $ui-dark-borderColor
- &:hover
- background-color $ui-solarized-dark-noteDetail-backgroundColor
- .deleteButton
- color $ui-solarized-dark-text-color
- &:hover
- background-color darken($ui-solarized-dark-noteDetail-backgroundColor, 15%)
- &:active
- color $ui-solarized-dark-text-color
- background-color $ui-dark-button--active-backgroundColor
-
- .root--active
- color $ui-solarized-dark-text-color
border-color $ui-solarized-dark-borderColor
&:hover
background-color $ui-solarized-dark-noteDetail-backgroundColor
+ transition 0.15s
.deleteButton
- color $ui-solarized-dark-text-color
- &:hover
- background-color darken($ui-solarized-dark-noteDetail-backgroundColor, 15%)
- &:active
- color $ui-solarized-dark-text-color
- background-color $ui-dark-button--active-backgroundColor
+ color $ui-solarized-dark-button--active-color
+ transition 0.15s
+ .button
+ color $ui-solarized-dark-button--active-color
+ transition 0.15s
+
+ .root--active
+ color $ui-solarized-dark-button--active-color
+ background-color $ui-solarized-dark-button-backgroundColor
+ border-color $ui-solarized-dark-borderColor
+ .deleteButton
+ color $ui-solarized-dark-button--active-color
+ .button
+ color $ui-solarized-dark-button--active-color
.button
border none
@@ -127,101 +128,75 @@ body[data-theme="solarized-dark"]
background-color transparent
transition color background-color 0.15s
border-left 4px solid transparent
- &:hover
- color $ui-solarized-dark-text-color
- background-color $ui-solarized-dark-noteDetail-backgroundColor
.input
background-color $ui-solarized-dark-noteDetail-backgroundColor
- color $ui-solarized-dark-text-color
-
- .deleteButton
- color alpha($ui-solarized-dark-text-color, 30%)
+ color $ui-solarized-dark-button--active-color
+ transition 0.15s
body[data-theme="monokai"]
.root
- color $ui-monokai-text-color
- border-color $ui-dark-borderColor
- &:hover
- background-color $ui-monokai-noteDetail-backgroundColor
- .deleteButton
- color $ui-monokai-text-color
- &:hover
- background-color darken($ui-monokai-noteDetail-backgroundColor, 15%)
- &:active
- color $ui-monokai-text-color
- background-color $ui-dark-button--active-backgroundColor
-
- .root--active
- color $ui-monokai-text-color
border-color $ui-monokai-borderColor
&:hover
background-color $ui-monokai-noteDetail-backgroundColor
+ transition 0.15s
.deleteButton
color $ui-monokai-text-color
- &:hover
- background-color darken($ui-monokai-noteDetail-backgroundColor, 15%)
- &:active
- color $ui-monokai-text-color
- background-color $ui-dark-button--active-backgroundColor
+ transition 0.15s
+ .button
+ color $ui-monokai-text-color
+ transition 0.15s
+ .root--active
+ color $ui-monokai-active-color
+ background-color $ui-monokai-button-backgroundColor
+ border-color $ui-monokai-borderColor
+ .deleteButton
+ color $ui-monokai-text-color
+ .button
+ color $ui-monokai-active-color
+
.button
border none
- color $ui-monokai-text-color
+ color $ui-inactive-text-color
background-color transparent
transition color background-color 0.15s
border-left 4px solid transparent
- &:hover
- color $ui-monokai-text-color
- background-color $ui-monokai-noteDetail-backgroundColor
.input
background-color $ui-monokai-noteDetail-backgroundColor
color $ui-monokai-text-color
-
- .deleteButton
- color alpha($ui-monokai-text-color, 30%)
+ transition 0.15s
body[data-theme="dracula"]
.root
- color $ui-dracula-text-color
- border-color $ui-dark-borderColor
- &:hover
- background-color $ui-dracula-noteDetail-backgroundColor
- .deleteButton
- color $ui-dracula-text-color
- &:hover
- background-color darken($ui-dracula-noteDetail-backgroundColor, 15%)
- &:active
- color $ui-dracula-text-color
- background-color $ui-dark-button--active-backgroundColor
-
- .root--active
- color $ui-dracula-text-color
border-color $ui-dracula-borderColor
&:hover
background-color $ui-dracula-noteDetail-backgroundColor
+ transition 0.15s
.deleteButton
color $ui-dracula-text-color
- &:hover
- background-color darken($ui-dracula-noteDetail-backgroundColor, 15%)
- &:active
- color $ui-dracula-text-color
- background-color $ui-dark-button--active-backgroundColor
+ transition 0.15s
+ .button
+ color $ui-dracula-text-color
+ transition 0.15s
+
+ .root--active
+ color $ui-dracula-text-color
+ background-color $ui-dracula-button-backgroundColor
+ border-color $ui-dracula-borderColor
+ .deleteButton
+ color $ui-dracula-text-color
+ .button
+ color $ui-dracula-active-color
.button
border none
- color $ui-dracula-text-color
+ color $ui-inactive-text-color
background-color transparent
transition color background-color 0.15s
border-left 4px solid transparent
- &:hover
- color $ui-dracula-text-color
- background-color $ui-dracula-noteDetail-backgroundColor
.input
background-color $ui-dracula-noteDetail-backgroundColor
- color $ui-dracula-text-color
-
- .deleteButton
- color alpha($ui-dracula-text-color, 30%)
\ No newline at end of file
+ color $ui-dracula-text-color
\ No newline at end of file
diff --git a/browser/components/markdown.styl b/browser/components/markdown.styl
index b7f219b8..da767a9f 100644
--- a/browser/components/markdown.styl
+++ b/browser/components/markdown.styl
@@ -55,11 +55,12 @@ body
line-height 1.6
overflow-x hidden
background-color $ui-noteDetail-backgroundColor
+ // do not allow display line breaks
+ .katex-display > .katex
+ white-space nowrap
+ // allow inline line breaks
.katex
- font 400 1.2em 'KaTeX_Main'
- line-height 1.2em
white-space initial
- text-indent 0
.katex .mfrac>.vlist>span:nth-child(2)
top 0 !important
.katex-error
@@ -183,6 +184,10 @@ ul
display list-item
&.taskListItem
list-style none
+ &>input
+ margin-left -1.6em
+ &>p
+ margin-left -1.8em
p
margin 0
&>li>ul, &>li>ol
@@ -416,6 +421,26 @@ pre.fence
canvas, svg
max-width 100% !important
+ .gallery
+ width 100%
+ height 50vh
+
+ .carousel
+ .carousel-main img
+ min-width auto
+ max-width 100%
+ min-height auto
+ max-height 100%
+
+ .carousel-footer::-webkit-scrollbar-corner
+ background-color transparent
+
+ .carousel-main, .carousel-footer
+ background-color $ui-noteDetail-backgroundColor
+ .prev, .next
+ color $ui-text-color
+ background-color $ui-tag-backgroundColor
+
themeDarkBackground = darken(#21252B, 10%)
themeDarkText = #f9f9f9
themeDarkBorder = lighten(themeDarkBackground, 20%)
@@ -475,6 +500,14 @@ body[data-theme="dark"]
border-color themeDarkBorder
background-color themeDarkPreview
+ pre.fence
+ .gallery
+ .carousel-main, .carousel-footer
+ background-color $ui-dark-noteDetail-backgroundColor
+ .prev, .next
+ color $ui-dark-text-color
+ background-color $ui-dark-tag-backgroundColor
+
themeSolarizedDarkTableOdd = $ui-solarized-dark-noteDetail-backgroundColor
themeSolarizedDarkTableEven = darken($ui-solarized-dark-noteDetail-backgroundColor, 10%)
themeSolarizedDarkTableHead = themeSolarizedDarkTableEven
@@ -510,6 +543,14 @@ body[data-theme="solarized-dark"]
border-color themeDarkBorder
background-color $ui-solarized-dark-noteDetail-backgroundColor
+ pre.fence
+ .gallery
+ .carousel-main, .carousel-footer
+ background-color $ui-solarized-dark-noteDetail-backgroundColor
+ .prev, .next
+ color $ui-solarized-dark-button--active-color
+ background-color $ui-solarized-dark-button-backgroundColor
+
themeMonokaiTableOdd = $ui-monokai-noteDetail-backgroundColor
themeMonokaiTableEven = darken($ui-monokai-noteDetail-backgroundColor, 10%)
themeMonokaiTableHead = themeMonokaiTableEven
@@ -538,6 +579,7 @@ body[data-theme="monokai"]
border-right solid 1px themeMonokaiTableBorder
kbd
background-color themeDarkBackground
+
dl
border-color themeDarkBorder
background-color themeMonokaiTableHead
@@ -547,6 +589,14 @@ body[data-theme="monokai"]
border-color themeDarkBorder
background-color $ui-monokai-noteDetail-backgroundColor
+ pre.fence
+ .gallery
+ .carousel-main, .carousel-footer
+ background-color $ui-monokai-noteDetail-backgroundColor
+ .prev, .next
+ color $ui-monokai-button--active-color
+ background-color $ui-monokai-button-backgroundColor
+
themeDraculaTableOdd = $ui-dracula-noteDetail-backgroundColor
themeDraculaTableEven = darken($ui-dracula-noteDetail-backgroundColor, 10%)
themeDraculaTableHead = themeDraculaTableEven
@@ -575,6 +625,7 @@ body[data-theme="dracula"]
border-right solid 1px themeDraculaTableBorder
kbd
background-color themeDarkBackground
+
dl
border-color themeDarkBorder
background-color themeDraculaTableHead
@@ -583,3 +634,11 @@ body[data-theme="dracula"]
dd
border-color themeDarkBorder
background-color $ui-dracula-noteDetail-backgroundColor
+
+ pre.fence
+ .gallery
+ .carousel-main, .carousel-footer
+ background-color $ui-dracula-noteDetail-backgroundColor
+ .prev, .next
+ color $ui-dracula-button--active-color
+ background-color $ui-dracula-button-backgroundColor
diff --git a/browser/lib/markdown-toc-generator.js b/browser/lib/markdown-toc-generator.js
index eae448ec..af1c833f 100644
--- a/browser/lib/markdown-toc-generator.js
+++ b/browser/lib/markdown-toc-generator.js
@@ -2,51 +2,27 @@
* @fileoverview Markdown table of contents generator
*/
+import { EOL } from 'os'
import toc from 'markdown-toc'
-import diacritics from 'diacritics-map'
-import stripColor from 'strip-color'
import mdlink from 'markdown-link'
+import slugify from './slugify'
-const EOL = require('os').EOL
+const hasProp = Object.prototype.hasOwnProperty
/**
- * @caseSensitiveSlugify Custom slugify function
- * Same implementation that the original used by markdown-toc (node_modules/markdown-toc/lib/utils.js),
- * but keeps original case to properly handle https://github.com/BoostIO/Boostnote/issues/2067
+ * From @enyaxu/markdown-it-anchor
*/
-function caseSensitiveSlugify (str) {
- function replaceDiacritics (str) {
- return str.replace(/[À-ž]/g, function (ch) {
- return diacritics[ch] || ch
- })
- }
-
- function getTitle (str) {
- if (/^\[[^\]]+\]\(/.test(str)) {
- var m = /^\[([^\]]+)\]/.exec(str)
- if (m) return m[1]
- }
- return str
- }
-
- str = getTitle(str)
- str = stripColor(str)
- // str = str.toLowerCase() //let's be case sensitive
-
- // `.split()` is often (but not always) faster than `.replace()`
- str = str.split(' ').join('-')
- str = str.split(/\t/).join('--')
- str = str.split(/<\/?[^>]+>/).join('')
- str = str.split(/[|$&`~=\\\/@+*!?({[\]})<>=.,;:'"^]/).join('')
- str = str.split(/[。?!,、;:“”【】()〔〕[]﹃﹄“ ”‘’﹁﹂—…-~《》〈〉「」]/).join('')
- str = replaceDiacritics(str)
- return str
+function uniqueSlug (slug, slugs, opts) {
+ let uniq = slug
+ let i = opts.uniqueSlugStartIndex
+ while (hasProp.call(slugs, uniq)) uniq = `${slug}-${i++}`
+ slugs[uniq] = true
+ return uniq
}
-function linkify (tok, text, slug, opts) {
- var uniqeID = opts.num === 0 ? '' : '-' + opts.num
- tok.content = mdlink(text, '#' + slug + uniqeID)
- return tok
+function linkify (token) {
+ token.content = mdlink(token.content, '#' + token.slug)
+ return token
}
const TOC_MARKER_START = ''
@@ -91,8 +67,23 @@ export function generateInEditor (editor) {
* @returns generatedTOC String containing generated TOC
*/
export function generate (markdownText) {
- const generatedToc = toc(markdownText, {slugify: caseSensitiveSlugify, linkify: linkify})
- return TOC_MARKER_START + EOL + EOL + generatedToc.content + EOL + EOL + TOC_MARKER_END
+ const slugs = {}
+ const opts = {
+ uniqueSlugStartIndex: 1
+ }
+
+ const result = toc(markdownText, {
+ slugify: title => {
+ return uniqueSlug(slugify(title), slugs, opts)
+ },
+ linkify: false
+ })
+
+ const md = toc.bullets(result.json.map(linkify), {
+ highest: result.highest
+ })
+
+ return TOC_MARKER_START + EOL + EOL + md + EOL + EOL + TOC_MARKER_END
}
function wrapTocWithEol (toc, editor) {
diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js
index 2a7b66b0..0ea15ba9 100644
--- a/browser/lib/markdown.js
+++ b/browser/lib/markdown.js
@@ -7,7 +7,6 @@ import _ from 'lodash'
import ConfigManager from 'browser/main/lib/ConfigManager'
import katex from 'katex'
import { lastFindInArray } from './utils'
-import anchor from '@enyaxu/markdown-it-anchor'
function createGutter (str, firstLineNumber) {
if (Number.isNaN(firstLineNumber)) firstLineNumber = 1
@@ -118,14 +117,8 @@ class Markdown {
this.md.use(require('markdown-it-imsize'))
this.md.use(require('markdown-it-footnote'))
this.md.use(require('markdown-it-multimd-table'))
- this.md.use(anchor, {
- slugify: (title) => {
- var slug = encodeURI(title.trim()
- .replace(/[\]\[\!\"\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~]/g, '')
- .replace(/\s+/g, '-'))
- .replace(/\-+$/, '')
- return slug
- }
+ this.md.use(require('@enyaxu/markdown-it-anchor'), {
+ slugify: require('./slugify')
})
this.md.use(require('markdown-it-kbd'))
this.md.use(require('markdown-it-admonition'), {types: ['note', 'hint', 'attention', 'caution', 'danger', 'error']})
@@ -152,6 +145,21 @@ class Markdown {
${token.content}
`
},
+ gallery: token => {
+ const content = token.content.split('\n').slice(0, -1).map(line => {
+ const match = /!\[[^\]]*]\(([^\)]*)\)/.exec(line)
+ if (match) {
+ return match[1]
+ } else {
+ return line
+ }
+ }).join('\n')
+
+ return `
+ ${token.fileName}
+ ${content}
+ `
+ },
mermaid: token => {
return `
${token.fileName}
diff --git a/browser/lib/newNote.js b/browser/lib/newNote.js
index 0b64d0e1..9511f847 100644
--- a/browser/lib/newNote.js
+++ b/browser/lib/newNote.js
@@ -18,7 +18,8 @@ export function createMarkdownNote (storage, folder, dispatch, location, params,
folder: folder,
title: '',
tags,
- content: ''
+ content: '',
+ linesHighlighted: []
})
.then(note => {
const noteHash = note.key
@@ -56,7 +57,8 @@ export function createSnippetNote (storage, folder, dispatch, location, params,
{
name: '',
mode: config.editor.snippetDefaultLanguage || 'text',
- content: ''
+ content: '',
+ linesHighlighted: []
}
]
})
diff --git a/browser/lib/slugify.js b/browser/lib/slugify.js
new file mode 100644
index 00000000..a3447a90
--- /dev/null
+++ b/browser/lib/slugify.js
@@ -0,0 +1,17 @@
+import diacritics from 'diacritics-map'
+
+function replaceDiacritics (str) {
+ return str.replace(/[À-ž]/g, function (ch) {
+ return diacritics[ch] || ch
+ })
+}
+
+module.exports = function slugify (title) {
+ let slug = title.trim()
+
+ slug = replaceDiacritics(slug)
+
+ slug = slug.replace(/[^\w\s-]/g, '').replace(/\s+/g, '-')
+
+ return encodeURI(slug).replace(/\-+$/, '')
+}
diff --git a/browser/main/Detail/InfoPanel.js b/browser/main/Detail/InfoPanel.js
index 4ce610fa..15535186 100644
--- a/browser/main/Detail/InfoPanel.js
+++ b/browser/main/Detail/InfoPanel.js
@@ -70,22 +70,22 @@ class InfoPanel extends React.Component {
-
-
exportAsMd(e)}>
+ exportAsMd(e, 'export-md')}>
.md
- exportAsTxt(e)}>
+ exportAsTxt(e, 'export-txt')}>
.txt
- exportAsHtml(e)}>
+ exportAsHtml(e, 'export-html')}>
.html
diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js
index b4e7a5b3..bc6cd499 100755
--- a/browser/main/Detail/MarkdownNoteDetail.js
+++ b/browser/main/Detail/MarkdownNoteDetail.js
@@ -39,12 +39,14 @@ class MarkdownNoteDetail extends React.Component {
isMovingNote: false,
note: Object.assign({
title: '',
- content: ''
+ content: '',
+ linesHighlighted: []
}, props.note),
isLockButtonShown: false,
isLocked: false,
editorType: props.config.editor.type
}
+
this.dispatchTimer = null
this.toggleLockButton = this.handleToggleLockButton.bind(this)
@@ -71,7 +73,7 @@ class MarkdownNoteDetail extends React.Component {
if (!this.state.isMovingNote && (isNewNote || hasDeletedTags)) {
if (this.saveQueue != null) this.saveNow()
this.setState({
- note: Object.assign({}, nextProps.note)
+ note: Object.assign({linesHighlighted: []}, nextProps.note)
}, () => {
this.refs.content.reload()
if (this.refs.tags) this.refs.tags.reset()
@@ -361,6 +363,7 @@ class MarkdownNoteDetail extends React.Component {
value={note.content}
storageKey={note.storage}
noteKey={note.key}
+ linesHighlighted={note.linesHighlighted}
onChange={this.handleUpdateContent.bind(this)}
ignorePreviewPointerEvents={ignorePreviewPointerEvents}
/>
@@ -371,6 +374,7 @@ class MarkdownNoteDetail extends React.Component {
value={note.content}
storageKey={note.storage}
noteKey={note.key}
+ linesHighlighted={note.linesHighlighted}
onChange={this.handleUpdateContent.bind(this)}
ignorePreviewPointerEvents={ignorePreviewPointerEvents}
/>
diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js
index 4a38ffe5..ebe61ba9 100644
--- a/browser/main/Detail/SnippetNoteDetail.js
+++ b/browser/main/Detail/SnippetNoteDetail.js
@@ -48,7 +48,7 @@ class SnippetNoteDetail extends React.Component {
note: Object.assign({
description: ''
}, props.note, {
- snippets: props.note.snippets.map((snippet) => Object.assign({}, snippet))
+ snippets: props.note.snippets.map((snippet) => Object.assign({linesHighlighted: []}, snippet))
})
}
@@ -76,8 +76,9 @@ class SnippetNoteDetail extends React.Component {
const nextNote = Object.assign({
description: ''
}, nextProps.note, {
- snippets: nextProps.note.snippets.map((snippet) => Object.assign({}, snippet))
+ snippets: nextProps.note.snippets.map((snippet) => Object.assign({linesHighlighted: []}, snippet))
})
+
this.setState({
snippetIndex: 0,
note: nextNote
@@ -410,6 +411,8 @@ class SnippetNoteDetail extends React.Component {
return (e) => {
const snippets = this.state.note.snippets.slice()
snippets[index].content = this.refs['code-' + index].value
+ snippets[index].linesHighlighted = e.options.linesHighlighted
+
this.setState(state => ({note: Object.assign(state.note, {snippets: snippets})}))
this.setState(state => ({
note: state.note
@@ -602,7 +605,8 @@ class SnippetNoteDetail extends React.Component {
note.snippets = note.snippets.concat([{
name: '',
mode: config.editor.snippetDefaultLanguage || 'text',
- content: ''
+ content: '',
+ linesHighlighted: []
}])
const snippetIndex = note.snippets.length - 1
@@ -645,11 +649,18 @@ class SnippetNoteDetail extends React.Component {
if (infoPanel.style) infoPanel.style.display = infoPanel.style.display === 'none' ? 'inline' : 'none'
}
- showWarning () {
+ showWarning (e, msg) {
+ const warningMessage = (msg) => ({
+ 'export-txt': 'Text export',
+ 'export-md': 'Markdown export',
+ 'export-html': 'HTML export',
+ 'print': 'Print'
+ })[msg]
+
dialog.showMessageBox(remote.getCurrentWindow(), {
type: 'warning',
message: i18n.__('Sorry!'),
- detail: i18n.__('md/text import is available only a markdown note.'),
+ detail: i18n.__(warningMessage(msg) + ' is available only in markdown notes.'),
buttons: [i18n.__('OK')]
})
}
@@ -685,10 +696,8 @@ class SnippetNoteDetail extends React.Component {
const viewList = note.snippets.map((snippet, index) => {
const isActive = this.state.snippetIndex === index
-
let syntax = CodeMirror.findModeByName(convertModeName(snippet.mode))
if (syntax == null) syntax = CodeMirror.findModeByName('Plain Text')
-
return this.handleCodeChange(index)(e)}
ref={'code-' + index}
ignorePreviewPointerEvents={this.props.ignorePreviewPointerEvents}
@@ -705,6 +715,7 @@ class SnippetNoteDetail extends React.Component {
: this.handleCodeChange(index)(e)}
ref={'code-' + index}
+ enableSmartPaste={config.editor.enableSmartPaste}
+ hotkey={config.hotkey}
/>
}
@@ -800,7 +813,9 @@ class SnippetNoteDetail extends React.Component {
createdAt={formatDate(note.createdAt)}
exportAsMd={this.showWarning}
exportAsTxt={this.showWarning}
+ exportAsHtml={this.showWarning}
type={note.type}
+ print={this.showWarning}
/>
diff --git a/browser/main/Detail/SnippetNoteDetail.styl b/browser/main/Detail/SnippetNoteDetail.styl
index e3bb31c6..1af93645 100644
--- a/browser/main/Detail/SnippetNoteDetail.styl
+++ b/browser/main/Detail/SnippetNoteDetail.styl
@@ -31,7 +31,7 @@
.tabList
absolute left right
- top 55px
+ top 70px
height 30px
display flex
background-color $ui-noteDetail-backgroundColor
@@ -57,6 +57,9 @@
.tabList .tabButton
navWhiteButtonColor()
width 30px
+ border-left 1px solid $ui-borderColor
+ border-top 1px solid $ui-borderColor
+ border-right 1px solid $ui-borderColor
.tabView
absolute left right bottom
@@ -98,17 +101,34 @@
opacity 0
transition 0.1s
-body[data-theme="white"]
+body[data-theme="white"], body[data-theme="default"]
.root
box-shadow $note-detail-box-shadow
border none
+ .tabButton
+ &:hover
+ background-color alpha($ui-button--active-backgroundColor, 20%)
+ color $ui-text-color
+ transition 0.15s
+
body[data-theme="dark"]
.root
border-left 1px solid $ui-dark-borderColor
background-color $ui-dark-noteDetail-backgroundColor
box-shadow none
+ .tabList .tabButton
+ border-color $ui-dark-borderColor
+ &:hover
+ background-color alpha($ui-dark-button--active-backgroundColor, 20%)
+
+ .tabButton
+ &:hover
+ background-color alpha($ui-dark-button--active-backgroundColor, 20%)
+ color $ui-dark-text-color
+ transition 0.15s
+
.body
background-color $ui-dark-noteDetail-backgroundColor
@@ -118,7 +138,6 @@ body[data-theme="dark"]
border 1px solid $ui-dark-borderColor
.tabList
- background-color $ui-button--active-backgroundColor
background-color $ui-dark-noteDetail-backgroundColor
.tabList .list
@@ -150,6 +169,15 @@ body[data-theme="solarized-dark"]
color $ui-solarized-dark-text-color
border 1px solid $ui-solarized-dark-borderColor
+ .tabList .tabButton
+ border-color $ui-solarized-dark-borderColor
+
+ .tabButton
+ &:hover
+ color $ui-solarized-dark-button--active-color
+ background-color $ui-solarized-dark-noteDetail-backgroundColor
+ transition 0.15s
+
.tabList
background-color $ui-solarized-dark-noteDetail-backgroundColor
color $ui-solarized-dark-text-color
@@ -167,6 +195,14 @@ body[data-theme="monokai"]
color $ui-monokai-text-color
border 1px solid $ui-monokai-borderColor
+ .tabList .tabButton
+ border-color $ui-monokai-borderColor
+
+ .tabButton
+ &:hover
+ color $ui-monokai-text-color
+ background-color $ui-monokai-noteDetail-backgroundColor
+
.tabList
background-color $ui-monokai-noteDetail-backgroundColor
color $ui-monokai-text-color
@@ -184,6 +220,14 @@ body[data-theme="dracula"]
color $ui-dracula-text-color
border 1px solid $ui-dracula-borderColor
+ .tabList .tabButton
+ border-color $ui-dracula-borderColor
+
+ .tabButton
+ &:hover
+ color $ui-dracula-text-color
+ background-color $ui-dracula-noteDetail-backgroundColor
+
.tabList
background-color $ui-dracula-noteDetail-backgroundColor
color $ui-dracula-text-color
\ No newline at end of file
diff --git a/browser/main/Main.js b/browser/main/Main.js
index c426f2bd..556c5daf 100644
--- a/browser/main/Main.js
+++ b/browser/main/Main.js
@@ -96,12 +96,14 @@ class Main extends React.Component {
{
name: 'example.html',
mode: 'html',
- content: "\n\n