mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-14 10:16:26 +00:00
Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78a095d958 | ||
|
|
627172f6df | ||
|
|
a39f25961c | ||
|
|
e738ae5c8c | ||
|
|
749e85e8e6 | ||
|
|
cfa251b158 | ||
|
|
1ca38b8741 | ||
|
|
d7bc5a7088 | ||
|
|
3b9a2c3ee1 | ||
|
|
260ad77d39 | ||
|
|
5c508a0cd9 | ||
|
|
fd3d1607a4 | ||
|
|
abbc0fbcf1 | ||
|
|
00be41608d | ||
|
|
499c3f2e13 | ||
|
|
627845f6e4 | ||
|
|
07eea76057 | ||
|
|
fecc4e9b79 | ||
|
|
58e9302f15 | ||
|
|
86f649fab1 | ||
|
|
9ac0becfb2 | ||
|
|
eda547b868 | ||
|
|
f75e872415 | ||
|
|
aef0712165 | ||
|
|
bed4b7fd27 | ||
|
|
b53ff5daf3 | ||
|
|
bb0872b4fc | ||
|
|
b65101f4be | ||
|
|
593d242a4c | ||
|
|
db7f339c34 | ||
|
|
9f3575a874 | ||
|
|
1c9c59c512 | ||
|
|
127202b831 | ||
|
|
4f8a04ed21 | ||
|
|
63b2e0560b | ||
|
|
07291d71f2 | ||
|
|
d1ca1ec4d9 | ||
|
|
6907cf9972 | ||
|
|
d4f8d1498d | ||
|
|
0952e4a664 | ||
|
|
6a4e8c95ea | ||
|
|
983bfb7adf | ||
|
|
d7aaf5e210 | ||
|
|
50281132ad | ||
|
|
6a2b22015e | ||
|
|
2f90890f50 |
18
LICENSE
18
LICENSE
@@ -1,2 +1,16 @@
|
|||||||
本製品をインストール、または使用することによって、お客様は利用規約(
|
Boostnote - the simplest note app
|
||||||
https://b00st.io/regulations.html)より拘束されることに承諾されたものとします。利用規約に同意されない場合、Boostnoteは、お客様に本製品のインストール、使用のいずれも許諾できません。
|
|
||||||
|
Copyright (C) 2016 MAISIN&CO.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|||||||
@@ -40,11 +40,22 @@ export default class CodeEditor extends React.Component {
|
|||||||
this.execHandler = (e) => {
|
this.execHandler = (e) => {
|
||||||
console.log(e.command.name)
|
console.log(e.command.name)
|
||||||
switch (e.command.name) {
|
switch (e.command.name) {
|
||||||
|
case 'gotolinestart':
|
||||||
|
e.preventDefault()
|
||||||
|
{
|
||||||
|
let position = this.editor.getCursorPosition()
|
||||||
|
this.editor.navigateTo(position.row, 0)
|
||||||
|
}
|
||||||
|
break
|
||||||
case 'gotolineend':
|
case 'gotolineend':
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
let position = this.editor.getCursorPosition()
|
let position = this.editor.getCursorPosition()
|
||||||
this.editor.navigateTo(position.row, this.editor.getSession().getLine(position.row).length)
|
this.editor.navigateTo(position.row, this.editor.getSession().getLine(position.row).length)
|
||||||
break
|
break
|
||||||
|
case 'jumptomatching':
|
||||||
|
e.preventDefault()
|
||||||
|
this.editor.navigateUp()
|
||||||
|
break
|
||||||
case 'removetolineend':
|
case 'removetolineend':
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
let range = this.editor.getSelectionRange()
|
let range = this.editor.getSelectionRange()
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ function hideFinder () {
|
|||||||
function notify (title, options) {
|
function notify (title, options) {
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
options.icon = path.join('file://', global.__dirname, '../../resources/app.png')
|
options.icon = path.join('file://', global.__dirname, '../../resources/app.png')
|
||||||
options.silent = false
|
|
||||||
}
|
}
|
||||||
return new window.Notification(title, options)
|
return new window.Notification(title, options)
|
||||||
}
|
}
|
||||||
@@ -96,7 +95,8 @@ class FinderMain extends React.Component {
|
|||||||
|
|
||||||
ipcRenderer.send('copy-finder')
|
ipcRenderer.send('copy-finder')
|
||||||
notify('Saved to Clipboard!', {
|
notify('Saved to Clipboard!', {
|
||||||
body: 'Paste it wherever you want!'
|
body: 'Paste it wherever you want!',
|
||||||
|
silent: true
|
||||||
})
|
})
|
||||||
hideFinder()
|
hideFinder()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,6 +125,12 @@ export default class ArticleEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleMouseUp (e) {
|
handleMouseUp (e) {
|
||||||
|
let { article } = this.props
|
||||||
|
let showPreview = article.mode === 'markdown' && this.state.status === PREVIEW_MODE
|
||||||
|
if (!showPreview) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
switch (this.state.switchPreview) {
|
switch (this.state.switchPreview) {
|
||||||
case 'blur':
|
case 'blur':
|
||||||
switch (e.button) {
|
switch (e.button) {
|
||||||
@@ -144,6 +150,12 @@ export default class ArticleEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleMouseMove (e) {
|
handleMouseMove (e) {
|
||||||
|
let { article } = this.props
|
||||||
|
let showPreview = article.mode === 'markdown' && this.state.status === PREVIEW_MODE
|
||||||
|
if (!showPreview) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
if (this.state.switchPreview === 'blur' && this.isMouseDown) {
|
if (this.state.switchPreview === 'blur' && this.isMouseDown) {
|
||||||
this.moveCount++
|
this.moveCount++
|
||||||
if (this.moveCount > 5) {
|
if (this.moveCount > 5) {
|
||||||
@@ -153,6 +165,12 @@ export default class ArticleEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleMouseDowm (e) {
|
handleMouseDowm (e) {
|
||||||
|
let { article } = this.props
|
||||||
|
let showPreview = article.mode === 'markdown' && this.state.status === PREVIEW_MODE
|
||||||
|
if (!showPreview) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
switch (this.state.switchPreview) {
|
switch (this.state.switchPreview) {
|
||||||
case 'blur':
|
case 'blur':
|
||||||
switch (e.button) {
|
switch (e.button) {
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ import DeleteArticleModal from '../../modal/DeleteArticleModal'
|
|||||||
import ArticleEditor from './ArticleEditor'
|
import ArticleEditor from './ArticleEditor'
|
||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const ipc = electron.ipcRenderer
|
const ipc = electron.ipcRenderer
|
||||||
|
import fetchConfig from 'browser/lib/fetchConfig'
|
||||||
|
|
||||||
|
let config = fetchConfig()
|
||||||
|
ipc.on('config-apply', function (e, newConfig) {
|
||||||
|
config = newConfig
|
||||||
|
})
|
||||||
|
|
||||||
const BRAND_COLOR = '#18AF90'
|
const BRAND_COLOR = '#18AF90'
|
||||||
const OSX = global.process.platform === 'darwin'
|
const OSX = global.process.platform === 'darwin'
|
||||||
@@ -83,10 +89,12 @@ export default class ArticleDetail extends React.Component {
|
|||||||
if (isModalOpen()) return true
|
if (isModalOpen()) return true
|
||||||
if (this.refs.editor) this.refs.editor.switchPreviewMode()
|
if (this.refs.editor) this.refs.editor.switchPreviewMode()
|
||||||
}
|
}
|
||||||
|
this.configApplyHandler = (e, config) => this.handleConfigApply(e, config)
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
article: Object.assign({content: ''}, props.activeArticle),
|
article: Object.assign({content: ''}, props.activeArticle),
|
||||||
openShareDropdown: false
|
openShareDropdown: false,
|
||||||
|
fontFamily: config['editor-font-family']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +109,7 @@ export default class ArticleDetail extends React.Component {
|
|||||||
ipc.on('detail-title', this.titleHandler)
|
ipc.on('detail-title', this.titleHandler)
|
||||||
ipc.on('detail-edit', this.editHandler)
|
ipc.on('detail-edit', this.editHandler)
|
||||||
ipc.on('detail-preview', this.previewHandler)
|
ipc.on('detail-preview', this.previewHandler)
|
||||||
|
ipc.on('config-apply', this.configApplyHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
@@ -123,6 +132,12 @@ export default class ArticleDetail extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleConfigApply (e, config) {
|
||||||
|
this.setState({
|
||||||
|
fontFamily: config['editor-font-family']
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
renderEmpty () {
|
renderEmpty () {
|
||||||
return (
|
return (
|
||||||
<div className='ArticleDetail empty'>
|
<div className='ArticleDetail empty'>
|
||||||
@@ -309,6 +324,9 @@ export default class ArticleDetail extends React.Component {
|
|||||||
ref='title'
|
ref='title'
|
||||||
value={activeArticle.title}
|
value={activeArticle.title}
|
||||||
onChange={e => this.handleTitleChange(e)}
|
onChange={e => this.handleTitleChange(e)}
|
||||||
|
style={{
|
||||||
|
fontFamily: this.state.fontFamily
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<ModeSelect
|
<ModeSelect
|
||||||
|
|||||||
@@ -231,8 +231,8 @@ export default class ArticleTopBar extends React.Component {
|
|||||||
<ExternalLink className='ArticleTopBar-right-links-button-dropdown-item' href='https://b00st.io'>
|
<ExternalLink className='ArticleTopBar-right-links-button-dropdown-item' href='https://b00st.io'>
|
||||||
<i className='fa fa-fw fa-home'/>Boost official page
|
<i className='fa fa-fw fa-home'/>Boost official page
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
<ExternalLink className='ArticleTopBar-right-links-button-dropdown-item' href='https://github.com/BoostIO/boost-app-discussions/issues'>
|
<ExternalLink className='ArticleTopBar-right-links-button-dropdown-item' href='https://github.com/BoostIO/Boostnote/issues'>
|
||||||
<i className='fa fa-fw fa-bullhorn'/> Discuss
|
<i className='fa fa-fw fa-github'/> Issues
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,9 +19,27 @@ export default class MainContainer extends React.Component {
|
|||||||
ipc.send('update-app', 'Deal with it.')
|
ipc.send('update-app', 'Deal with it.')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleWheel (e) {
|
||||||
|
if (e.ctrlKey && global.process.platform !== 'darwin') {
|
||||||
|
if (window.document.body.style.zoom == null) {
|
||||||
|
window.document.body.style.zoom = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
let zoom = Number(window.document.body.style.zoom)
|
||||||
|
if (e.deltaY > 0 && zoom < 4) {
|
||||||
|
document.body.style.zoom = zoom + 0.05
|
||||||
|
} else if (e.deltaY < 0 && zoom > 0.5) {
|
||||||
|
document.body.style.zoom = zoom - 0.05
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<div className='Main'>
|
<div
|
||||||
|
className='Main'
|
||||||
|
onWheel={(e) => this.handleWheel(e)}
|
||||||
|
>
|
||||||
{this.state.updateAvailable ? (
|
{this.state.updateAvailable ? (
|
||||||
<button onClick={this.updateApp} className='appUpdateButton'><i className='fa fa-cloud-download'/> Update available!</button>
|
<button onClick={this.updateApp} className='appUpdateButton'><i className='fa fa-cloud-download'/> Update available!</button>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import React from 'react'
|
|||||||
import ReactDOM from 'react-dom'
|
import ReactDOM from 'react-dom'
|
||||||
require('../styles/main/index.styl')
|
require('../styles/main/index.styl')
|
||||||
import { openModal } from 'browser/lib/modal'
|
import { openModal } from 'browser/lib/modal'
|
||||||
import Tutorial from './modal/Tutorial'
|
import OSSAnnounceModal from './modal/OSSAnnounceModal'
|
||||||
import activityRecord from 'browser/lib/activityRecord'
|
import activityRecord from 'browser/lib/activityRecord'
|
||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const ipc = electron.ipcRenderer
|
const ipc = electron.ipcRenderer
|
||||||
@@ -25,6 +25,15 @@ window.addEventListener('online', function () {
|
|||||||
ipc.send('check-update', 'check-update')
|
ipc.send('check-update', 'check-update')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
document.addEventListener('drop', function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
})
|
||||||
|
document.addEventListener('dragover', function (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
})
|
||||||
|
|
||||||
function notify (title, options) {
|
function notify (title, options) {
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
options.icon = path.join('file://', global.__dirname, '../../resources/app.png')
|
options.icon = path.join('file://', global.__dirname, '../../resources/app.png')
|
||||||
@@ -59,9 +68,10 @@ ReactDOM.render((
|
|||||||
loadingCover.parentNode.removeChild(loadingCover)
|
loadingCover.parentNode.removeChild(loadingCover)
|
||||||
let status = JSON.parse(localStorage.getItem('status'))
|
let status = JSON.parse(localStorage.getItem('status'))
|
||||||
if (status == null) status = {}
|
if (status == null) status = {}
|
||||||
if (!status.introWatched) {
|
|
||||||
openModal(Tutorial)
|
if (!status.ossAnnounceWatched) {
|
||||||
status.introWatched = true
|
openModal(OSSAnnounceModal)
|
||||||
|
status.ossAnnounceWatched = true
|
||||||
localStorage.setItem('status', JSON.stringify(status))
|
localStorage.setItem('status', JSON.stringify(status))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
29
browser/main/modal/OSSAnnounceModal.js
Normal file
29
browser/main/modal/OSSAnnounceModal.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import React, { PropTypes } from 'react'
|
||||||
|
import ExternalLink from 'browser/components/ExternalLink'
|
||||||
|
|
||||||
|
export default class OSSAnnounceModal extends React.Component {
|
||||||
|
handleCloseBtnClick (e) {
|
||||||
|
this.props.close()
|
||||||
|
}
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div className='OSSAnnounceModal modal'>
|
||||||
|
|
||||||
|
<div className='OSSAnnounceModal-title'>Boostnote has been Open-sourced</div>
|
||||||
|
|
||||||
|
<ExternalLink className='OSSAnnounceModal-link' href='https://github.com/BoostIO/Boostnote'>
|
||||||
|
https://github.com/BoostIO/Boostnote
|
||||||
|
</ExternalLink>
|
||||||
|
|
||||||
|
<button
|
||||||
|
className='OSSAnnounceModal-closeBtn'
|
||||||
|
onClick={(e) => this.handleCloseBtnClick(e)}
|
||||||
|
>Close</button>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OSSAnnounceModal.propTypes = {
|
||||||
|
close: PropTypes.func
|
||||||
|
}
|
||||||
@@ -1,122 +1,23 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import ReactDOM from 'react-dom'
|
import ReactDOM from 'react-dom'
|
||||||
import clientKey from 'browser/lib/clientKey'
|
|
||||||
import linkState from 'browser/lib/linkState'
|
import linkState from 'browser/lib/linkState'
|
||||||
import _ from 'lodash'
|
import ExternalLink from 'browser/components/ExternalLink'
|
||||||
import { request, SERVER_URL } from 'browser/lib/api'
|
|
||||||
|
|
||||||
const FORM_MODE = 'FORM_MODE'
|
|
||||||
const DONE_MODE = 'DONE_MODE'
|
|
||||||
|
|
||||||
export default class ContactTab extends React.Component {
|
export default class ContactTab extends React.Component {
|
||||||
constructor (props) {
|
|
||||||
super(props)
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
title: '',
|
|
||||||
content: '',
|
|
||||||
email: '',
|
|
||||||
mode: FORM_MODE,
|
|
||||||
alert: null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
let titleInput = ReactDOM.findDOMNode(this.refs.title)
|
let titleInput = ReactDOM.findDOMNode(this.refs.title)
|
||||||
if (titleInput != null) titleInput.focus()
|
if (titleInput != null) titleInput.focus()
|
||||||
}
|
}
|
||||||
|
|
||||||
handleBackButtonClick (e) {
|
|
||||||
this.setState({
|
|
||||||
mode: FORM_MODE
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
handleSendButtonClick (e) {
|
|
||||||
let input = _.pick(this.state, ['title', 'content', 'email'])
|
|
||||||
input.clientKey = clientKey.get()
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
alert: {
|
|
||||||
type: 'info',
|
|
||||||
message: 'Sending...'
|
|
||||||
}
|
|
||||||
}, () => {
|
|
||||||
request.post(SERVER_URL + 'apis/inquiry')
|
|
||||||
.send(input)
|
|
||||||
.then(res => {
|
|
||||||
console.log('sent')
|
|
||||||
this.setState({
|
|
||||||
title: '',
|
|
||||||
content: '',
|
|
||||||
mode: DONE_MODE,
|
|
||||||
alert: null
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
if (err.code === 'ECONNREFUSED') {
|
|
||||||
this.setState({
|
|
||||||
alert: {
|
|
||||||
type: 'error',
|
|
||||||
message: 'Can\'t connect to API server.'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
console.error(err)
|
|
||||||
this.setState({
|
|
||||||
alert: {
|
|
||||||
type: 'error',
|
|
||||||
message: err.message
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
switch (this.state.mode) {
|
return (
|
||||||
case DONE_MODE:
|
<div className='ContactTab content'>
|
||||||
return (
|
<div className='title'>Contact</div>
|
||||||
<div className='ContactTab content done'>
|
<p>
|
||||||
<div className='message'>
|
- Issues: <ExternalLink href='https://github.com/BoostIO/Boostnote/issues'>https://github.com/BoostIO/Boostnote/issues</ExternalLink>
|
||||||
<i className='checkIcon fa fa-check-circle'/><br/>
|
</p>
|
||||||
Your message has been sent successfully!!
|
</div>
|
||||||
</div>
|
)
|
||||||
<div className='control'>
|
|
||||||
<button onClick={e => this.handleBackButtonClick(e)}>Back to Contact form</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
case FORM_MODE:
|
|
||||||
default:
|
|
||||||
let alertElement = this.state.alert != null
|
|
||||||
? (
|
|
||||||
<div className={'alert ' + this.state.alert.type}>{this.state.alert.message}</div>
|
|
||||||
)
|
|
||||||
: null
|
|
||||||
return (
|
|
||||||
<div className='ContactTab content form'>
|
|
||||||
<div className='title'>Contact form</div>
|
|
||||||
<div className='description'>
|
|
||||||
Your feedback is highly appreciated and will help us to improve our app. :D
|
|
||||||
</div>
|
|
||||||
<div className='iptGroup'>
|
|
||||||
<input ref='title' valueLink={this.linkState('title')} placeholder='Title' type='text'/>
|
|
||||||
</div>
|
|
||||||
<div className='iptGroup'>
|
|
||||||
<textarea valueLink={this.linkState('content')} placeholder='Content'/>
|
|
||||||
</div>
|
|
||||||
<div className='iptGroup'>
|
|
||||||
<input valueLink={this.linkState('email')} placeholder='E-mail (Optional)' type='email'/>
|
|
||||||
</div>
|
|
||||||
<div className='formControl'>
|
|
||||||
<button onClick={e => this.handleSendButtonClick(e)} className='primary'>Send</button>
|
|
||||||
{alertElement}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -257,9 +257,10 @@ infoButton()
|
|||||||
width 150px
|
width 150px
|
||||||
max-height 150px
|
max-height 150px
|
||||||
background-color white
|
background-color white
|
||||||
z-index 5
|
z-index 50
|
||||||
border 1px solid borderColor
|
border 1px solid borderColor
|
||||||
border-radius 5px
|
border-radius 5px
|
||||||
|
overflow-y auto
|
||||||
&>button
|
&>button
|
||||||
width 100%
|
width 100%
|
||||||
display block
|
display block
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ articleItemColor = #777
|
|||||||
.ArticleList-item
|
.ArticleList-item
|
||||||
border solid 2px transparent
|
border solid 2px transparent
|
||||||
position relative
|
position relative
|
||||||
height 110px
|
min-height 110px
|
||||||
width 100%
|
width 100%
|
||||||
cursor pointer
|
cursor pointer
|
||||||
transition 0.1s
|
transition 0.1s
|
||||||
@@ -68,18 +68,27 @@ articleItemColor = #777
|
|||||||
code
|
code
|
||||||
font-family Monaco, Menlo, 'Ubuntu Mono', Consolas, source-code-pro, monospace
|
font-family Monaco, Menlo, 'Ubuntu Mono', Consolas, source-code-pro, monospace
|
||||||
.ArticleList-item-bottom
|
.ArticleList-item-bottom
|
||||||
overflow-x auto
|
padding-bottom 5px
|
||||||
white-space nowrap
|
|
||||||
padding-top 6px
|
|
||||||
.tags
|
.tags
|
||||||
color articleItemColor
|
color articleItemColor
|
||||||
height 14px
|
line-height 18px
|
||||||
|
word-wrap break-word
|
||||||
|
clearfix()
|
||||||
|
i.fa-tags
|
||||||
|
display inline
|
||||||
|
float left
|
||||||
|
padding 2px 2px 0 0
|
||||||
|
height 14px
|
||||||
|
line-height 13px
|
||||||
a
|
a
|
||||||
background-color brandColor
|
background-color brandColor
|
||||||
|
float left
|
||||||
color white
|
color white
|
||||||
border-radius 2px
|
border-radius 2px
|
||||||
padding 1px 5px
|
padding 1px 5px
|
||||||
margin 2px
|
margin 2px
|
||||||
|
height 14px
|
||||||
|
line-height 13px
|
||||||
font-size 10px
|
font-size 10px
|
||||||
opacity 0.8
|
opacity 0.8
|
||||||
&:hover
|
&:hover
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
global-reset()
|
global-reset()
|
||||||
@import '../shared/*'
|
@import '../shared/*'
|
||||||
@import './ArticleNavigator'
|
@import './ArticleNavigator'
|
||||||
@import './ArticleTopbar'
|
@import './ArticleTopBar'
|
||||||
@import './ArticleList'
|
@import './ArticleList'
|
||||||
@import './ArticleDetail'
|
@import './ArticleDetail'
|
||||||
@import './modal/*'
|
@import './modal/*'
|
||||||
@@ -126,3 +126,28 @@ textarea.block-input
|
|||||||
margin-left -107px
|
margin-left -107px
|
||||||
&:hover .tooltip
|
&:hover .tooltip
|
||||||
opacity 1
|
opacity 1
|
||||||
|
|
||||||
|
.OSSAnnounceModal
|
||||||
|
height 250
|
||||||
|
text-align center
|
||||||
|
.OSSAnnounceModal-title
|
||||||
|
font-size 32px
|
||||||
|
padding 45px 0
|
||||||
|
|
||||||
|
.OSSAnnounceModal-link
|
||||||
|
display block
|
||||||
|
font-size 20px
|
||||||
|
margin 25px 0 65px
|
||||||
|
.OSSAnnounceModal-closeBtn
|
||||||
|
display block
|
||||||
|
margin 0 auto
|
||||||
|
border none
|
||||||
|
border-radius 5px
|
||||||
|
width 150px
|
||||||
|
height 33px
|
||||||
|
background-color brandColor
|
||||||
|
color white
|
||||||
|
opacity 0.7
|
||||||
|
&:hover
|
||||||
|
opacity 1
|
||||||
|
background-color lighten(brandColor, 10%)
|
||||||
|
|||||||
@@ -177,69 +177,14 @@ iptFocusBorderColor = #369DCD
|
|||||||
color errorTextColor
|
color errorTextColor
|
||||||
background-color errorBackgroundColor
|
background-color errorBackgroundColor
|
||||||
&.ContactTab
|
&.ContactTab
|
||||||
&.done
|
padding 10px
|
||||||
.message
|
.title
|
||||||
margin-top 75px
|
font-size 18px
|
||||||
margin-bottom 15px
|
color brandColor
|
||||||
text-align center
|
margin-top 10px
|
||||||
font-size 22px
|
margin-bottom 10px
|
||||||
.checkIcon
|
p
|
||||||
margin-bottom 15px
|
line-height 2
|
||||||
font-size 144px
|
|
||||||
color brandColor
|
|
||||||
text-align center
|
|
||||||
.control
|
|
||||||
text-align center
|
|
||||||
button
|
|
||||||
border solid 1px borderColor
|
|
||||||
border-radius 5px
|
|
||||||
background-color white
|
|
||||||
padding 15px 15px
|
|
||||||
font-size 14px
|
|
||||||
&:hover
|
|
||||||
background-color darken(white, 10%)
|
|
||||||
&.form
|
|
||||||
padding 10px
|
|
||||||
.title
|
|
||||||
font-size 18px
|
|
||||||
color brandColor
|
|
||||||
margin-top 10px
|
|
||||||
margin-bottom 10px
|
|
||||||
.description
|
|
||||||
margin-bottom 15px
|
|
||||||
.iptGroup
|
|
||||||
margin-bottom 10px
|
|
||||||
input, textarea
|
|
||||||
border-radius 5px
|
|
||||||
border 1px solid borderColor
|
|
||||||
font-size 14px
|
|
||||||
outline none
|
|
||||||
padding 10px 15px
|
|
||||||
width 100%
|
|
||||||
&:focus
|
|
||||||
border-color iptFocusBorderColor
|
|
||||||
textarea
|
|
||||||
resize vertical
|
|
||||||
min-height 150px
|
|
||||||
.formControl
|
|
||||||
clearfix()
|
|
||||||
.alert
|
|
||||||
float right
|
|
||||||
padding 10px 15px
|
|
||||||
margin 0 5px 0
|
|
||||||
font-size 14px
|
|
||||||
line-height normal
|
|
||||||
button
|
|
||||||
padding 10px 15px
|
|
||||||
background-color brandColor
|
|
||||||
color white
|
|
||||||
font-size 14px
|
|
||||||
border-radius 5px
|
|
||||||
border none
|
|
||||||
float right
|
|
||||||
&:hover
|
|
||||||
background-color lighten(brandColor, 10%)
|
|
||||||
|
|
||||||
&.AppSettingTab
|
&.AppSettingTab
|
||||||
.description
|
.description
|
||||||
marked()
|
marked()
|
||||||
|
|||||||
35
contributing.md
Normal file
35
contributing.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Contributing to Boostnote
|
||||||
|
|
||||||
|
> English below.
|
||||||
|
|
||||||
|
## About Pull Request
|
||||||
|
|
||||||
|
### やり方
|
||||||
|
|
||||||
|
現状特に`dev`ブランチを用意しないつもりなので、最新VersionのブランチにPullrequestを送ってください。
|
||||||
|
|
||||||
|
### Pull requsetの著作権
|
||||||
|
|
||||||
|
Pull requestをすることはその変化分のコードの著作権をMAISIN&CO.に譲渡することに同意することになります。
|
||||||
|
|
||||||
|
アプリケーションのLicenseのをいつでも変える選択肢を残したいからです。
|
||||||
|
しかし、これはいずれかBoostnoteが有料の商用アプリになる可能性がある話ではありません。
|
||||||
|
もし、このアプリケーションで金を稼ごうとするならBoostnote専用のCloud storageの提供やMobile appとの連動、何か特殊なプレミアム機能の提供など形になると思います。
|
||||||
|
現在考えられているのは、GPL v3の場合、他のライセンスとの互換が不可能であるため、もしより自由なLicense(BSD, MIT)に変える時に改めて著作権者としてライセンスし直す選択肢を残したいぐらいのイメージです。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Contributing to Boostnote(ENG)
|
||||||
|
|
||||||
|
## About Pull Request
|
||||||
|
|
||||||
|
### How to
|
||||||
|
|
||||||
|
Make a new PR to the branch named latest version. This is because there is no `dev` branch currently.
|
||||||
|
|
||||||
|
### Copyright of Pull Request
|
||||||
|
|
||||||
|
If you make a pull request, It means you agree to transfer the copyright of the code changes to MAISIN&CO.
|
||||||
|
|
||||||
|
It doesn't mean Boostnote will become a paid app. If we want to earn some money, We will try other way, which is some kind of cloud storage, Mobile app integration or some SPECIAL features.
|
||||||
|
Because GPL v3 is too strict to be compatible with any other License, We thought this is needed to replace the license with much freer one(like BSD, MIT) somewhen.
|
||||||
60
gruntfile.js
60
gruntfile.js
@@ -29,10 +29,29 @@ module.exports = function (grunt) {
|
|||||||
certificatePassword: WIN_CERT_PASSWORD,
|
certificatePassword: WIN_CERT_PASSWORD,
|
||||||
noMsi: true
|
noMsi: true
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
'electron-installer-debian': {
|
||||||
|
app: {
|
||||||
|
options: {
|
||||||
|
productName: 'Boostnote',
|
||||||
|
productDescription: 'The opensource note app for developer.',
|
||||||
|
arch: 'amd64',
|
||||||
|
categories: [
|
||||||
|
'Development',
|
||||||
|
'Utility'
|
||||||
|
],
|
||||||
|
icon: path.join(__dirname, 'resources/app.png'),
|
||||||
|
bin: 'Boostnote'
|
||||||
|
},
|
||||||
|
src: path.join(__dirname, 'dist', 'Boostnote-linux-x64'),
|
||||||
|
dest: path.join(__dirname, 'dist')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
grunt.initConfig(initConfig)
|
grunt.initConfig(initConfig)
|
||||||
grunt.loadNpmTasks('grunt-electron-installer')
|
grunt.loadNpmTasks('grunt-electron-installer')
|
||||||
|
grunt.loadNpmTasks('grunt-electron-installer-debian')
|
||||||
|
|
||||||
grunt.registerTask('compile', function () {
|
grunt.registerTask('compile', function () {
|
||||||
var done = this.async()
|
var done = this.async()
|
||||||
@@ -115,6 +134,21 @@ module.exports = function (grunt) {
|
|||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
|
case 'linux':
|
||||||
|
Object.assign(opts, {
|
||||||
|
platform: 'linux',
|
||||||
|
icon: path.join(__dirname, 'resources/app.icns'),
|
||||||
|
'app-category-type': 'public.app-category.developer-tools'
|
||||||
|
})
|
||||||
|
packager(opts, function (err, appPath) {
|
||||||
|
if (err) {
|
||||||
|
grunt.log.writeln(err)
|
||||||
|
done(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -180,10 +214,22 @@ module.exports = function (grunt) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
grunt.registerTask('build', function (platform) {
|
function getTarget () {
|
||||||
if (!platform) {
|
switch (process.platform) {
|
||||||
platform = process.platform === 'darwin' ? 'osx' : process.platform === 'win32' ? 'win' : null
|
case 'darwin':
|
||||||
|
return 'osx'
|
||||||
|
case 'win32':
|
||||||
|
return 'win'
|
||||||
|
case 'linux':
|
||||||
|
return 'linux'
|
||||||
|
default:
|
||||||
|
return process.platform
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grunt.registerTask('build', function (platform) {
|
||||||
|
if (platform == null) platform = getTarget()
|
||||||
|
|
||||||
switch (platform) {
|
switch (platform) {
|
||||||
case 'win':
|
case 'win':
|
||||||
grunt.task.run(['compile', 'pack:win', 'create-windows-installer'])
|
grunt.task.run(['compile', 'pack:win', 'create-windows-installer'])
|
||||||
@@ -191,13 +237,15 @@ module.exports = function (grunt) {
|
|||||||
case 'osx':
|
case 'osx':
|
||||||
grunt.task.run(['compile', 'pack:osx', 'codesign', 'create-osx-installer', 'zip:osx'])
|
grunt.task.run(['compile', 'pack:osx', 'codesign', 'create-osx-installer', 'zip:osx'])
|
||||||
break
|
break
|
||||||
|
case 'linux':
|
||||||
|
grunt.task.run(['compile', 'pack:linux', 'electron-installer-debian'])
|
||||||
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
grunt.registerTask('pre-build', function (platform) {
|
grunt.registerTask('pre-build', function (platform) {
|
||||||
if (!platform) {
|
if (platform == null) platform = getTarget()
|
||||||
platform = process.platform === 'darwin' ? 'osx' : process.platform === 'win32' ? 'win' : null
|
|
||||||
}
|
|
||||||
switch (platform) {
|
switch (platform) {
|
||||||
case 'win':
|
case 'win':
|
||||||
grunt.task.run(['compile', 'pack:win'])
|
grunt.task.run(['compile', 'pack:win'])
|
||||||
|
|||||||
@@ -79,12 +79,12 @@ var config = {
|
|||||||
show: false,
|
show: false,
|
||||||
frame: false,
|
frame: false,
|
||||||
resizable: false,
|
resizable: false,
|
||||||
'zoom-factor': 1.0,
|
zoomFactor: 1.0,
|
||||||
'web-preferences': {
|
webPreferences: {
|
||||||
'overlay-scrollbars': true,
|
blinkFeatures: 'OverlayScrollbars'
|
||||||
'skip-taskbar': true
|
|
||||||
},
|
},
|
||||||
'standard-window': false
|
skipTaskbar: true,
|
||||||
|
standardWindow: false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
var scriptEl=document.createElement('script')
|
var scriptEl=document.createElement('script')
|
||||||
scriptEl.setAttribute("type","text/javascript")
|
scriptEl.setAttribute("type","text/javascript")
|
||||||
scriptEl.setAttribute("src", scriptUrl)
|
scriptEl.setAttribute("src", scriptUrl)
|
||||||
document.getElementsByTagName("head")[0].appendChild(scriptEl)
|
document.body.appendChild(scriptEl)
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ function toggleMain () {
|
|||||||
mainWindow.minimize()
|
mainWindow.minimize()
|
||||||
mainWindow.restore()
|
mainWindow.restore()
|
||||||
}
|
}
|
||||||
mainWindow.webContents.send('list-focus')
|
mainWindow.webContents.send('top-focus-search')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,4 +114,3 @@ ipc.on('hotkeyUpdated', function (event, newKeymap) {
|
|||||||
globalShortcut.unregisterAll()
|
globalShortcut.unregisterAll()
|
||||||
registerAllKeys()
|
registerAllKeys()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -16,14 +16,11 @@ var finderProcess = null
|
|||||||
var finderWindow = null
|
var finderWindow = null
|
||||||
var update = null
|
var update = null
|
||||||
|
|
||||||
// app.on('window-all-closed', function () {
|
|
||||||
// if (process.platform !== 'darwin') app.quit()
|
|
||||||
// })
|
|
||||||
|
|
||||||
const appRootPath = path.join(process.execPath, '../..')
|
const appRootPath = path.join(process.execPath, '../..')
|
||||||
const updateDotExePath = path.join(appRootPath, 'Update.exe')
|
const updateDotExePath = path.join(appRootPath, 'Update.exe')
|
||||||
const exeName = path.basename(process.execPath)
|
const exeName = path.basename(process.execPath)
|
||||||
|
|
||||||
|
// For windows app
|
||||||
function spawnUpdate (args, cb) {
|
function spawnUpdate (args, cb) {
|
||||||
var stdout = ''
|
var stdout = ''
|
||||||
var updateProcess = null
|
var updateProcess = null
|
||||||
@@ -128,10 +125,13 @@ const updater = new GhReleases(ghReleasesOpts)
|
|||||||
// Check for updates
|
// Check for updates
|
||||||
// `status` returns true if there is a new update available
|
// `status` returns true if there is a new update available
|
||||||
function checkUpdate () {
|
function checkUpdate () {
|
||||||
|
if (process.platform === 'linux') {
|
||||||
|
return true
|
||||||
|
}
|
||||||
updater.check((err, status) => {
|
updater.check((err, status) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error(err)
|
var isLatest = err.message === 'There is no newer version.'
|
||||||
if (!versionNotified) notify('Updater error!', message)
|
if (!isLatest && !versionNotified) notify('Updater error!', err.message)
|
||||||
}
|
}
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (status) {
|
if (status) {
|
||||||
@@ -159,15 +159,6 @@ nodeIpc.config.id = 'node'
|
|||||||
nodeIpc.config.retry = 1500
|
nodeIpc.config.retry = 1500
|
||||||
nodeIpc.config.silent = true
|
nodeIpc.config.silent = true
|
||||||
|
|
||||||
function spawnFinder() {
|
|
||||||
if (process.platform === 'darwin') {
|
|
||||||
var finderArgv = [path.join(__dirname, 'finder-app.js'), '--finder']
|
|
||||||
if (_.find(process.argv, a => a === '--hot')) finderArgv.push('--hot')
|
|
||||||
finderProcess = ChildProcess
|
|
||||||
.execFile(process.execPath, finderArgv)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeIpc.serve(
|
nodeIpc.serve(
|
||||||
path.join(app.getPath('userData'), 'boost.service'),
|
path.join(app.getPath('userData'), 'boost.service'),
|
||||||
function () {
|
function () {
|
||||||
@@ -184,7 +175,7 @@ nodeIpc.serve(
|
|||||||
'message',
|
'message',
|
||||||
function (data, socket) {
|
function (data, socket) {
|
||||||
console.log('>>', data)
|
console.log('>>', data)
|
||||||
format(data)
|
handleIpcEvent(data)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
nodeIpc.server.on(
|
nodeIpc.server.on(
|
||||||
@@ -196,14 +187,18 @@ nodeIpc.serve(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
function format (payload) {
|
function handleIpcEvent (payload) {
|
||||||
switch (payload.type) {
|
switch (payload.type) {
|
||||||
case 'show-main-window':
|
case 'show-main-window':
|
||||||
if (process.platform === 'darwin') {
|
switch (process.platform) {
|
||||||
mainWindow.show()
|
case 'darwin':
|
||||||
} else {
|
mainWindow.show()
|
||||||
mainWindow.minimize()
|
case 'win32':
|
||||||
mainWindow.restore()
|
mainWindow.minimize()
|
||||||
|
mainWindow.restore()
|
||||||
|
case 'linux':
|
||||||
|
// Do nothing
|
||||||
|
// due to bug of `app.focus()` some desktop Env
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'copy-finder':
|
case 'copy-finder':
|
||||||
@@ -215,6 +210,15 @@ function format (payload) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function spawnFinder() {
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
var finderArgv = [path.join(__dirname, 'finder-app.js'), '--finder']
|
||||||
|
if (_.find(process.argv, a => a === '--hot')) finderArgv.push('--hot')
|
||||||
|
finderProcess = ChildProcess
|
||||||
|
.execFile(process.execPath, finderArgv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function quitApp () {
|
function quitApp () {
|
||||||
appQuit = true
|
appQuit = true
|
||||||
if (finderProcess) finderProcess.kill()
|
if (finderProcess) finderProcess.kill()
|
||||||
@@ -223,7 +227,6 @@ function quitApp () {
|
|||||||
|
|
||||||
app.on('ready', function () {
|
app.on('ready', function () {
|
||||||
app.on('before-quit', function () {
|
app.on('before-quit', function () {
|
||||||
console.log('before quite')
|
|
||||||
appQuit = true
|
appQuit = true
|
||||||
if (finderProcess) finderProcess.kill()
|
if (finderProcess) finderProcess.kill()
|
||||||
})
|
})
|
||||||
@@ -244,7 +247,7 @@ app.on('ready', function () {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
var menu = Menu.buildFromTemplate(template)
|
var menu = Menu.buildFromTemplate(template)
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin' || process.platform === 'linux') {
|
||||||
Menu.setApplicationMenu(menu)
|
Menu.setApplicationMenu(menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,25 +269,26 @@ app.on('ready', function () {
|
|||||||
checkUpdate()
|
checkUpdate()
|
||||||
|
|
||||||
mainWindow = require('./main-window')
|
mainWindow = require('./main-window')
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32' || process.platform === 'linux') {
|
||||||
mainWindow.setMenu(menu)
|
mainWindow.setMenu(menu)
|
||||||
}
|
}
|
||||||
mainWindow.on('close', function (e) {
|
mainWindow.on('close', function (e) {
|
||||||
if (appQuit) return true
|
app.quit()
|
||||||
e.preventDefault()
|
|
||||||
mainWindow.hide()
|
|
||||||
})
|
})
|
||||||
|
switch (process.platform) {
|
||||||
if (finderProcess == null && process.platform === 'darwin') {
|
case 'darwin':
|
||||||
spawnFinder()
|
spawnFinder()
|
||||||
} else {
|
break
|
||||||
finderWindow = require('./finder-window')
|
case 'win32':
|
||||||
|
finderWindow = require('./finder-window')
|
||||||
finderWindow.on('close', function (e) {
|
finderWindow.on('close', function (e) {
|
||||||
if (appQuit) return true
|
if (appQuit) return true
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
finderWindow.hide()
|
finderWindow.hide()
|
||||||
})
|
})
|
||||||
|
break
|
||||||
|
case 'linux':
|
||||||
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeIpc.server.start(function (err) {
|
nodeIpc.server.start(function (err) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ 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'
|
||||||
|
|
||||||
var boost = {
|
var boost = {
|
||||||
label: 'Boostnote',
|
label: 'Boostnote',
|
||||||
@@ -58,23 +59,6 @@ var file = {
|
|||||||
mainWindow.webContents.send('nav-new-folder')
|
mainWindow.webContents.send('nav-new-folder')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// {
|
|
||||||
// type: 'separator'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// label: 'Save Post',
|
|
||||||
// accelerator: OSX ? 'Command + S' : 'Control + S',
|
|
||||||
// click: function () {
|
|
||||||
// mainWindow.webContents.send('detail-save')
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// label: 'Save All Posts',
|
|
||||||
// accelerator: OSX ? 'Command + Shift + S' : 'Control + Shift + S',
|
|
||||||
// click: function () {
|
|
||||||
// mainWindow.webContents.send('top-save-all')
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
},
|
},
|
||||||
@@ -88,6 +72,19 @@ var file = {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (LINUX) {
|
||||||
|
file.submenu.push({
|
||||||
|
type: 'separator'
|
||||||
|
})
|
||||||
|
file.submenu.push({
|
||||||
|
label: 'Quit Boostnote',
|
||||||
|
accelerator: 'Control + Q',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
var edit = {
|
var edit = {
|
||||||
label: 'Edit',
|
label: 'Edit',
|
||||||
submenu: [
|
submenu: [
|
||||||
@@ -201,4 +198,6 @@ var help = {
|
|||||||
|
|
||||||
module.exports = process.platform === 'darwin'
|
module.exports = process.platform === 'darwin'
|
||||||
? [boost, file, edit, view, window, help]
|
? [boost, file, edit, view, window, help]
|
||||||
|
: process.platform === 'win32'
|
||||||
|
? [file, view, help]
|
||||||
: [file, view, help]
|
: [file, view, help]
|
||||||
|
|||||||
@@ -6,11 +6,10 @@ const path = require('path')
|
|||||||
var mainWindow = new BrowserWindow({
|
var mainWindow = new BrowserWindow({
|
||||||
width: 1080,
|
width: 1080,
|
||||||
height: 720,
|
height: 720,
|
||||||
'zoom-factor': 1.0,
|
zoomFactor: 1.0,
|
||||||
'web-preferences': {
|
webPreferences: {
|
||||||
'overlay-scrollbars': true
|
blinkFeatures: 'OverlayScrollbars'
|
||||||
},
|
}
|
||||||
'standard-window': false
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const url = path.resolve(__dirname, './main.html')
|
const url = path.resolve(__dirname, './main.html')
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
var scriptEl = document.createElement('script')
|
var scriptEl = document.createElement('script')
|
||||||
scriptEl.setAttribute("type","text/javascript")
|
scriptEl.setAttribute("type","text/javascript")
|
||||||
scriptEl.setAttribute("src", scriptUrl)
|
scriptEl.setAttribute("src", scriptUrl)
|
||||||
document.getElementsByTagName("head")[0].appendChild(scriptEl)
|
document.body.appendChild(scriptEl)
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "boost",
|
"name": "boost",
|
||||||
"version": "0.5.4",
|
"version": "0.5.9",
|
||||||
"description": "Boostnote",
|
"description": "Boostnote",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -9,11 +9,11 @@
|
|||||||
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js"
|
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"electron-version": "0.35.4"
|
"electron-version": "0.36.11"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/Rokt33r/codexen-app.git"
|
"url": "git+https://github.com/BoostIO/Boostnote.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"boostnote",
|
"boostnote",
|
||||||
@@ -24,11 +24,11 @@
|
|||||||
"storage",
|
"storage",
|
||||||
"electron"
|
"electron"
|
||||||
],
|
],
|
||||||
"author": "Dick Choi <fluke8259@gmail.com> (http://kazup.co)",
|
"author": "Dick Choi <fluke8259@gmail.com> (https://github.com/Rokt33r)",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/Rokt33r/codexen-app/issues"
|
"url": "https://github.com/BoostIO/Boostnote/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/Rokt33r/codexen-app#readme",
|
"homepage": "https://b00st.io",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rokt33r/node-ipc": "^5.0.4",
|
"@rokt33r/node-ipc": "^5.0.4",
|
||||||
"@rokt33r/sanitize-html": "^1.11.2",
|
"@rokt33r/sanitize-html": "^1.11.2",
|
||||||
@@ -55,11 +55,12 @@
|
|||||||
"babel-preset-react": "^6.3.13",
|
"babel-preset-react": "^6.3.13",
|
||||||
"babel-preset-react-hmre": "^1.0.1",
|
"babel-preset-react-hmre": "^1.0.1",
|
||||||
"css-loader": "^0.19.0",
|
"css-loader": "^0.19.0",
|
||||||
"electron-packager": "^5.1.0",
|
"electron-packager": "^6.0.0",
|
||||||
"electron-prebuilt": "^0.35.1",
|
"electron-prebuilt": "^0.36.11",
|
||||||
"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",
|
||||||
|
|||||||
30
readme.md
30
readme.md
@@ -1,8 +1,23 @@
|
|||||||
# Boostnote
|
# Boostnote
|
||||||
|
|
||||||
Hack your memory
|
Simple note app
|
||||||
|
|
||||||
## Develope
|
## Progress Kanban
|
||||||
|
|
||||||
|
https://trello.com/b/wJlinZJx/boostnote-todo-list
|
||||||
|
|
||||||
|
This is a public Kanban board. Also everyone can comment here.
|
||||||
|
|
||||||
|
If you want to join us, ask me to add you.
|
||||||
|
|
||||||
|
## Live coding
|
||||||
|
|
||||||
|
I've been broadcasting my work. You can check it from the below links. :smile:
|
||||||
|
|
||||||
|
- [Live Stream](https://www.livecoding.tv/rokt33r/videos/)
|
||||||
|
- [Recorded Videos](https://www.livecoding.tv/rokt33r/videos/)
|
||||||
|
|
||||||
|
## Develop
|
||||||
|
|
||||||
1. turn on HMR server
|
1. turn on HMR server
|
||||||
|
|
||||||
@@ -18,8 +33,12 @@ npm run hot
|
|||||||
|
|
||||||
> `npm start` is using compiled scripts. see [Build](#Build) to compile scripts.
|
> `npm start` is using compiled scripts. see [Build](#Build) to compile scripts.
|
||||||
|
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
|
> '3. Codesign' and '4. Create' installer are needed to deploy this app.
|
||||||
|
> You can skip these steps.
|
||||||
|
|
||||||
1. Compile scripts
|
1. Compile scripts
|
||||||
|
|
||||||
compile all browser stuff(Javascript, Stylus).
|
compile all browser stuff(Javascript, Stylus).
|
||||||
@@ -78,15 +97,18 @@ grunt zip:osx
|
|||||||
- Webpack
|
- Webpack
|
||||||
... check [`package.json`](./package.json)
|
... check [`package.json`](./package.json)
|
||||||
|
|
||||||
|
|
||||||
## Codestyle
|
## Codestyle
|
||||||
|
|
||||||
[](https://github.com/feross/standard)
|
[](https://github.com/feross/standard)
|
||||||
|
|
||||||
## Author
|
## Author
|
||||||
|
|
||||||
[Rokt33r(Dick Choi)](https://github.com/rokt33r)
|
[Rokt33r(Dick Choi of MAISIN&CO.)](https://github.com/rokt33r)
|
||||||
|
|
||||||
## License
|
## Copyright & License
|
||||||
|
|
||||||
|
Copyright (C) 2016 MAISIN&CO.
|
||||||
|
|
||||||
[Check here](./LICENSE).
|
[Check here](./LICENSE).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user