1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 09:46:22 +00:00

Merge v0.5.11

Conflicts:
	browser/main/index.js
	package.json
This commit is contained in:
Rokt33r
2016-04-29 12:25:55 +09:00
33 changed files with 723 additions and 64 deletions

3
.gitignore vendored
View File

@@ -1,4 +1,7 @@
.DS_Store
.env .env
Desktop.ini
Thumbs.db
node_modules/* node_modules/*
!node_modules/boost !node_modules/boost
/dist /dist

View File

@@ -96,7 +96,8 @@ export default class CodeEditor extends React.Component {
fontSize: config['editor-font-size'], fontSize: config['editor-font-size'],
fontFamily: config['editor-font-family'], fontFamily: config['editor-font-family'],
indentType: config['editor-indent-type'], indentType: config['editor-indent-type'],
indentSize: config['editor-indent-size'] indentSize: config['editor-indent-size'],
themeSyntax: config['theme-syntax']
} }
this.silentChange = false this.silentChange = false
@@ -114,7 +115,7 @@ export default class CodeEditor extends React.Component {
var editor = this.editor = ace.edit(el) var editor = this.editor = ace.edit(el)
editor.$blockScrolling = Infinity editor.$blockScrolling = Infinity
editor.renderer.setShowGutter(true) editor.renderer.setShowGutter(true)
editor.setTheme('ace/theme/xcode') editor.setTheme('ace/theme/' + this.state.themeSyntax)
editor.moveCursorTo(0, 0) editor.moveCursorTo(0, 0)
editor.setReadOnly(!!this.props.readOnly) editor.setReadOnly(!!this.props.readOnly)
editor.setFontSize(this.state.fontSize) editor.setFontSize(this.state.fontSize)
@@ -202,9 +203,13 @@ export default class CodeEditor extends React.Component {
fontSize: config['editor-font-size'], fontSize: config['editor-font-size'],
fontFamily: config['editor-font-family'], fontFamily: config['editor-font-family'],
indentType: config['editor-indent-type'], indentType: config['editor-indent-type'],
indentSize: config['editor-indent-size'] indentSize: config['editor-indent-size'],
themeSyntax: config['theme-syntax']
}, function () { }, function () {
var session = this.editor.getSession() var editor = this.editor
editor.setTheme('ace/theme/' + this.state.themeSyntax)
var session = editor.getSession()
session.setUseSoftTabs(this.state.indentType === 'space') session.setUseSoftTabs(this.state.indentType === 'space')
session.setTabSize(!isNaN(this.state.indentSize) ? parseInt(this.state.indentSize, 10) : 4) session.setTabSize(!isNaN(this.state.indentSize) ? parseInt(this.state.indentSize, 10) : 4)
}) })

View File

@@ -20,6 +20,7 @@ const sanitizeOpts = {
allowedClasses: { allowedClasses: {
'a': ['lineAnchor'], 'a': ['lineAnchor'],
'div': ['math'], 'div': ['math'],
'pre': ['hljs'],
'span': ['math', 'hljs-*'], 'span': ['math', 'hljs-*'],
'code': ['language-*'] 'code': ['language-*']
}, },

View File

@@ -9,11 +9,27 @@ import FinderDetail from './FinderDetail'
import actions, { selectArticle, searchArticle } from './actions' import actions, { selectArticle, searchArticle } from './actions'
import _ from 'lodash' import _ from 'lodash'
import dataStore from 'browser/lib/dataStore' import dataStore from 'browser/lib/dataStore'
import fetchConfig from '../lib/fetchConfig'
const electron = require('electron') const electron = require('electron')
const { clipboard, ipcRenderer, remote } = electron const { clipboard, ipcRenderer, remote } = electron
const path = require('path') const path = require('path')
let config = fetchConfig()
applyConfig(config)
ipcRenderer.on('config-apply', function (e, newConfig) {
config = newConfig
applyConfig(config)
})
function applyConfig () {
let body = document.body
body.setAttribute('data-theme', config['theme-ui'])
let hljsCss = document.getElementById('hljs-css')
hljsCss.setAttribute('href', '../node_modules/highlight.js/styles/' + config['theme-code'] + '.css')
}
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
window.addEventListener('keydown', function (e) { window.addEventListener('keydown', function (e) {
if (e.keyCode === 73 && e.metaKey && e.altKey) { if (e.keyCode === 73 && e.metaKey && e.altKey) {

View File

@@ -13,7 +13,10 @@ const defaultConfig = {
'preview-font-size': '14', 'preview-font-size': '14',
'preview-font-family': 'Lato', 'preview-font-family': 'Lato',
'switch-preview': 'blur', 'switch-preview': 'blur',
'disable-direct-write': false 'disable-direct-write': false,
'theme-ui': 'light',
'theme-code': 'xcode',
'theme-syntax': 'xcode'
} }
export default function fetchConfig () { export default function fetchConfig () {

78
browser/lib/hljsThemes.js Normal file
View File

@@ -0,0 +1,78 @@
const hljsThemeList = [
{caption: 'Default', name: 'default'},
{caption: 'Agate', name: 'agate'},
{caption: 'Androidstudio', name: 'androidstudio'},
{caption: 'Arduino Light', name: 'arduino-light'},
{caption: 'Arta', name: 'arta'},
{caption: 'Ascetic', name: 'ascetic'},
{caption: 'Atelier Cave Dark', name: 'atelier-cave-dark'},
{caption: 'Atelier Cave Light', name: 'atelier-cave-light'},
{caption: 'Atelier Dune Dark', name: 'atelier-dune-dark'},
{caption: 'Atelier Dune Light', name: 'atelier-dune-light'},
{caption: 'Atelier Estuary Dark', name: 'atelier-estuary-dark'},
{caption: 'Atelier Estuary Light', name: 'atelier-estuary-light'},
{caption: 'Atelier Forest Dark', name: 'atelier-forest-dark'},
{caption: 'Atelier Forest Light', name: 'atelier-forest-light'},
{caption: 'Atelier Heath Dark', name: 'atelier-heath-dark'},
{caption: 'Atelier Heath Light', name: 'atelier-heath-light'},
{caption: 'Atelier Lakeside Dark', name: 'atelier-lakeside-dark'},
{caption: 'Atelier Lakeside Light', name: 'atelier-lakeside-light'},
{caption: 'Atelier Plateau Dark', name: 'atelier-plateau-dark'},
{caption: 'Atelier Plateau Light', name: 'atelier-plateau-light'},
{caption: 'Atelier Savanna Dark', name: 'atelier-savanna-dark'},
{caption: 'Atelier Savanna Light', name: 'atelier-savanna-light'},
{caption: 'Atelier Seaside Dark', name: 'atelier-seaside-dark'},
{caption: 'Atelier Seaside Light', name: 'atelier-seaside-light'},
{caption: 'Atelier Sulphurpool Dark', name: 'atelier-sulphurpool-dark'},
{caption: 'Atelier Sulphurpool Light', name: 'atelier-sulphurpool-light'},
{caption: 'Brown Paper', name: 'brown-paper'},
{caption: 'Codepen Embed', name: 'codepen-embed'},
{caption: 'Color Brewer', name: 'color-brewer'},
{caption: 'Dark', name: 'dark'},
{caption: 'Darkula', name: 'darkula'},
{caption: 'Docco', name: 'docco'},
{caption: 'Dracula', name: 'dracula'},
{caption: 'Far', name: 'far'},
{caption: 'Foundation', name: 'foundation'},
{caption: 'Github Gist', name: 'github-gist'},
{caption: 'Github', name: 'github'},
{caption: 'Googlecode', name: 'googlecode'},
{caption: 'Grayscale', name: 'grayscale'},
{caption: 'Gruvbox Dark', name: 'gruvbox.dark'},
{caption: 'Gruvbox Light', name: 'gruvbox.light'},
{caption: 'Hopscotch', name: 'hopscotch'},
{caption: 'Hybrid', name: 'hybrid'},
{caption: 'Idea', name: 'idea'},
{caption: 'Ir Black', name: 'ir-black'},
{caption: 'Kimbie Dark', name: 'kimbie.dark'},
{caption: 'Kimbie Light', name: 'kimbie.light'},
{caption: 'Magula', name: 'magula'},
{caption: 'Mono Blue', name: 'mono-blue'},
{caption: 'Monokai Sublime', name: 'monokai-sublime'},
{caption: 'Monokai', name: 'monokai'},
{caption: 'Obsidian', name: 'obsidian'},
{caption: 'Paraiso Dark', name: 'paraiso-dark'},
{caption: 'Paraiso Light', name: 'paraiso-light'},
{caption: 'Pojoaque', name: 'pojoaque'},
{caption: 'Qtcreator Dark', name: 'qtcreator_dark'},
{caption: 'Qtcreator Light', name: 'qtcreator_light'},
{caption: 'Railscasts', name: 'railscasts'},
{caption: 'Rainbow', name: 'rainbow'},
{caption: 'School Book', name: 'school-book'},
{caption: 'Solarized Dark', name: 'solarized-dark'},
{caption: 'Solarized Light', name: 'solarized-light'},
{caption: 'Sunburst', name: 'sunburst'},
{caption: 'Tomorrow Night Blue', name: 'tomorrow-night-blue'},
{caption: 'Tomorrow Night Bright', name: 'tomorrow-night-bright'},
{caption: 'Tomorrow Night Eighties', name: 'tomorrow-night-eighties'},
{caption: 'Tomorrow Night', name: 'tomorrow-night'},
{caption: 'Tomorrow', name: 'tomorrow'},
{caption: 'Vs', name: 'vs'},
{caption: 'Xcode', name: 'xcode'},
{caption: 'Xt 256', name: 'xt256'},
{caption: 'Zenburn', name: 'zenburn'}
]
export default function hljsTheme () {
return hljsThemeList
}

View File

@@ -1,6 +1,6 @@
import markdownit from 'markdown-it' import markdownit from 'markdown-it'
import emoji from 'markdown-it-emoji' import emoji from 'markdown-it-emoji'
import math from 'markdown-it-math' import math from '@rokt33r/markdown-it-math'
import hljs from 'highlight.js' import hljs from 'highlight.js'
var md = markdownit({ var md = markdownit({
@@ -11,10 +11,14 @@ var md = markdownit({
highlight: function (str, lang) { highlight: function (str, lang) {
if (lang && hljs.getLanguage(lang)) { if (lang && hljs.getLanguage(lang)) {
try { try {
return hljs.highlight(lang, str).value return '<pre class="hljs"><code>' +
hljs.highlight(lang, str).value +
'</code></pre>'
} catch (e) {} } catch (e) {}
} }
return str.replace(/\&/g, '&amp;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;').replace(/\"/g, '&quot;') return '<pre class="hljs"><code>' +
str.replace(/\&/g, '&amp;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;').replace(/\"/g, '&quot;') +
'</code></pre>'
} }
}) })
md.use(emoji, { md.use(emoji, {

View File

@@ -7,10 +7,37 @@ require('!!style!css!stylus?sourceMap!../styles/main/index.styl')
import { openModal } from 'browser/lib/modal' import { openModal } from 'browser/lib/modal'
import OSSAnnounceModal from './modal/OSSAnnounceModal' import OSSAnnounceModal from './modal/OSSAnnounceModal'
import activityRecord from 'browser/lib/activityRecord' import activityRecord from 'browser/lib/activityRecord'
import fetchConfig from '../lib/fetchConfig'
const electron = require('electron') const electron = require('electron')
const ipc = electron.ipcRenderer const ipc = electron.ipcRenderer
const path = require('path') const path = require('path')
const remote = electron.remote
let config = fetchConfig()
applyConfig(config)
ipc.on('config-apply', function (e, newConfig) {
config = newConfig
applyConfig(config)
})
function applyConfig (config) {
let body = document.body
body.setAttribute('data-theme', config['theme-ui'])
let hljsCss = document.getElementById('hljs-css')
hljsCss.setAttribute('href', '../node_modules/highlight.js/styles/' + config['theme-code'] + '.css')
}
if (process.env.NODE_ENV !== 'production') {
window.addEventListener('keydown', function (e) {
if (e.keyCode === 73 && e.metaKey && e.altKey) {
remote.getCurrentWindow().toggleDevTools()
}
})
}
activityRecord.init() activityRecord.init()
window.addEventListener('online', function () { window.addEventListener('online', function () {
ipc.send('check-update', 'check-update') ipc.send('check-update', 'check-update')

View File

@@ -2,10 +2,12 @@ import React, { PropTypes } from 'react'
import linkState from 'browser/lib/linkState' import linkState from 'browser/lib/linkState'
import { updateUser } from '../../actions' import { updateUser } from '../../actions'
import fetchConfig from 'browser/lib/fetchConfig' import fetchConfig from 'browser/lib/fetchConfig'
import hljsTheme from 'browser/lib/hljsThemes'
const electron = require('electron') const electron = require('electron')
const ipc = electron.ipcRenderer const ipc = electron.ipcRenderer
const remote = electron.remote const remote = electron.remote
const ace = window.ace
const OSX = global.process.platform === 'darwin' const OSX = global.process.platform === 'darwin'
@@ -114,11 +116,13 @@ export default class AppSettingTab extends React.Component {
{userAlert.message} {userAlert.message}
</p> </p>
) : null ) : null
let aceThemeList = ace.require("ace/ext/themelist")
let hljsThemeList = hljsTheme()
return ( return (
<div className='AppSettingTab content'> <div className='AppSettingTab content'>
<div className='section'> <div className='section'>
<div className='sectionTitle'>User's info</div> <div className='sectionTitle'>User&apos;s info</div>
<div className='sectionInput'> <div className='sectionInput'>
<label>User name</label> <label>User name</label>
<input valueLink={this.linkState('user.name')} type='text'/> <input valueLink={this.linkState('user.name')} type='text'/>
@@ -129,7 +133,7 @@ export default class AppSettingTab extends React.Component {
</div> </div>
</div> </div>
<div className='section'> <div className='section'>
<div className='sectionTitle'>Text</div> <div className='sectionTitle'>Editor</div>
<div className='sectionInput'> <div className='sectionInput'>
<label>Editor Font Size</label> <label>Editor Font Size</label>
<input valueLink={this.linkState('config.editor-font-size')} onKeyDown={e => this.handleConfigKeyDown(e)} type='text'/> <input valueLink={this.linkState('config.editor-font-size')} onKeyDown={e => this.handleConfigKeyDown(e)} type='text'/>
@@ -154,6 +158,7 @@ export default class AppSettingTab extends React.Component {
</select> </select>
</div> </div>
</div> </div>
<div className='sectionTitle'>Preview</div>
<div className='sectionInput'> <div className='sectionInput'>
<label>Preview Font Size</label> <label>Preview Font Size</label>
<input valueLink={this.linkState('config.preview-font-size')} onKeyDown={e => this.handleConfigKeyDown(e)} type='text'/> <input valueLink={this.linkState('config.preview-font-size')} onKeyDown={e => this.handleConfigKeyDown(e)} type='text'/>
@@ -178,7 +183,34 @@ export default class AppSettingTab extends React.Component {
) )
: null : null
} }
<div className='sectionTitle'>Theme</div>
<div className='sectionSelect'>
<label>UI Theme</label>
<select valueLink={this.linkState('config.theme-ui')}>
<option value='light'>Light</option>
<option value='dark'>Dark</option>
</select>
</div>
<div className='sectionSelect'>
<label>Code block Theme</label>
<select valueLink={this.linkState('config.theme-code')}>
{
hljsThemeList.map(function(v, i){
return (<option value={v.name} key={v.name}>{v.caption}</option>)
})
}
</select>
</div>
<div className='sectionSelect'>
<label>Editor Theme</label>
<select valueLink={this.linkState('config.theme-syntax')}>
{
aceThemeList.themes.map(function(v, i){
return (<option value={v.name} key={v.name}>{v.caption}</option>)
})
}
</select>
</div>
<div className='sectionConfirm'> <div className='sectionConfirm'>
<button onClick={e => this.handleConfigSaveButtonClick(e)}>Save</button> <button onClick={e => this.handleConfigSaveButtonClick(e)}>Save</button>
</div> </div>

View File

@@ -63,7 +63,7 @@ export default class FolderRow extends React.Component {
} }
handleColorButtonClick (index) { handleColorButtonClick (index) {
return e => { return (e) => {
this.setState({ this.setState({
color: index, color: index,
isColorEditing: false isColorEditing: false
@@ -116,7 +116,7 @@ export default class FolderRow extends React.Component {
? 'active' ? 'active'
: null : null
return ( return (
<button onClick={e => this.handleColorButtonClick(index)(e)} className={className} key={index}> <button onClick={(e) => this.handleColorButtonClick(index)(e)} className={className} key={index}>
<FolderMark color={index}/> <FolderMark color={index}/>
</button> </button>
) )
@@ -125,7 +125,7 @@ export default class FolderRow extends React.Component {
return ( return (
<div className='FolderRow edit'> <div className='FolderRow edit'>
<div className='folderColor'> <div className='folderColor'>
<button onClick={e => this.handleColorSelectClick(e)} className='select'> <button onClick={(e) => this.handleColorSelectClick(e)} className='select'>
<FolderMark color={this.state.color}/> <FolderMark color={this.state.color}/>
</button> </button>
{this.state.isColorEditing {this.state.isColorEditing
@@ -139,11 +139,11 @@ export default class FolderRow extends React.Component {
} }
</div> </div>
<div className='folderName'> <div className='folderName'>
<input onKeyDown={e => this.handleNameInputKeyDown(e)} valueLink={this.linkState('name')} type='text'/> <input onKeyDown={(e) => this.handleNameInputKeyDown(e)} valueLink={this.linkState('name')} type='text'/>
</div> </div>
<div className='folderControl'> <div className='folderControl'>
<button onClick={e => this.handleSaveButtonClick(e)} className='primary'>Save</button> <button onClick={(e) => this.handleSaveButtonClick(e)} className='primary'>Save</button>
<button onClick={e => this.handleCancelButtonClick(e)}>Cancel</button> <button onClick={(e) => this.handleCancelButtonClick(e)}>Cancel</button>
</div> </div>
</div> </div>
) )
@@ -152,8 +152,8 @@ export default class FolderRow extends React.Component {
<div className='FolderRow delete'> <div className='FolderRow delete'>
<div className='folderDeleteLabel'>Are you sure to delete <strong>{folder.name}</strong> folder?</div> <div className='folderDeleteLabel'>Are you sure to delete <strong>{folder.name}</strong> folder?</div>
<div className='folderControl'> <div className='folderControl'>
<button onClick={e => this.handleDeleteConfirmButtonClick(e)} className='primary'>Sure</button> <button onClick={(e) => this.handleDeleteConfirmButtonClick(e)} className='primary'>Sure</button>
<button onClick={e => this.handleCancelButtonClick(e)}>Cancel</button> <button onClick={(e) => this.handleCancelButtonClick(e)}>Cancel</button>
</div> </div>
</div> </div>
) )
@@ -162,14 +162,14 @@ export default class FolderRow extends React.Component {
return ( return (
<div className='FolderRow'> <div className='FolderRow'>
<div className='sortBtns'> <div className='sortBtns'>
<button onClick={e => this.handleUpClick(e)}><i className='fa fa-sort-up fa-fw'/></button> <button onClick={(e) => this.handleUpClick(e)}><i className='fa fa-sort-up fa-fw'/></button>
<button onClick={e => this.handleDownClick(e)}><i className='fa fa-sort-down fa-fw'/></button> <button onClick={(e) => this.handleDownClick(e)}><i className='fa fa-sort-down fa-fw'/></button>
</div> </div>
<div className='folderColor'><FolderMark color={folder.color}/></div> <div className='folderColor'><FolderMark color={folder.color}/></div>
<div className='folderName'>{folder.name}</div> <div className='folderName'>{folder.name}</div>
<div className='folderControl'> <div className='folderControl'>
<button onClick={e => this.handleEditButtonClick(e)}><i className='fa fa-fw fa-edit'/></button> <button onClick={(e) => this.handleEditButtonClick(e)}><i className='fa fa-fw fa-edit'/></button>
<button onClick={e => this.handleDeleteButtonClick(e)}><i className='fa fa-fw fa-close'/></button> <button onClick={(e) => this.handleDeleteButtonClick(e)}><i className='fa fa-fw fa-close'/></button>
</div> </div>
</div> </div>
) )

View File

@@ -75,10 +75,10 @@ export default class FolderSettingTab extends React.Component {
{folderElements} {folderElements}
<div className='newFolder'> <div className='newFolder'>
<div className='folderName'> <div className='folderName'>
<input onKeyDown={e => this.handleNewFolderNameKeyDown(e)} valueLink={this.linkState('name')} type='text' placeholder='New Folder'/> <input onKeyDown={(e) => this.handleNewFolderNameKeyDown(e)} valueLink={this.linkState('name')} type='text' placeholder='New Folder'/>
</div> </div>
<div className='folderControl'> <div className='folderControl'>
<button onClick={e => this.handleSaveButtonClick(e)} className='primary'>Add</button> <button onClick={(e) => this.handleSaveButtonClick(e)} className='primary'>Add</button>
</div> </div>
</div> </div>
{alertElement} {alertElement}

View File

@@ -8,7 +8,6 @@ import ContactTab from './Preference/ContactTab'
import { closeModal } from 'browser/lib/modal' import { closeModal } from 'browser/lib/modal'
const APP = 'APP' const APP = 'APP'
const HELP = 'HELP'
const FOLDER = 'FOLDER' const FOLDER = 'FOLDER'
const CONTACT = 'CONTACT' const CONTACT = 'CONTACT'
@@ -64,8 +63,6 @@ class Preferences extends React.Component {
let { user, folders, dispatch } = this.props let { user, folders, dispatch } = this.props
switch (this.state.currentTab) { switch (this.state.currentTab) {
case HELP:
return (<HelpTab/>)
case FOLDER: case FOLDER:
return ( return (
<FolderSettingTab <FolderSettingTab

View File

@@ -33,10 +33,10 @@ export default class Tutorial extends React.Component {
return ( return (
<div className='Tutorial modal'> <div className='Tutorial modal'>
<button onClick={e => this.handlePriorSlideClick()} className={'priorBtn' + (this.state.slideIndex === 0 ? ' hide' : '')}> <button onClick={(e) => this.handlePriorSlideClick()} className={'priorBtn' + (this.state.slideIndex === 0 ? ' hide' : '')}>
<i className='fa fa-fw fa-angle-left'/> <i className='fa fa-fw fa-angle-left'/>
</button> </button>
<button onClick={e => this.handleNextSlideClick()} className={'nextBtn' + (this.state.slideIndex === 4 ? ' hide' : '')}> <button onClick={(e) => this.handleNextSlideClick()} className={'nextBtn' + (this.state.slideIndex === 4 ? ' hide' : '')}>
<i className='fa fa-fw fa-angle-right'/> <i className='fa fa-fw fa-angle-right'/>
</button> </button>
{content} {content}
@@ -101,7 +101,7 @@ export default class Tutorial extends React.Component {
return (<div className='slide slide4'> return (<div className='slide slide4'>
<div className='title'>Are you ready?</div> <div className='title'>Are you ready?</div>
<div className='content'> <div className='content'>
<button onClick={e => this.startButtonClick(e)}>Start<br/>Boost</button> <button onClick={(e) => this.startButtonClick(e)}>Start<br/>Boost</button>
</div> </div>
</div>) </div>)
default: default:

View File

@@ -76,7 +76,7 @@ function folders (state = initialFolders, action) {
if (newFolder.name == null || newFolder.name.length === 0) throw new Error('Folder name is required') if (newFolder.name == null || newFolder.name.length === 0) throw new Error('Folder name is required')
if (newFolder.name.match(/\//)) throw new Error('`/` is not available for folder name') if (newFolder.name.match(/\//)) throw new Error('`/` is not available for folder name')
let conflictFolder = _.find(state, folder => folder.name.toLowerCase() === newFolder.name.toLowerCase()) let conflictFolder = _.find(state, (folder) => folder.name.toLowerCase() === newFolder.name.toLowerCase())
if (conflictFolder != null) throw new Error(`${conflictFolder.name} already exists!`) if (conflictFolder != null) throw new Error(`${conflictFolder.name} already exists!`)
state.push(newFolder) state.push(newFolder)
@@ -98,7 +98,7 @@ function folders (state = initialFolders, action) {
if (targetFolder == null) throw new Error('Folder doesnt exist') if (targetFolder == null) throw new Error('Folder doesnt exist')
// Name conflict check // Name conflict check
if (targetFolder.name !== folder.name) { if (targetFolder.name !== folder.name) {
let conflictFolder = _.find(state, _folder => { let conflictFolder = _.find(state, (_folder) => {
return folder.name.toLowerCase() === _folder.name.toLowerCase() && folder.key !== _folder.key return folder.name.toLowerCase() === _folder.name.toLowerCase() && folder.key !== _folder.key
}) })
if (conflictFolder != null) throw new Error('Name conflicted') if (conflictFolder != null) throw new Error('Name conflicted')
@@ -116,7 +116,7 @@ function folders (state = initialFolders, action) {
if (state.length < 2) throw new Error('Folder must exist more than one') if (state.length < 2) throw new Error('Folder must exist more than one')
let targetKey = action.data.key let targetKey = action.data.key
let targetIndex = _.findIndex(state, folder => folder.key === targetKey) let targetIndex = _.findIndex(state, (folder) => folder.key === targetKey)
if (targetIndex >= 0) { if (targetIndex >= 0) {
state.splice(targetIndex, 1) state.splice(targetIndex, 1)
} }
@@ -161,9 +161,9 @@ function articles (state = initialArticles, action) {
{ {
let modified = action.data.article let modified = action.data.article
let targetKey = action.data.key let targetKey = action.data.key
let originalIndex = _.findIndex(state.data, _article => targetKey === _article.key) let originalIndex = _.findIndex(state.data, (_article) => targetKey === _article.key)
if (originalIndex === -1) return state if (originalIndex === -1) return state
let modifiedIndex = _.findIndex(state.modified, _article => targetKey === _article.key) let modifiedIndex = _.findIndex(state.modified, (_article) => targetKey === _article.key)
modified = compareArticle(state.data[originalIndex], modified) modified = compareArticle(state.data[originalIndex], modified)
if (modified == null) { if (modified == null) {

View File

@@ -3,6 +3,7 @@
@import '../mixins/*' @import '../mixins/*'
global-reset() global-reset()
@import '../shared/*' @import '../shared/*'
@import '../theme/*'
iptBgColor = #E6E6E6 iptBgColor = #E6E6E6
iptFocusBorderColor = #369DCD iptFocusBorderColor = #369DCD

View File

@@ -25,7 +25,6 @@ infoButton()
padding 10px padding 10px
background-color #E6E6E6 background-color #E6E6E6
border-top 1px solid borderColor border-top 1px solid borderColor
border-left 1px solid borderColor
&.empty &.empty
.ArticleDetail-empty-box .ArticleDetail-empty-box
line-height 72px line-height 72px

View File

@@ -30,6 +30,8 @@ articleItemColor = #777
height 20px height 20px
color articleItemColor color articleItemColor
font-size 11px font-size 11px
i
margin-right 4px
.folderName .folderName
overflow ellipsis overflow ellipsis
display inline-block display inline-block

View File

@@ -11,6 +11,7 @@ articleCount = #999
.userInfo .userInfo
height 60px height 60px
display block display block
box-sizing content-box
border-bottom 1px solid borderColor border-bottom 1px solid borderColor
.userProfileName .userProfileName
color brandColor color brandColor

View File

@@ -7,6 +7,7 @@ global-reset()
@import './ArticleList' @import './ArticleList'
@import './ArticleDetail' @import './ArticleDetail'
@import './modal/*' @import './modal/*'
@import '../theme/*'
DEFAULT_FONTS = 'Lato', helvetica, arial, sans-serif DEFAULT_FONTS = 'Lato', helvetica, arial, sans-serif

View File

@@ -72,7 +72,7 @@ iptFocusBorderColor = #369DCD
.confirmBtn .confirmBtn
display block display block
position absolute position absolute
left 180px left 205px
bottom 44px bottom 44px
width 240px width 240px
font-size 24px font-size 24px

View File

@@ -8,7 +8,7 @@ iptFocusBorderColor = #369DCD
border-radius 5px border-radius 5px
overflow hidden overflow hidden
width 720px width 720px
height 450px height 600px
&>.header &>.header
absolute top left right absolute top left right
height 50px height 50px

View File

@@ -6,7 +6,7 @@ marked()
background-color alpha(red, 0.1) background-color alpha(red, 0.1)
color darken(red, 15%) color darken(red, 15%)
padding 5px padding 5px
margin -5px margin 5px 0
border-radius 5px border-radius 5px
sup sup
position relative position relative
@@ -116,9 +116,7 @@ marked()
border solid 1px alpha(borderColor, 0.3) border solid 1px alpha(borderColor, 0.3)
border-radius 4px border-radius 4px
font-size 0.9em font-size 0.9em
color black
text-decoration none text-decoration none
background-color #F6F6F6
margin-right 2px margin-right 2px
*:not(a.lineAnchor) + code *:not(a.lineAnchor) + code
margin-left 2px margin-left 2px
@@ -128,14 +126,15 @@ marked()
border-radius 5px border-radius 5px
overflow-x auto overflow-x auto
margin 0 0 15px margin 0 0 15px
background-color #F6F6F6
line-height 1.35em line-height 1.35em
&>code &>code
margin 0 margin 0
padding 0 padding 0
border none border none
border-radius 0 border-radius 0
color black &>pre
border none
margin -5px
table table
width 100% width 100%
margin 15px 0 25px margin 15px 0 25px

View File

@@ -0,0 +1,460 @@
@import '../vars'
themeDarkBackground = darken(#21252B, 10%)
themeDarkModal = darken(#21252B, 10%)
themeDarkList = #282C34
themeDarkPreview = #282C34
themeDarkSidebar = darken(#21252B, 10%)
themeDarkText = #DDDDDD
themeDarkBorder = lighten(themeDarkBackground, 20%)
themeDarkTopicColor = #369dcd
themeDarkTooltip = rgba(0, 0, 0, 0.7)
themeDarkFocusText = #FFFFFF
themeDarkFocusButton = lighten(themeDarkTopicColor, 30%)
themeDarkBoxShadow = alpha(lighten(themeDarkTopicColor, 10%), 0.4);
themeDarkTableOdd = themeDarkPreview
themeDarkTableEven = darken(themeDarkPreview, 10%)
themeDarkTableHead = themeDarkTableEven
themeDarkTableBorder = themeDarkBorder
themeDarkModalButtonDefault = themeDarkPreview
themeDarkModalButtonDanger = #BF360C
body[data-theme="dark"]
background-color themeDarkBackground
.Main
.ArticleNavigator .userInfo .settingBtn .tooltip,
.ArticleNavigator .ArticleNavigator-folders .ArticleNavigator-folders-header .addBtn .tooltip,
.ArticleTopBar>.ArticleTopBar-left>.ArticleTopBar-left-search .tooltip,
.ArticleTopBar>.ArticleTopBar-left .ArticleTopBar-left-control button.ArticleTopBar-left-control-new-post-button .tooltip
.ArticleTopBar>.ArticleTopBar-right>button .tooltip,
.ArticleTopBar>.ArticleTopBar-right>.ArticleTopBar-right-links-button-dropdown,
.ArticleDetail .ArticleDetail-info .ArticleDetail-info-control>button .tooltip,
.ArticleDetail .ArticleDetail-info .ArticleDetail-info-control .ShareButton-open-button .tooltip {
background-color themeDarkTooltip
}
.ArticleNavigator
border-color lighten(themeDarkBorder, 10%)
background-color themeDarkSidebar
.userInfo
border-color themeDarkBorder
.userName
color themeDarkText
.ArticleNavigator-folders
border-color lighten(themeDarkBorder, 10%)
background-color themeDarkSidebar
.ArticleNavigator-folders-header
border-color themeDarkBorder
.title
color themeDarkText
.folderList,
.folderList>button
color themeDarkText
.folderList>button
transition 0.1s
&:hover
background-color lighten(themeDarkSidebar, 10%)
&.active,
$:active
background-color darken(brandColor, 15%)
.userInfo .settingBtn,
.ArticleNavigator-folders .ArticleNavigator-folders-header .addBtn
transition 0.1s
color themeDarkText
border none
background-color lighten(themeDarkBackground, 10%)
.userInfo .settingBtn:hover,
.ArticleNavigator-folders .ArticleNavigator-folders-header .addBtn:hover
background-color themeDarkTopicColor
.userInfo .settingBtn:focus,
.ArticleNavigator-folders .ArticleNavigator-folders-header .addBtn:focus
background-color darken(themeDarkTopicColor, 20%)
.ArticleTopBar
color themeDarkText
background-color themeDarkBackground
.ArticleTopBar-left
.ArticleTopBar-left-search input
color themeDarkText
background-color lighten(themeDarkBackground, 10%)
.ArticleTopBar-left-control button.ArticleTopBar-left-control-new-post-button
color themeDarkText
background-color lighten(themeDarkBackground, 10%)
&:hover
color themeDarkText
background-color themeDarkTopicColor
&:focus
color themeDarkText
background-color darken(themeDarkTopicColor, 20%)
.ArticleTopBar-right
&>button
color themeDarkText
border none
background-color lighten(themeDarkBackground, 10%)
&:hover
color themeDarkText
background-color themeDarkTopicColor
&:focus
color themeDarkText
background-color darken(themeDarkTopicColor, 20%)
.ArticleList
color themeDarkText
border-color themeDarkBorder
background-color themeDarkList
.ArticleList-item
color themeDarkText
background-color themeDarkList
&:hover
background-color lighten(themeDarkList, 5%)
.ArticleList-item-top
.folderName
color darken(themeDarkText, 15%)
.divider
border-color themeDarkBorder
.ArticleDetail
color themeDarkText
border-color themeDarkBorder
background-color themeDarkBackground
.ArticleDetail-info
.ArticleDetail-info-folder
color themeDarkText
background-color lighten(themeDarkBackground, 10%)
.ArticleDetail-info-row2 .TagSelect .TagSelect-tags
border-color themeDarkBorder
background-color themeDarkBackground
input
color themeDarkText
.ArticleDetail-info-control
&>button,
& .ShareButton-open-button
transition 0.1s
color themeDarkText
border none
background-color lighten(themeDarkBackground, 10%)
&>button:hover,
& .ShareButton-open-button:hover
background-color themeDarkTopicColor
&>button:focus,
& .ShareButton-open-button:focus
background-color darken(themeDarkTopicColor, 20%)
& .ShareButton-dropdown
color themeDarkText
box-shadow 0px 0px 10px 1px themeDarkBoxShadow;
border 1px solid themeDarkBorder;
background-color themeDarkBackground
& .ShareButton-dropdown>button
color themeDarkText
&:hover
background-color darken(themeDarkTopicColor, 20%)
.ArticleDetail-panel
border-color themeDarkBackground
.ArticleDetail-panel-header,
.ArticleDetail-panel-header .ArticleDetail-panel-header-title input
color themeDarkText
border-color themeDarkBorder
background-color themeDarkPreview
.ArticleEditor
.CodeEditor
border-color themeDarkBorder
border-radius 0
&>.ArticleDetail-panel-header .ArticleDetail-panel-header-mode
transition 0.1s
color themeDarkText
background-color lighten(themeDarkBackground, 10%)
input
color themeDarkText
&.idle
border-color themeDarkBorder
background-color themeDarkPreview
&.idle:hover
background-color themeDarkTopicColor
&.edit .ModeSelect-options
color themeDarkText
border-color themeDarkBackground
background-color themeDarkBackground
.ModeSelect-options-item
&:hover
color lighten(themeDarkText, 100%)
background-color darken(themeDarkTopicColor, 20%)
.ModalBase
.modal
color themeDarkText
background-color themeDarkModal
box-shadow 0px 0px 10px 1px themeDarkBoxShadow;
input
color themeDarkText
border-color lighten(themeDarkBackground, 10%)
background-color lighten(themeDarkBackground, 10%)
&:hover
border-color themeDarkBorder
&:focus
border-color themeDarkTopicColor
button
&:hover
background-color lighten(themeDarkBackground, 10%)
.CreateNewFolder.modal
.closeBtn
transition 0.1s
border-radius 24px
color themeDarkText
&:hover
background-color darken(#BF360C, 10%)
.confirmBtn
background-color darken(brandColor, 10%)
&:hover
background-color brandColor
.DeleteArticleModal.modal
.control
button
transition 0.1s
color themeDarkText
border-color lighten(themeDarkModalButtonDefault, 20%)
background-color themeDarkModalButtonDefault
&:hover
background-color: lighten(themeDarkModalButtonDefault, 10%)
&:focus
border-color themeDarkTopicColor
&.danger
background-color themeDarkModalButtonDanger
border-color lighten(themeDarkModalButtonDanger, 30%)
&:hover
background-color: lighten(themeDarkModalButtonDanger, 10%)
&:focus
border-color lighten(themeDarkModalButtonDanger, 50%)
.Preferences.modal
.sectionInput input,
.sectionSelect select
.sectionMultiSelect .sectionMultiSelect-input select
color themeDarkText
border-color lighten(themeDarkBackground, 10%)
background-color lighten(themeDarkBackground, 10%)
&:hover
border-color themeDarkBorder
&:focus
border-color themeDarkTopicColor
.header
border-color themeDarkBorder
background-color darken(themeDarkModal, 40%)
.nav
border-color themeDarkBorder
background-color darken(themeDarkModal, 20%)
&>button
&:hover
color themeDarkFocusText
background-color lighten(themeDarkModal, 10%)
&.active,
&:active
background-color darken(brandColor, 15%)
.section
border-color themeDarkBorder
&>.content
&.AppSettingTab
.description
code
color themeDarkText
border-color darken(themeDarkBorder, 10%)
background-color lighten(themeDarkPreview, 5%)
&.FolderSettingTab
.folderTable
&>div
border-color themeDarkBorder
&:last-child
border-color transparent
&>div.FolderRow
.sortBtns button
transition 0.1s
color themeDarkText
&:hover
color themeDarkFocusButton
.folderColor
&>button,
.options
color themeDarkText
border-color themeDarkBorder
&>button
border-color lighten(themeDarkBackground, 10%)
background-color lighten(themeDarkBackground, 10%)
&:hover
border-color themeDarkBorder
&:focus
border-color themeDarkTopicColor
.options
background-color themeDarkBackground
&>div.FolderRow .folderName input,
&>div.newFolder .folderName input
color themeDarkText
border-color lighten(themeDarkBackground, 10%)
background-color lighten(themeDarkBackground, 10%)
&:hover
border-color themeDarkBorder
&:focus
border-color themeDarkTopicColor
.folderControl
button
transition 0.1s
color themeDarkText
&:hover
color themeDarkFocusButton
.Finder
.FinderInput
color themeDarkText
border-color themeDarkBorder
background-color themeDarkBackground
input
color themeDarkText
border-color lighten(themeDarkBackground, 10%)
background-color lighten(themeDarkBackground, 10%)
&:focus
border-color themeDarkTopicColor
.FinderList
color themeDarkText
border-color themeDarkBorder
background-color themeDarkList
.divider
border-color themeDarkBorder
.FinderDetail
color themeDarkText
border-color themeDarkBorder
background-color themeDarkPreview
box-shadow 0px 0px 10px 0 darken(themeDarkBorder, 20%);
.header
border-color themeDarkBorder
.right
.clipboardBtn
transition 0.1s
&:hover
color themeDarkFocusButton
.tooltip
background-color themeDarkTooltip
.ArticleDetail-panel
border-radius 0
// Markdown Preview
.Finder .FinderDetail .content,
.ArticleDetail .ArticleDetail-panel .ArticleEditor
.MarkdownPreview
color themeDarkText
border-color themeDarkBorder
background-color themeDarkPreview
a:hover
background-color alpha(lighten(brandColor, 30%), 0.2) !important
code
border-color darken(themeDarkBorder, 10%)
background-color lighten(themeDarkPreview, 5%)
pre
code
background-color transparent
table
thead
tr
background-color themeDarkTableHead
th
border-color themeDarkTableBorder
&:last-child
border-right solid 1px themeDarkTableBorder
tbody
tr:nth-child(2n + 1)
background-color themeDarkTableOdd
tr:nth-child(2n)
background-color themeDarkTableEven
td
border-color themeDarkTableBorder
&:last-child
border-right solid 1px themeDarkTableBorder

View File

@@ -4,6 +4,8 @@ const packager = require('electron-packager')
const fs = require('fs') const fs = require('fs')
const merge = require('merge-stream') const merge = require('merge-stream')
const WIN = process.platform === 'win32'
module.exports = function (grunt) { module.exports = function (grunt) {
var auth_code var auth_code
try { try {
@@ -55,7 +57,9 @@ module.exports = function (grunt) {
grunt.initConfig(initConfig) grunt.initConfig(initConfig)
grunt.loadNpmTasks('grunt-electron-installer') grunt.loadNpmTasks('grunt-electron-installer')
if (!WIN) {
grunt.loadNpmTasks('grunt-electron-installer-debian') grunt.loadNpmTasks('grunt-electron-installer-debian')
}
grunt.registerTask('copy', function () { grunt.registerTask('copy', function () {
var done = this.async() var done = this.async()
@@ -116,11 +120,11 @@ module.exports = function (grunt) {
version: grunt.config.get('pkg.config.electron-version'), version: grunt.config.get('pkg.config.electron-version'),
'app-version': grunt.config.get('pkg.version'), 'app-version': grunt.config.get('pkg.version'),
'app-bundle-id': 'com.maisin.boost', 'app-bundle-id': 'com.maisin.boost',
asar: true, asar: false,
prune: true, prune: true,
overwrite: true, overwrite: true,
out: path.join(__dirname, 'dist'), out: path.join(__dirname, 'dist'),
ignore: /submodules\/ace\/(?!src-min)|submodules\/ace\/(?=src-min-noconflict)|node_modules\/devicon\/icons|dist|^\/browser|^\/secret|\.babelrc|\.gitignore|^\/\.gitmodules|^\/gruntfile|^\/readme.md|^\/webpack|^\/appdmg\.json/ ignore: /submodules\/ace\/(?!src-min)|submodules\/ace\/(?=src-min-noconflict)|node_modules\/devicon\/icons|dist|^\/browser|^\/secret|\.babelrc|\.gitignore|^\/\.gitmodules|^\/gruntfile|^\/readme.md|^\/webpack|^\/appdmg\.json|^\/node_modules\/grunt/
} }
switch (platform) { switch (platform) {
case 'win': case 'win':

View File

@@ -12,7 +12,10 @@ const defaultConfig = {
'preview-font-size': '14', 'preview-font-size': '14',
'preview-font-family': 'Lato', 'preview-font-family': 'Lato',
'switch-preview': 'blur', 'switch-preview': 'blur',
'disable-direct-write': false 'disable-direct-write': false,
'theme-ui': 'light',
'theme-code': 'xcode',
'theme-syntax': 'xcode'
} }
const configFile = 'config.json' const configFile = 'config.json'
@@ -76,4 +79,3 @@ app.on('ready', function () {
applyConfig() applyConfig()
}) })
}) })

View File

@@ -2,7 +2,7 @@ const electron = require('electron')
const BrowserWindow = electron.BrowserWindow const BrowserWindow = electron.BrowserWindow
const OSX = process.platform === 'darwin' const OSX = process.platform === 'darwin'
const WIN = process.platform === 'win32' // const WIN = process.platform === 'win32'
var edit = { var edit = {
label: 'Edit', label: 'Edit',

View File

@@ -9,7 +9,7 @@
<link rel="stylesheet" href="../node_modules/font-awesome/css/font-awesome.min.css" media="screen" charset="utf-8"> <link rel="stylesheet" href="../node_modules/font-awesome/css/font-awesome.min.css" media="screen" charset="utf-8">
<link rel="stylesheet" href="../node_modules/devicon/devicon.min.css"> <link rel="stylesheet" href="../node_modules/devicon/devicon.min.css">
<link rel="stylesheet" href="../node_modules/highlight.js/styles/xcode.css"> <link rel="stylesheet" href="../node_modules/highlight.js/styles/xcode.css" id="hljs-css">
<link rel="shortcut icon" href="favicon.ico"> <link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../resources/katex.min.css"> <link rel="stylesheet" href="../resources/katex.min.css">

View File

@@ -288,6 +288,14 @@ app.on('ready', function () {
}) })
break break
case 'linux': case 'linux':
if (process.env.DESKTOP_SESSION === 'cinnamon') {
finderWindow = require('./finder-window')
finderWindow.on('close', function (e) {
if (appQuit) return true
e.preventDefault()
finderWindow.hide()
})
}
// Do nothing. // Do nothing.
} }

View File

@@ -4,7 +4,7 @@ const shell = electron.shell
const mainWindow = require('./main-window') const mainWindow = require('./main-window')
const OSX = process.platform === 'darwin' const OSX = process.platform === 'darwin'
const WIN = process.platform === 'win32' // const WIN = process.platform === 'win32'
const LINUX = process.platform === 'linux' const LINUX = process.platform === 'linux'
var boost = { var boost = {
@@ -201,7 +201,7 @@ var help = {
}, },
{ {
label: 'Changelog', label: 'Changelog',
click: function () { shell.openExternal('https://github.com/BoostIO/boost-releases/blob/master/changelog.md') } click: function () { shell.openExternal('https://github.com/BoostIO/boost-releases') }
} }
] ]
} }

View File

@@ -6,7 +6,7 @@
<link rel="stylesheet" href="../node_modules/font-awesome/css/font-awesome.min.css" media="screen" charset="utf-8"> <link rel="stylesheet" href="../node_modules/font-awesome/css/font-awesome.min.css" media="screen" charset="utf-8">
<link rel="stylesheet" href="../node_modules/devicon/devicon.min.css"> <link rel="stylesheet" href="../node_modules/devicon/devicon.min.css">
<link rel="stylesheet" href="../node_modules/highlight.js/styles/xcode.css"> <link rel="stylesheet" href="../node_modules/highlight.js/styles/xcode.css" id="hljs-css">
<link rel="shortcut icon" href="../resources/favicon.ico"> <link rel="shortcut icon" href="../resources/favicon.ico">
<title>Boostnote</title> <title>Boostnote</title>
<link rel="stylesheet" href="../resources/katex.min.css"> <link rel="stylesheet" href="../resources/katex.min.css">
@@ -56,6 +56,7 @@
<div id="content"></div> <div id="content"></div>
<script src="../submodules/ace/src-min/ace.js"></script> <script src="../submodules/ace/src-min/ace.js"></script>
<script src="../submodules/ace/src-min/ext-themelist.js"></script>
<script src="../resources/katex.min.js"></script> <script src="../resources/katex.min.js"></script>
<script src="../compiled/react.min.js"></script> <script src="../compiled/react.min.js"></script>
<script src="../compiled/react-dom.min.js"></script> <script src="../compiled/react-dom.min.js"></script>

View File

@@ -26,23 +26,28 @@
"electron" "electron"
], ],
"author": "Dick Choi <fluke8259@gmail.com> (https://github.com/Rokt33r)", "author": "Dick Choi <fluke8259@gmail.com> (https://github.com/Rokt33r)",
"contributors": [
"dojineko (https://github.com/dojineko)",
"Romain Bazile (https://github.com/gromain)",
"Bruno Paz (https://github.com/brpaz)"
],
"bugs": { "bugs": {
"url": "https://github.com/BoostIO/Boostnote/issues" "url": "https://github.com/BoostIO/Boostnote/issues"
}, },
"homepage": "https://b00st.io", "homepage": "https://b00st.io",
"dependencies": { "dependencies": {
"@rokt33r/markdown-it-math": "^4.0.1",
"@rokt33r/node-ipc": "^5.0.4", "@rokt33r/node-ipc": "^5.0.4",
"@rokt33r/sanitize-html": "^1.11.2", "@rokt33r/sanitize-html": "^1.11.2",
"devicon": "^2.0.0", "devicon": "^2.0.0",
"electron-gh-releases": "^2.0.2", "electron-gh-releases": "^2.0.2",
"font-awesome": "^4.3.0", "font-awesome": "^4.3.0",
"fs-jetpack": "^0.7.0", "fs-jetpack": "^0.7.0",
"highlight.js": "^8.9.1", "highlight.js": "^9.3.0",
"lodash": "^3.10.1", "lodash": "^3.10.1",
"markdown-it": "^4.4.0", "markdown-it": "^6.0.1",
"markdown-it-checkbox": "^1.1.0", "markdown-it-checkbox": "^1.1.0",
"markdown-it-emoji": "^1.1.0", "markdown-it-emoji": "^1.1.1",
"markdown-it-math": "^3.0.2",
"md5": "^2.0.0", "md5": "^2.0.0",
"moment": "^2.10.3", "moment": "^2.10.3",
"season": "^5.3.0", "season": "^5.3.0",
@@ -62,7 +67,6 @@
"electron-release": "^2.2.0", "electron-release": "^2.2.0",
"grunt": "^0.4.5", "grunt": "^0.4.5",
"grunt-electron-installer": "^1.2.0", "grunt-electron-installer": "^1.2.0",
"grunt-electron-installer-debian": "^0.2.0",
"history": "^1.17.0", "history": "^1.17.0",
"nib": "^1.1.0", "nib": "^1.1.0",
"react": "^0.14.3", "react": "^0.14.3",
@@ -70,16 +74,21 @@
"react-dom": "^0.14.3", "react-dom": "^0.14.3",
"react-redux": "^4.0.6", "react-redux": "^4.0.6",
"redux": "^3.0.5", "redux": "^3.0.5",
"standard": "^5.3.1", "standard": "^6.0.8",
"style-loader": "^0.12.4", "style-loader": "^0.12.4",
"stylus": "^0.52.4", "stylus": "^0.52.4",
"stylus-loader": "^1.3.1", "stylus-loader": "^1.3.1",
"webpack": "^1.12.2", "webpack": "^1.12.2",
"webpack-dev-server": "^1.12.0" "webpack-dev-server": "^1.12.0"
}, },
"optionalDependencies": {
"grunt-electron-installer-debian": "^0.2.0"
},
"optional": false, "optional": false,
"standard": { "standard": {
"ignore": [], "ignore": [
"submodules"
],
"globals": [ "globals": [
"localStorage" "localStorage"
] ]

View File

@@ -125,6 +125,12 @@ grunt zip:osx
[Rokt33r(Dick Choi of MAISIN&CO.)](https://github.com/rokt33r) [Rokt33r(Dick Choi of MAISIN&CO.)](https://github.com/rokt33r)
## Contributors
- [dojineko](https://github.com/dojineko)
- [Romain Bazile](https://github.com/gromain)
- [Bruno Paz](https://github.com/brpaz)
## Copyright & License ## Copyright & License
Copyright (C) 2016 MAISIN&CO. Copyright (C) 2016 MAISIN&CO.

View File

@@ -37,7 +37,7 @@ var config = {
'highlight.js', 'highlight.js',
'markdown-it-emoji', 'markdown-it-emoji',
'fs-jetpack', 'fs-jetpack',
'markdown-it-math', '@rokt33r/markdown-it-math',
'@rokt33r/sanitize-html', '@rokt33r/sanitize-html',
'markdown-it-checkbox', 'markdown-it-checkbox',
'season', 'season',