diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 7a1f6815..074abd44 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -5,7 +5,7 @@ import CodeMirror from 'codemirror' import consts from 'browser/lib/consts' import Raphael from 'raphael' import flowchart from 'flowchart' -import SequenceDiagram from 'sequence-diagram' +import SequenceDiagram from 'js-sequence-diagrams' function decodeHTMLEntities (text) { var entities = [ @@ -54,6 +54,20 @@ code { ${lineNumber && 'display: block !important;'} font-family: ${codeBlockFontFamily.join(', ')}; } + +h1, h2 { + border: none; +} + +h1 { + padding-bottom: 4px; + margin: 1em 0 8px; +} + +h2 { + padding-bottom: 0.2em; + margin: 1em 0 0.37em; +} ` } diff --git a/browser/components/NoteItem.js b/browser/components/NoteItem.js new file mode 100644 index 00000000..a165bd16 --- /dev/null +++ b/browser/components/NoteItem.js @@ -0,0 +1,100 @@ +/** + * @fileoverview Note item component. + */ +import React, { PropTypes } from 'react' +import { isArray } from 'lodash' +import CSSModules from 'browser/lib/CSSModules' +import styles from './NoteItem.styl' + +/** + * @description Tag element component. + * @param {string} tagName + * @return {React.Component} + */ +const TagElement = ({ tagName }) => ( + + {tagName} + +) + +/** + * @description Tag element list component. + * @param {Array|null} tags + * @return {React.Component} + */ +const TagElementList = (tags) => { + if (!isArray(tags)) { + return [] + } + + const tagElements = tags.map(tag => ( + TagElement({tagName: tag}) + )) + + return tagElements +} + +/** + * @description Note item component when using normal display mode. + * @param {boolean} isActive + * @param {Object} note + * @param {Function} handleNoteClick + * @param {Function} handleNoteContextMenu + * @param {string} dateDisplay + */ +const NoteItem = ({ isActive, note, dateDisplay, handleNoteClick, handleNoteContextMenu }) => ( +
handleNoteClick(e, `${note.storage}-${note.key}`)} + onContextMenu={e => handleNoteContextMenu(e, `${note.storage}-${note.key}`)} + > +
+
{dateDisplay}
+ +
+ {note.title.trim().length > 0 + ? note.title + : Empty + } +
+ +
+
+ {note.tags.length > 0 + ? TagElementList(note.tags) + : '' + } +
+
+ + {note.type === 'SNIPPET_NOTE' + ? + : + } + + {note.isStarred ? + : '' + } +
+
+) + +NoteItem.propTypes = { + isActive: PropTypes.bool.isRequired, + dateDisplay: PropTypes.string.isRequired, + note: PropTypes.shape({ + storage: PropTypes.string.isRequired, + key: PropTypes.string.isRequired, + type: PropTypes.string.isRequired, + title: PropTypes.string.isrequired, + tags: PropTypes.array, + isStarred: PropTypes.bool.isRequired, + }), + handleNoteClick: PropTypes.func.isRequired, + handleNoteContextMenu: PropTypes.func.isRequired, +} + +export default CSSModules(NoteItem, styles) diff --git a/browser/components/NoteItem.styl b/browser/components/NoteItem.styl new file mode 100644 index 00000000..ad3ec91f --- /dev/null +++ b/browser/components/NoteItem.styl @@ -0,0 +1,168 @@ +$control-height = 30px + +.root + absolute left bottom + top $topBar-height - 1 + background-color $ui-noteList-backgroundColor + +.item + position relative + padding 0 25px + user-select none + cursor pointer + background-color $ui-noteList-backgroundColor + transition background-color 0.15s + &:hover + background-color alpha($ui-active-color, 20%) + &:active + background-color $ui-active-color + color white + .item-title + .item-title-empty + .item-bottom-tagList-empty + .item-bottom-time + .item-title-icon + color white + .item-bottom-tagList-item + background-color transparent + color white + +.item-wrapper + padding 20px 0 + border-bottom $ui-border + +.item--active + @extend .item + background-color $ui-active-color + color white + .item-title + .item-title-empty + .item-bottom-tagList-empty + .item-bottom-time + .item-title-icon + color white + .item-bottom-tagList-item + background-color transparent + color white + .item-wrapper + border-color transparent + &:hover + background-color $ui-active-color + +.item-title + font-size 14px + height 40px + box-sizing border-box + line-height 24px + padding-top 5px + padding-bottom 20px + overflow ellipsis + color $ui-text-color + +.item-title-icon + position absolute + top 20px + right 25px + font-size 14px + color $ui-inactive-text-color + +.item-title-empty + font-weight normal + color $ui-inactive-text-color + +.item-bottom + position relative + bottom 0px + margin-top 2px + height 20px + font-size 12px + line-height 20px + overflow ellipsis + display flex + +.item-bottom-tagList + flex 1 + overflow ellipsis + line-height 20px + color #FFFFFF + +.item-bottom-tagList-item + font-size 12px + margin-right 8px + padding 0 10px + height 20px + box-sizing border-box + border-radius 20px + vertical-align middle + background-color $ui-tag-backgroundColor + color #FFFFFF + +.item-bottom-tagList-empty + color $ui-inactive-text-color + vertical-align middle + font-size 10px + margin-left 5px + +.item-bottom-time + color $ui-inactive-text-color + font-size 12px + +.item-star + position absolute + top 20px + right 29px + width 34px + height 34px + color $ui-favorite-star-button-color + font-size 14px + padding 0 + border-radius 17px + +body[data-theme="dark"] + .root + border-color $ui-dark-borderColor + background-color $ui-dark-noteList-backgroundColor + + .item + border-color $ui-dark-borderColor + background-color $ui-dark-noteList-backgroundColor + &:active + background-color $ui-active-color + &:hover + background-color alpha($ui-active-color, 20%) + + .item-wrapper + border-color $ui-dark-borderColor + + .item--active + @extend .item + border-color $ui-dark-borderColor + background-color $ui-active-color + .item-wrapper + border-color transparent + .item-title + color white + .item-bottom-tagList-item + background-color transparent + color white + .item-bottom-tagList-empty + color white + &:hover + background-color $ui-active-color + + .item-title + color $ui-dark-text-color + + .item-title-icon + color $ui-darkinactive-text-color + + .item-title-empty + color $ui-dark-inactive-text-color + + .item-bottom-tagList-item + background-color $ui-dark-tag-backgroundColor + color $ui-dark-text-color + + .item-bottom-tagList-empty + color $ui-inactive-text-color + vertical-align middle diff --git a/browser/components/NoteItemSimple.js b/browser/components/NoteItemSimple.js new file mode 100644 index 00000000..503e4171 --- /dev/null +++ b/browser/components/NoteItemSimple.js @@ -0,0 +1,49 @@ +/** + * @fileoverview Note item component with simple display mode. + */ +import React, { PropTypes } from 'react' +import CSSModules from 'browser/lib/CSSModules' +import styles from './NoteItemSimple.styl' + +/** + * @description Note item component when using simple display mode. + * @param {boolean} isActive + * @param {Object} note + * @param {Function} handleNoteClick + * @param {Function} handleNoteContextMenu + */ +const NoteItemSimple = ({ isActive, note, handleNoteClick, handleNoteContextMenu }) => ( +
handleNoteClick(e, `${note.storage}-${note.key}`)} + onContextMenu={e => handleNoteContextMenu(e, `${note.storage}-${note.key}`)} + > +
+ {note.type === 'SNIPPET_NOTE' + ? + : + } + {note.title.trim().length > 0 + ? note.title + : Empty + } +
+
+) + +NoteItemSimple.propTypes = { + isActive: PropTypes.bool.isRequired, + note: PropTypes.shape({ + storage: PropTypes.string.isRequired, + key: PropTypes.string.isRequired, + type: PropTypes.string.isRequired, + title: PropTypes.string.isrequired, + }), + handleNoteClick: PropTypes.func.isRequired, + handleNoteContextMenu: PropTypes.func.isRequired, +} + +export default CSSModules(NoteItemSimple, styles) diff --git a/browser/components/NoteItemSimple.styl b/browser/components/NoteItemSimple.styl new file mode 100644 index 00000000..29a2e76f --- /dev/null +++ b/browser/components/NoteItemSimple.styl @@ -0,0 +1,89 @@ +$control-height = 30px + +.root + absolute left bottom + top $topBar-height - 1 + background-color $ui-noteList-backgroundColor + +.item-simple + position relative + padding 0 25px + user-select none + cursor pointer + background-color $ui-noteList-backgroundColor + transition background-color 0.15s + &:hover + background-color alpha($ui-active-color, 20%) + &:active + background-color $ui-active-color + color white + .item-simple-title + .item-simple-title-empty + .item-simple-title-icon + color white + +.item-simple--active + @extend .item-simple + background-color $ui-active-color + color white + .item-simple-title + .item-simple-title-empty + border-color transparent + color white + .item-simple-title-icon + color white + &:hover + background-color $ui-active-color + +.item-simple-title + font-size 14px + height 40px + box-sizing border-box + line-height 24px + padding-top 8px + overflow ellipsis + color $ui-text-color + border-bottom $ui-border + +.item-simple-title-icon + font-size 12px + color $ui-inactive-text-color + padding-right 6px + +.item-simple-title-empty + font-weight normal + color $ui-inactive-text-color + +body[data-theme="dark"] + .root + border-color $ui-dark-borderColor + background-color $ui-dark-noteList-backgroundColor + + .item-simple + border-color $ui-dark-borderColor + background-color $ui-dark-noteList-backgroundColor + &:active + background-color $ui-active-color + &:hover + background-color alpha($ui-active-color, 20%) + + .item-simple--active + @extend .item-simple + border-color $ui-dark-borderColor + background-color $ui-active-color + .item-simple-title + .item-simple-title-empty + color white + border-color transparent + &:hover + background-color $ui-active-color + + .item-simple-title + color $ui-dark-text-color + border-color $ui-dark-borderColor + + .item-simple-title-icon + color $ui-darkinactive-text-color + + .item-simple-title-empty + color $ui-dark-inactive-text-color diff --git a/browser/components/SideNavFilter.js b/browser/components/SideNavFilter.js new file mode 100644 index 00000000..6d8db96a --- /dev/null +++ b/browser/components/SideNavFilter.js @@ -0,0 +1,44 @@ +/** + * @fileoverview Filter for all notes. + */ +import React, { PropTypes } from 'react' +import CSSModules from 'browser/lib/CSSModules' +import styles from './SideNavFilter.styl' + +/** + * @param {boolean} isFolded + * @param {boolean} isHomeActive + * @param {Function} handleAllNotesButtonClick + * @param {boolean} isStarredActive + * @param {Function} handleStarredButtonClick + * @return {React.Component} + */ +const SideNavFilter = ({ + isFolded, isHomeActive, handleAllNotesButtonClick, + isStarredActive, handleStarredButtonClick +}) => ( +
+ + +
+) + +SideNavFilter.propTypes = { + isFolded: PropTypes.bool, + isHomeActive: PropTypes.bool.isRequired, + handleAllNotesButtonClick: PropTypes.func.isRequired, + isStarredActive: PropTypes.bool.isRequired, + handleStarredButtonClick: PropTypes.func.isRequired, +} + +export default CSSModules(SideNavFilter, styles) diff --git a/browser/components/SideNavFilter.styl b/browser/components/SideNavFilter.styl new file mode 100644 index 00000000..10567f0b --- /dev/null +++ b/browser/components/SideNavFilter.styl @@ -0,0 +1,58 @@ +.menu + margin-bottom 30px + +.menu-button + navButtonColor() + height 32px + padding 0 15px + font-size 14px + width 100% + text-align left + overflow ellipsis + +.menu-button--active + @extend .menu-button + background-color $ui-button--active-backgroundColor + color $ui-button--active-color + &:hover + background-color $ui-button--active-backgroundColor + +.menu-button-label + margin-left 5px + +.menu--folded + @extend .menu + .menu-button, .menu-button--active + text-align center + &:hover .menu-button-label + transition opacity 0.15s + opacity 1 + .menu-button-label + position fixed + display inline-block + height 32px + left 44px + padding 0 10px + margin-top -8px + margin-left 0 + overflow ellipsis + background-color $ui-tooltip-backgroundColor + z-index 10 + color white + line-height 32px + border-top-right-radius 2px + border-bottom-right-radius 2px + pointer-events none + opacity 0 + font-size 12px + +body[data-theme="dark"] + .menu-button + navDarkButtonColor() + + .menu-button--active + @extend .menu-button + background-color $ui-dark-button--active-backgroundColor + color $ui-dark-button--active-color + &:hover + background-color $ui-dark-button--active-backgroundColor diff --git a/browser/main/Detail/SnippetTab.js b/browser/components/SnippetTab.js similarity index 100% rename from browser/main/Detail/SnippetTab.js rename to browser/components/SnippetTab.js diff --git a/browser/main/Detail/SnippetTab.styl b/browser/components/SnippetTab.styl similarity index 86% rename from browser/main/Detail/SnippetTab.styl rename to browser/components/SnippetTab.styl index 5a2deb37..2bec7ead 100644 --- a/browser/main/Detail/SnippetTab.styl +++ b/browser/components/SnippetTab.styl @@ -2,9 +2,6 @@ position relative flex 1 overflow hidden - border-right $ui-border - &:last-child - border-right none &:hover .deleteButton color $ui-inactive-text-color @@ -13,11 +10,11 @@ &:active color white background-color $ui-active-color + .root--active @extend .root min-width 100px - .button - border-color $brand-color + border-bottom $ui-border .button width 100% @@ -31,8 +28,6 @@ border-left 4px solid transparent &:hover background-color $ui-button--hover-backgroundColor - &:active, &:active:hover - border-color $brand-color .deleteButton position absolute @@ -71,8 +66,6 @@ body[data-theme="dark"] .root--active color $ui-dark-text-color border-color $ui-dark-borderColor - .button - border-color $brand-color &:hover background-color $ui-dark-button--hover-backgroundColor .deleteButton @@ -92,10 +85,6 @@ body[data-theme="dark"] &:hover color white background-color $ui-dark-button--hover-backgroundColor - &:active - color $ui-dark-button--active-color - &:active, &:active:hover - color $ui-dark-button--active-color .input background-color $ui-dark-button--hover-backgroundColor diff --git a/browser/components/StorageItem.js b/browser/components/StorageItem.js new file mode 100644 index 00000000..603523b0 --- /dev/null +++ b/browser/components/StorageItem.js @@ -0,0 +1,58 @@ +/** + * @fileoverview Micro component for showing storage. + */ +import React, { PropTypes } from 'react' +import styles from './StorageItem.styl' +import CSSModules from 'browser/lib/CSSModules' +import { isNumber } from 'lodash' + +/** + * @param {boolean} isActive + * @param {Function} handleButtonClick + * @param {Function} handleContextMenu + * @param {string} folderName + * @param {string} folderColor + * @param {boolean} isFolded + * @param {number} noteCount + * @return {React.Component} + */ +const StorageItem = ({ + isActive, handleButtonClick, handleContextMenu, folderName, + folderColor, isFolded, noteCount +}) => ( + +) + +StorageItem.propTypes = { + isActive: PropTypes.bool.isRequired, + handleButtonClick: PropTypes.func, + handleContextMenu: PropTypes.func, + folderName: PropTypes.string.isRequired, + folderColor: PropTypes.string, + isFolded: PropTypes.bool.isRequired, + noteCount: PropTypes.number, +} + +export default CSSModules(StorageItem, styles) diff --git a/browser/components/StorageItem.styl b/browser/components/StorageItem.styl new file mode 100644 index 00000000..bf28f777 --- /dev/null +++ b/browser/components/StorageItem.styl @@ -0,0 +1,68 @@ +.root + width 100% + user-select none + +.folderList-item + display flex + width 100% + height 26px + background-color transparent + color $ui-inactive-text-color + padding 0 + margin-bottom 5px + text-align left + border none + overflow ellipsis + font-size 14px + &:first-child + margin-top 0 + &:hover + background-color $ui-button--hover-backgroundColor + &:active + color $ui-button--active-color + background-color $ui-button--active-backgroundColor + +.folderList-item--active + @extend .folderList-item + color $ui-button--active-color + background-color $ui-button--active-backgroundColor + &:hover + color $ui-button--active-color + background-color $ui-button--active-backgroundColor + +.folderList-item-name + display block + flex 1 + padding 0 30px + height 26px + line-height 26px + border-width 0 0 0 3px + border-style solid + border-color transparent + +.folderList-item-noteCount + float right + line-height 26px + padding-right 15px + font-size 12px + +.folderList-item-tooltip + tooltip() + position fixed + padding 0 10px + left 44px + z-index 10 + pointer-events none + opacity 0 + border-top-right-radius 2px + border-bottom-right-radius 2px + height 26px + line-height 26px + +.folderList-item:hover, .folderList-item--active:hover + .folderList-item-tooltip + opacity 1 + +.folderList-item-name--folded + @extend .folderList-item-name + padding-left 14px diff --git a/browser/components/markdown.styl b/browser/components/markdown.styl index 5beb7210..8034c2a8 100644 --- a/browser/components/markdown.styl +++ b/browser/components/markdown.styl @@ -55,6 +55,7 @@ body line-height 1.6 overflow-x hidden user-select all + background-color $ui-noteDetail-backgroundColor .katex font 400 1.2em 'KaTeX_Main' line-height 1.2em @@ -273,13 +274,14 @@ table themeDarkBackground = darken(#21252B, 10%) themeDarkText = #DDDDDD themeDarkBorder = lighten(themeDarkBackground, 20%) -themeDarkPreview = #282C34 +themeDarkPreview = $ui-dark-noteDetail-backgroundColor themeDarkTableOdd = themeDarkPreview themeDarkTableEven = darken(themeDarkPreview, 10%) themeDarkTableHead = themeDarkTableEven themeDarkTableBorder = themeDarkBorder themeDarkModalButtonDefault = themeDarkPreview themeDarkModalButtonDanger = #BF360C + body[data-theme="dark"] color themeDarkText border-color themeDarkBorder diff --git a/browser/finder/FinderMain.styl b/browser/finder/FinderMain.styl index ef248e35..4e939b9a 100644 --- a/browser/finder/FinderMain.styl +++ b/browser/finder/FinderMain.styl @@ -21,6 +21,7 @@ $list-width = 250px outline none text-align center background-color transparent + .result absolute left right bottom top $search-height @@ -32,7 +33,7 @@ $list-width = 250px background-color $ui-backgroundColor .result-nav-filter - margin-bottom 5px + margin-bottom 10px .result-nav-filter-option height 25px @@ -62,7 +63,7 @@ $list-width = 250px .result-nav-storageList absolute bottom left right - top 80px + 32px + 10px + top 80px + 32px + 10px + 10px overflow-y auto .result-list @@ -70,15 +71,15 @@ $list-width = 250px absolute top bottom left $nav-width width $list-width - border-width 0 1px - border-style solid - border-color $ui-borderColor box-sizing border-box overflow-y auto + box-shadow 2px 0 15px -8px #b1b1b1 + z-index 1 .result-detail absolute top bottom right left $nav-width + $list-width + background-color $ui-noteDetail-backgroundColor body[data-theme="dark"] .root @@ -104,7 +105,10 @@ body[data-theme="dark"] .result-list border-color $ui-dark-borderColor + box-shadow none + top 0 .result-detail absolute top bottom right left $nav-width + $list-width + background-color $ui-dark-noteDetail-backgroundColor diff --git a/browser/finder/NoteDetail.styl b/browser/finder/NoteDetail.styl index 9f35019a..e46f291a 100644 --- a/browser/finder/NoteDetail.styl +++ b/browser/finder/NoteDetail.styl @@ -1,12 +1,16 @@ +@import('../main/Detail/DetailVars.styl') + .root absolute top bottom left right - width 100% + left $note-detail-left-margin + right $note-detail-right-margin height 100% + width 365px + background-color $ui-noteDetail-backgroundColor .description absolute top left right height 80px - border-bottom $ui-border box-sizing border-box .description-textarea @@ -18,52 +22,43 @@ padding 10px line-height 1.6 box-sizing border-box + background-color $ui-noteDetail-backgroundColor .tabList absolute left right top 80px box-sizing border-box height 30px - border-bottom $ui-border display flex - background-color $ui-backgroundColor + background-color $ui-noteDetail-backgroundColor .tabList-item position relative flex 1 - border-right $ui-border + overflow hidden + &:hover + background-color $ui-button--hover-backgroundColorg .tabList-item--active @extend .tabList-item - .tabList-item-button - border-color $brand-color + border-bottom $ui-border .tabList-item-button width 100% height 29px - navButtonColor() - outline none - border-left 4px solid transparent - -.tabList-item-deleteButton - position absolute - top 5px - height 20px - right 5px - width 20px - text-align center + overflow ellipsis + text-align left + padding-right 30px + padding-left 10px border none - padding 0 - color transparent background-color transparent - border-radius 2px -.tabList-plusButton - navButtonColor() - width 30px + transition 0.15s + &:hover + background-color $ui-button--hover-backgroundColor .tabView absolute left right bottom - top 110px + top 130px .tabView-content absolute top left right bottom @@ -72,38 +67,31 @@ width 100% body[data-theme="dark"] + .root + background-color $ui-dark-noteDetail-backgroundColor + .description border-color $ui-dark-borderColor + background-color $ui-dark-noteDetail-backgroundColor .description-textarea - background-color $ui-dark-button--hover-backgroundColor + background-color $ui-dark-noteDetail-backgroundColor color white .tabList - background-color $ui-button--active-backgroundColor - border-bottom-color $ui-dark-borderColor - background-color $ui-dark-backgroundColor + background-color $ui-dark-noteDetail-backgroundColor + .tabList-item border-color $ui-dark-borderColor &:hover background-color $ui-dark-button--hover-backgroundColor - .tabList-item--active - border-color $ui-dark-borderColor - .tabList-item-button - border-color $brand-color - .tabList-item-button - navDarkButtonColor() - border-left 4px solid transparent - .tabList-plusButton - navDarkButtonColor() - .tabView-top - border-color $ui-dark-borderColor - .tabView-top-name - border-color $ui-dark-borderColor + .tabList-item-button + border none color $ui-dark-text-color - background-color $ui-dark-button--hover-backgroundColor - .tabView-top-mode - border-color $ui-dark-borderColor - background-color $dark-default-button-background - color $ui-dark-inactive-text-color + background-color transparent + transition color background-color 0.15s + border-left 4px solid transparent + &:hover + color white + background-color $ui-dark-button--hover-backgroundColor diff --git a/browser/finder/NoteItem.js b/browser/finder/NoteItem.js deleted file mode 100644 index a940338c..00000000 --- a/browser/finder/NoteItem.js +++ /dev/null @@ -1,85 +0,0 @@ -import React, { PropTypes } from 'react' -import CSSModules from 'browser/lib/CSSModules' -import styles from './NoteItem.styl' -import moment from 'moment' -import _ from 'lodash' - -class NoteItem extends React.Component { - constructor (props) { - super(props) - - this.state = { - } - } - - handleClick (e) { - this.props.onClick(e) - } - - render () { - let { note, folder, storage, isActive } = this.props - - let tagList = _.isArray(note.tags) - ? note.tags.map((tag) => { - return ( - - {tag} - - ) - }) - : [] - return ( -
this.handleClick(e)} - > -
-
- - {folder.name} - in {storage.name} - -
-
- -
- {note.type === 'SNIPPET_NOTE' - ? - : - } - {note.title.trim().length > 0 - ? note.title - : Empty - } -
- -
- -
- {tagList.length > 0 - ? tagList - : Not tagged yet - } -
- -
- {moment(note.updatedAt).fromNow()} -
-
-
- ) - } -} - -NoteItem.propTypes = { -} - -export default CSSModules(NoteItem, styles) diff --git a/browser/finder/NoteItem.styl b/browser/finder/NoteItem.styl deleted file mode 100644 index 4c56eada..00000000 --- a/browser/finder/NoteItem.styl +++ /dev/null @@ -1,179 +0,0 @@ -.root - position relative - border-bottom $ui-border - padding 2px 5px - user-select none - cursor pointer - transition background-color 0.15s - &:hover - background-color alpha($ui-active-color, 20%) - -.root--active - @extend .root - background-color $ui-active-color - &:hover - background-color $ui-active-color - color white - .info-left-folder - .info-left-folder-surfix - .title - .title-icon - .title-empty - .bottom-tagIcon - .bottom-tagList-item - .bottom-tagList-empty - .bottom-time - color white - .bottom-tagList-item - color white - background-color transparent - -.border - absolute top bottom left right - border-style solid - border-width 2px - border-color transparent - transition 0.15s - -.info - height 20px - clearfix() - font-size 12px - color $ui-inactive-text-color - line-height 20px - overflow-y hidden - -.info-left - float left - overflow ellipsis - -.info-left-folder - border-left 4px solid transparent - padding 2px 5px - color $ui-text-color -.info-left-folder-surfix - font-size 10px - margin-left 5px - color $ui-inactive-text-color -.info-right - float right - -.title - height 24px - box-sizing border-box - line-height 24px - height 20px - line-height 20px - padding 0 5px 0 0 - overflow ellipsis - color $ui-text-color - -.title-icon - font-size 12px - color $ui-inactive-text-color - padding-right 3px - -.title-empty - font-weight normal - color $ui-inactive-text-color - -.bottom - margin-top 2px - height 20px - font-size 12px - line-height 20px - overflow ellipsis - display flex - -.bottom-tagIcon - vertical-align middle - color $ui-button-color - height 20px - line-height 20px - -.bottom-tagList - flex 1 - overflow ellipsis - line-height 20px - -.bottom-tagList-item - margin 0 4px - padding 0 4px - height 20px - box-sizing border-box - border-radius 3px - vertical-align middle - border-style solid - border-color $ui-button--focus-borderColor - border-width 0 0 0 3px - background-color $ui-backgroundColor - color $ui-text-color - transition 0.15s - -.bottom-tagList-empty - color $ui-inactive-text-color - vertical-align middle - font-size 10px - margin-left 5px - -.bottom-time - color $ui-inactive-text-color - margin-left 5px - font-size 10px - -body[data-theme="dark"] - .root - border-color $ui-dark-borderColor - - .root--active - @extend .root - border-color $ui-dark-borderColor - &:hover - background-color $ui-active-color - .info-left-folder - .info-left-folder-surfix - .title - .title-icon - .title-empty - .bottom-tagIcon - .bottom-tagList-item - .bottom-tagList-empty - .bottom-time - color white - .bottom-tagList-item - color white - background-color transparent - - .info - color $ui-dark-inactive-text-color - - .info-left-folder - color $ui-dark-text-color - - .info-left-folder-surfix - color $ui-dark-inactive-text-color - - .title - color $ui-dark-text-color - - .title-icon - color $ui-dark-inactive-text-color - - .title-empty - color $ui-dark-inactive-text-color - - .tagList-empty - color $ui-dark-inactive-text-color - - .bottom-tagIcon - color $ui-dark-button-color - - .bottom-tagList-item - color $ui-dark-text-color - background-color $ui-dark-backgroundColor - - .bottom-tagList-empty - color $ui-dark-inactive-text-color - - .bottom-time - color $ui-dark-inactive-text-color diff --git a/browser/finder/NoteList.js b/browser/finder/NoteList.js index 30d0163a..106ac54a 100644 --- a/browser/finder/NoteList.js +++ b/browser/finder/NoteList.js @@ -1,6 +1,6 @@ import React, { PropTypes } from 'react' -import NoteItem from './NoteItem' -import _ from 'lodash' +import NoteItem from 'browser/components/NoteItem' +import moment from 'moment' class NoteList extends React.Component { constructor (props) { @@ -59,16 +59,19 @@ class NoteList extends React.Component { let notesList = notes .slice(0, 10 + 10 * this.state.range) .map((note, _index) => { - let storage = storageMap[note.storage] - let folder = _.find(storage.folders, {key: note.folder}) + + const isActive = (index === _index) + const key = `${note.storage}-${note.key}` + const dateDisplay = moment(note.updatedAt).fromNow() + return ( this.props.handleNoteClick(e, _index)} + dateDisplay={dateDisplay} + key={key} + handleNoteClick={(e) => this.props.handleNoteClick(e, _index)} + handleNoteContextMenu={() => ''} /> ) }) diff --git a/browser/finder/StorageSection.js b/browser/finder/StorageSection.js index 3dfe072a..a8ed2e5e 100644 --- a/browser/finder/StorageSection.js +++ b/browser/finder/StorageSection.js @@ -1,6 +1,7 @@ import React, { PropTypes } from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './StorageSection.styl' +import StorageItem from 'browser/components/StorageItem' class StorageSection extends React.Component { constructor (props) { @@ -30,20 +31,17 @@ class StorageSection extends React.Component { render () { let { storage, filter } = this.props let folderList = storage.folders - .map((folder) => { - return ( - - ) - }) + .map(folder => ( + this.handleFolderClick(e, folder)} + folderName={folder.name} + folderColor={folder.color} + isFolded={false} + /> + )) + return (
diff --git a/browser/finder/index.js b/browser/finder/index.js index ffe6bb4e..0f6e3735 100644 --- a/browser/finder/index.js +++ b/browser/finder/index.js @@ -9,6 +9,7 @@ import styles from './FinderMain.styl' import StorageSection from './StorageSection' import NoteList from './NoteList' import NoteDetail from './NoteDetail' +import SideNavFilter from 'browser/components/SideNavFilter' require('!!style!css!stylus?sourceMap!../main/global.styl') require('../lib/customMeta') @@ -307,18 +308,12 @@ class FinderMain extends React.Component { /> Only Markdown
- - + this.handleAllNotesButtonClick(e)} + isStarredActive={filter.type === 'STARRED'} + handleStarredButtonClick={(e) => this.handleStarredButtonClick(e)} + />
{storageList}
diff --git a/browser/lib/date-formatter.js b/browser/lib/date-formatter.js new file mode 100644 index 00000000..c30f9826 --- /dev/null +++ b/browser/lib/date-formatter.js @@ -0,0 +1,18 @@ +/** + * @fileoverview Formatting date string. + */ +import moment from 'moment'; + +/** + * @description Return date string. For example, 'Sep.9, 2016 12:00'. + * @param {mixed} + * @return {string} + */ +export function getLastUpdated(date) { + const m = moment(date) + if (!m.isValid()) { + throw Error('Invalid argument.'); + } + + return m.format('MMM D, gggg H:mm') +} diff --git a/browser/main/Detail/DetailVars.styl b/browser/main/Detail/DetailVars.styl new file mode 100644 index 00000000..ad492c54 --- /dev/null +++ b/browser/main/Detail/DetailVars.styl @@ -0,0 +1,9 @@ +/** + * Varibales for note detail space. + */ + +// Margin on the left side and the right side for NoteDetail component. +$note-detail-left-margin = 25px +$note-detail-right-margin = 25px + +$note-detail-box-shadow = 2px 0 15px -8px #b1b1b1 inset diff --git a/browser/main/Detail/LastUpdatedString.js b/browser/main/Detail/LastUpdatedString.js new file mode 100644 index 00000000..764709ef --- /dev/null +++ b/browser/main/Detail/LastUpdatedString.js @@ -0,0 +1,27 @@ +/** + * @fileoverview Component for show updated date of the detail. + */ +import React, { PropTypes } from 'react' +import { getLastUpdated } from 'browser/lib/date-formatter' +import CSSModules from 'browser/lib/CSSModules' +import styles from './LastUpdatedString.styl' + +const LastUpdatedString = ({ date }) => { + let text = '' + + try { + text = `Last updated at ${getLastUpdated(date)}` + } catch (e) { + text = '' + } + + return ( +

{text}

+ ) +} + +LastUpdatedString.propTypes = { + date: PropTypes.string, +} + +export default CSSModules(LastUpdatedString, styles) diff --git a/browser/main/Detail/LastUpdatedString.styl b/browser/main/Detail/LastUpdatedString.styl new file mode 100644 index 00000000..a6c94c62 --- /dev/null +++ b/browser/main/Detail/LastUpdatedString.styl @@ -0,0 +1,8 @@ +.info-right-date + display inline + font-size 11px + color $ui-button-color + +body[data-theme="dark"] + .info-right-date + color $ui-dark-button-color diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 04d7770d..7b0a2411 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -4,7 +4,7 @@ import styles from './MarkdownNoteDetail.styl' import MarkdownEditor from 'browser/components/MarkdownEditor' import StarButton from './StarButton' import TagSelect from './TagSelect' -import FolderSelect from './FolderSelect' +import LastUpdatedString from './LastUpdatedString' import dataApi from 'browser/main/lib/dataApi' import { hashHistory } from 'react-router' import ee from 'browser/main/lib/eventEmitter' @@ -166,20 +166,6 @@ class MarkdownNoteDetail extends React.Component { } - handleShareButtonClick (e) { - let menu = new Menu() - menu.append(new MenuItem({ - label: 'Export as a File', - click: (e) => this.handlePreferencesButtonClick(e) - })) - menu.append(new MenuItem({ - label: 'Export to Web', - disabled: true, - click: (e) => this.handlePreferencesButtonClick(e) - })) - menu.popup(remote.getCurrentWindow()) - } - handleContextButtonClick (e) { let menu = new Menu() menu.append(new MenuItem({ @@ -229,44 +215,22 @@ class MarkdownNoteDetail extends React.Component { >
-
- this.handleFolderChange(e)} - /> -
-
- this.handleChange(e)} - /> -
-
-
- this.handleStarButtonClick(e)} isActive={note.isStarred} /> - + this.handleChange(e)} + /> +
+
+
diff --git a/browser/main/Detail/MarkdownNoteDetail.styl b/browser/main/Detail/MarkdownNoteDetail.styl index 0e801787..e23296a4 100644 --- a/browser/main/Detail/MarkdownNoteDetail.styl +++ b/browser/main/Detail/MarkdownNoteDetail.styl @@ -1,68 +1,19 @@ -$info-height = 75px +@import('NoteDetailInfo') +@import('DetailVars') .root absolute top right bottom border-width 0 0 1px border-style solid border-color $ui-borderColor - -.info - absolute top left right - height $info-height - border-bottom $ui-border - background-color $ui-backgroundColor - -.info-left - float left - padding 0 5px - -.info-left-top - height 40px - line-height 40px - -.info-left-top-folderSelect - display inline-block - height 34px - width 200px - vertical-align middle - -.info-left-bottom - height 30px - -.info-left-bottom-tagSelect - height 30px - line-height 30px - -.info-right - float right - -.info-right-button - width 34px - height 34px - border-radius 17px - navButtonColor() - border $ui-border - font-size 14px - margin 8px 2px - padding 0 - &:active - border-color $ui-button--focus-borderColor - &:hover .info-right-button-tooltip - opacity 1 - &:focus - border-color $ui-button--focus-borderColor - -.info-right-button-tooltip - tooltip() - position fixed - top 45px - padding 5px - opacity 0 - border-radius 2px + background-color $ui-noteDetail-backgroundColor + box-shadow $note-detail-box-shadow .body absolute left right - top $info-height + left $note-detail-left-margin + right $note-detail-right-margin + top $info-height + $info-margin-under-border bottom $statusBar-height .body-noteEditor @@ -71,32 +22,5 @@ $info-height = 75px body[data-theme="dark"] .root border-color $ui-dark-borderColor - - .info - border-color $ui-dark-borderColor - background-color $ui-dark-backgroundColor - - .info-delete - color $ui-dark-text-color - - .info-delete-confirmButton - colorDarkDangerButton() - color $ui-dark-text-color - - .info-delete-cancelButton - colorDarkDefaultButton() - border-color $ui-dark-borderColor - color $ui-dark-text-color - - .info-right-button - navDarkButtonColor() - border-color $ui-dark-borderColor - &:active - border-color $ui-dark-button--focus-borderColor - &:hover .info-right-button-tooltip - opacity 1 - &:focus - border-color $ui-button--focus-borderColor - - .info-right-button-tooltip - darkTooltip() + background-color $ui-dark-noteDetail-backgroundColor + box-shadow none diff --git a/browser/main/Detail/NoteDetailInfo.styl b/browser/main/Detail/NoteDetailInfo.styl new file mode 100644 index 00000000..4d27093c --- /dev/null +++ b/browser/main/Detail/NoteDetailInfo.styl @@ -0,0 +1,85 @@ +@import('DetailVars') + +$info-height = 60px +$info-margin-under-border = 27px + +.info + absolute top left right + left $note-detail-left-margin + right $note-detail-right-margin + height $info-height + border-bottom $ui-border + background-color $ui-noteDetail-backgroundColor + +.info-left + float left + padding 0 5px + margin 0px 2px + +.info-left-button + width 34px + height 34px + navButtonColor() + color $ui-favorite-star-button-color + font-size 14px + margin 13px 2px + padding 0 + border-radius 17px + &:hover .info-right-button-tooltip + opacity 1 + &:focus + border-color $ui-favorite-star-button-color + &:active, &:active:hover + background-color $ui-favorite-star-button-color + color $ui-button--active-color + +.info-right + position absolute + right 0 + top 0 + background $ui-noteDetail-backgroundColor + bottom 1px + padding-left 30px + +.info-right-button + width 34px + height 34px + border-radius 17px + font-size 14px + margin 13px 7px + padding 0 + border none + color $ui-button-color + background-color transparent + &:hover + opacity 1 + background-color $ui-button--hover-backgroundColor + + +body[data-theme="dark"] + .info + border-color $ui-dark-borderColor + background-color $ui-dark-noteDetail-backgroundColor + + .info-delete + color $ui-dark-text-color + + .info-delete-confirmButton + colorDarkDangerButton() + color $ui-dark-text-color + + .info-delete-cancelButton + colorDarkDefaultButton() + border-color $ui-dark-borderColor + color $ui-dark-text-color + + .info-right + background-color $ui-dark-noteDetail-backgroundColor + + .info-right-button + navDarkButtonColor() + border-color $ui-dark-borderColor + &:active + border-color $ui-dark-button--focus-borderColor + &:focus + border-color $ui-button--focus-borderColor diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 9ad8e2e7..fdc76262 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -5,12 +5,12 @@ import CodeEditor from 'browser/components/CodeEditor' import MarkdownEditor from 'browser/components/MarkdownEditor' import StarButton from './StarButton' import TagSelect from './TagSelect' -import FolderSelect from './FolderSelect' +import LastUpdatedString from './LastUpdatedString' import dataApi from 'browser/main/lib/dataApi' import { hashHistory } from 'react-router' import ee from 'browser/main/lib/eventEmitter' import CodeMirror from 'codemirror' -import SnippetTab from './SnippetTab' +import SnippetTab from 'browser/components/SnippetTab' import StatusBar from '../StatusBar' import context from 'browser/lib/context' import ConfigManager from 'browser/main/lib/ConfigManager' @@ -188,21 +188,6 @@ class SnippetNoteDetail extends React.Component { } - handleShareButtonClick (e) { - let menu = new Menu() - menu.append(new MenuItem({ - label: 'Export as a File', - disabled: true, - click: (e) => this.handlePreferencesButtonClick(e) - })) - menu.append(new MenuItem({ - label: 'Export to Web', - disabled: true, - click: (e) => this.handlePreferencesButtonClick(e) - })) - menu.popup(remote.getCurrentWindow()) - } - handleContextButtonClick (e) { context.popup([{ label: 'Delete', @@ -538,44 +523,22 @@ class SnippetNoteDetail extends React.Component { >
-
- this.handleFolderChange(e)} - /> -
-
- this.handleChange(e)} - /> -
-
-
- this.handleStarButtonClick(e)} isActive={note.isStarred} /> - + this.handleChange(e)} + /> +
+
+
diff --git a/browser/main/Detail/SnippetNoteDetail.styl b/browser/main/Detail/SnippetNoteDetail.styl index 3ecec069..9356f6b2 100644 --- a/browser/main/Detail/SnippetNoteDetail.styl +++ b/browser/main/Detail/SnippetNoteDetail.styl @@ -1,72 +1,25 @@ -$info-height = 75px +@import('NoteDetailInfo') +@import('DetailVars') .root absolute top bottom right border-width 0 0 1px border-style solid border-color $ui-borderColor - -.info - absolute top left right - height $info-height - border-bottom $ui-border - background-color $ui-backgroundColor - -.info-left - float left - padding 0 5px - -.info-left-top - height 40px - line-height 40px - -.info-left-top-folderSelect - display inline-block - height 34px - width 200px - vertical-align middle - -.info-left-bottom - height 30px - -.info-left-bottom-tagSelect - height 30px - line-height 30px - -.info-right - float right - -.info-right-button - width 34px - height 34px - border-radius 17px - navButtonColor() - border $ui-border - font-size 14px - margin 8px 2px - padding 0 - &:active - border-color $ui-button--focus-borderColor - &:hover .info-right-button-tooltip - opacity 1 - &:focus - border-color $ui-button--focus-borderColor -.info-right-button-tooltip - tooltip() - position fixed - top 45px - padding 5px - opacity 0 + background-color $ui-noteDetail-backgroundColor + box-shadow $note-detail-box-shadow .body absolute left right - top $info-height + left $note-detail-left-margin + right $note-detail-right-margin + top $info-height + $info-margin-under-border bottom $statusBar-height + background-color $ui-noteDetail-backgroundColor .body .description absolute top left right height 80px - border-bottom $ui-border .body .description textarea display block @@ -76,20 +29,19 @@ $info-height = 75px border none padding 10px line-height 1.6 + background-color $ui-noteDetail-backgroundColor .tabList absolute left right top 80px height 30px - border-bottom $ui-border display flex - background-color $ui-backgroundColor + background-color $ui-noteDetail-backgroundColor .tabList .list flex 1 display flex overflow hidden - border-right $ui-border .tabList .plusButton navButtonColor() @@ -97,7 +49,7 @@ $info-height = 75px .tabView absolute left right bottom - top 110px + top 130px .tabView-content absolute top left right bottom @@ -118,47 +70,19 @@ $info-height = 75px body[data-theme="dark"] .root border-color $ui-dark-borderColor + background-color $ui-dark-noteDetail-backgroundColor + box-shadow none - .info - border-bottom-color $ui-dark-borderColor - background-color $ui-dark-backgroundColor - - .info-delete - color $ui-dark-text-color - - .info-delete-confirmButton - colorDarkDangerButton() - color $ui-dark-text-color - - .info-delete-cancelButton - colorDarkDefaultButton() - border-color $ui-dark-borderColor - color $ui-dark-text-color - - .info-right-button - navDarkButtonColor() - border-color $ui-dark-borderColor - &:active - border-color $ui-dark-button--focus-borderColor - &:hover .info-right-button-tooltip - opacity 1 - &:focus - border-color $ui-button--focus-borderColor - - .info-right-button-tooltip - darkTooltip() - - .body .description - border-bottom-color $ui-dark-borderColor + .body + background-color $ui-dark-noteDetail-backgroundColor .body .description textarea - background-color $ui-dark-button--hover-backgroundColor + background-color $ui-dark-noteDetail-backgroundColor color white .tabList background-color $ui-button--active-backgroundColor - border-bottom-color $ui-dark-borderColor - background-color $ui-dark-backgroundColor + background-color $ui-dark-noteDetail-backgroundColor .tabList .list border-color $ui-dark-borderColor diff --git a/browser/main/Detail/StarButton.js b/browser/main/Detail/StarButton.js index 055a4fff..8610c950 100644 --- a/browser/main/Detail/StarButton.js +++ b/browser/main/Detail/StarButton.js @@ -53,7 +53,6 @@ class StarButton extends React.Component { : 'fa fa-star-o' } /> - Star Note ) } diff --git a/browser/main/Detail/StarButton.styl b/browser/main/Detail/StarButton.styl index 89b199dc..4362ab6b 100644 --- a/browser/main/Detail/StarButton.styl +++ b/browser/main/Detail/StarButton.styl @@ -1,5 +1,7 @@ .root - position relative + position absolute + left 7px + top 0 padding 0 &:hover .icon @@ -9,19 +11,11 @@ .root--active @extend .root - color $brand-color + color $ui-favorite-star-button-color &:hover - color $brand-color !important + color $ui-favorite-star-button-color .icon transform rotate(-72deg) + .icon transition transform 0.15s - -.tooltip - tooltip() - position fixed - top 45px - right 65px - padding 5px - opacity 0 - border-radius 2px diff --git a/browser/main/Detail/TagSelect.js b/browser/main/Detail/TagSelect.js index 14316dae..ff264763 100644 --- a/browser/main/Detail/TagSelect.js +++ b/browser/main/Detail/TagSelect.js @@ -8,7 +8,7 @@ class TagSelect extends React.Component { super(props) this.state = { - newTag: '' + newTag: '', } } @@ -107,12 +107,12 @@ class TagSelect extends React.Component { + {tag} - {tag} ) }) @@ -125,10 +125,7 @@ class TagSelect extends React.Component { } styleName='root' > - - {tagList} + {tagList} this.handleNewTagInputChange(e)} onKeyDown={(e) => this.handleNewTagInputKeyDown(e)} /> - ) } diff --git a/browser/main/Detail/TagSelect.styl b/browser/main/Detail/TagSelect.styl index ba7e309c..54a7e70c 100644 --- a/browser/main/Detail/TagSelect.styl +++ b/browser/main/Detail/TagSelect.styl @@ -1,46 +1,48 @@ .root - position relative + position absolute + top 19px + left 44px user-select none - -.icon - display inline-block - width 30px vertical-align middle - text-align center - color $ui-button-color + width 300px + overflow-x scroll + white-space nowrap + +.root::-webkit-scrollbar + display none .tag display inline-block margin 0 2px + padding-left 10px vertical-align middle height 20px - background-color white - border-radius 3px + background-color $ui-tag-backgroundColor + border-radius 20px overflow hidden clearfix() .tag-removeButton - float left + float right height 20px width 18px margin 0 padding 0 border-style solid - border-color $ui-button--focus-borderColor - border-width 0 0 0 3px + border-width 0 + border-radius 20px line-height 18px background-color transparent color $ui-button-color - &:hover - background-color $ui-button--hover-backgroundColor - &:active, &:active:hover - color $ui-button--active-color - background-color $ui-button--active-backgroundColor - border-color $ui-button--focus-borderColor - &:focus - border-color $ui-button--focus-borderColor + +.tag-removeButton-icon + width 5px + padding-right 4px .tag-label + font-size 12px + font-weight bold + color: #FFFFFF float left height 20px line-height 20px @@ -62,12 +64,27 @@ &:disabled background-color $ui-input--disabled-backgroundColor = #DDD +.add-tag-button + display inline + margin-left 5px + width 20px + height 20px + border none + border-radius 20px + padding 0 + color #FFFFFF + &:hover + background-color rgba(0, 0, 0, 0.3) + &:active, &:active:hover + background-color rgba(0, 0, 0, 0.5) + color $ui-button--active-color + body[data-theme="dark"] .icon color $ui-dark-button-color .tag - background-color $ui-dark-button--hover-backgroundColor + background-color $ui-dark-tag-backgroundColor .tag-removeButton border-color $ui-button--focus-borderColor @@ -85,3 +102,10 @@ body[data-theme="dark"] border-color $ui-input--focus-borderColor = #369DCD &:disabled background-color $ui-input--disabled-backgroundColor = #DDD + + .add-tag-button + &:hover + background-color rgba(255, 255, 255, 0.3) + &:active, &:active:hover + background-color rgba(255, 255, 255, 0.5) + color $ui-button--active-color diff --git a/browser/main/Main.js b/browser/main/Main.js index e3d40759..0033fa89 100644 --- a/browser/main/Main.js +++ b/browser/main/Main.js @@ -26,7 +26,7 @@ class Main extends React.Component { this.state = { isRightSliderFocused: false, listWidth: config.listWidth, - navWidth: config.listWidth, + navWidth: config.navWidth, isLeftSliderFocused: false } } @@ -85,6 +85,7 @@ class Main extends React.Component { } handleMouseUp (e) { + // Change width of NoteList component. if (this.state.isRightSliderFocused) { this.setState({ isRightSliderFocused: false @@ -99,6 +100,8 @@ class Main extends React.Component { }) }) } + + // Change width of SideNav component. if (this.state.isLeftSliderFocused) { this.setState({ isLeftSliderFocused: false @@ -106,10 +109,10 @@ class Main extends React.Component { let { dispatch } = this.props let navWidth = this.state.navWidth // TODO: ConfigManager should dispatch itself. - ConfigManager.set({listWidth: navWidth}) + ConfigManager.set({ navWidth }) dispatch({ type: 'SET_NAV_WIDTH', - listWidth: navWidth + navWidth, }) }) } @@ -162,7 +165,7 @@ class Main extends React.Component { /> {!config.isSideNavFolded &&
this.handleLeftSlideMouseDown(e)} draggable='false' > @@ -191,15 +194,15 @@ class Main extends React.Component { 'location' ])} /> -
this.handleRightSlideMouseDown(e)} draggable='false' >
Copied! - copied: false, - failed: false - } -} - -export default class ShareButton extends React.Component { - constructor (props) { - super(props) - this.state = getDefault() - } - - componentWillReceiveProps (nextProps) { - this.setState(getDefault()) - } - - componentDidMount () { - this.dropdownInterceptor = e => { - this.dropdownClicked = true - } - ReactDOM.findDOMNode(this.refs.dropdown).addEventListener('click', this.dropdownInterceptor) - this.shareViaPublicURLHandler = e => { - this.handleShareViaPublicURLClick(e) - } - } - - componentWillUnmount () { - document.removeEventListener('click', this.dropdownHandler) - ReactDOM.findDOMNode(this.refs.dropdown).removeEventListener('click', this.dropdownInterceptor) - } - - handleOpenButtonClick (e) { - this.openDropdown() - if (this.dropdownHandler == null) { - this.dropdownHandler = e => { - if (!this.dropdownClicked) { - this.closeDropdown() - } else { - this.dropdownClicked = false - } - } - } - document.removeEventListener('click', this.dropdownHandler) - document.addEventListener('click', this.dropdownHandler) - } - - openDropdown () { - this.setState({openDropdown: true}) - } - - closeDropdown () { - document.removeEventListener('click', this.dropdownHandler) - this.setState({openDropdown: false}) - } - - handleClipboardButtonClick (e) { - activityRecord.emit('MAIN_DETAIL_COPY') - clipboard.writeText(this.props.article.content) - notify('Saved to Clipboard!', { - body: 'Paste it wherever you want!' - }) - this.setState({openDropdown: false}) - } - - handleShareViaPublicURLClick (e) { - let { user } = this.props - let input = Object.assign({}, this.props.article, { - clientKey: clientKey.get(), - writerName: user.name - }) - this.setState({ - isSharing: true, - failed: false - }, () => { - api.shareViaPublicURL(input) - .then(res => { - let url = res.body.url - this.setState({url: url, isSharing: false}) - activityRecord.emit('ARTICLE_SHARE') - }) - .catch(err => { - console.log(err) - this.setState({isSharing: false, failed: true}) - }) - }) - } - - handleCopyURLClick () { - clipboard.writeText(this.state.url) - this.setState({copied: true}) - } - - // Restore copy url tooltip - handleCopyURLMouseLeave () { - this.setState({copied: false}) - } - - render () { - let hasPublicURL = this.state.url != null - return ( -
- -
- { - !hasPublicURL ? ( - - ) : ( -
- - -
This url is valid for 7 days.
-
- ) - } - -
-
- ) - } -} - -ShareButton.propTypes = { - article: PropTypes.shape({ - publicURL: PropTypes.string, - content: PropTypes.string - }), - user: PropTypes.shape({ - name: PropTypes.string - }) -} diff --git a/browser/main/NoteList/NoteList.styl b/browser/main/NoteList/NoteList.styl index a20485e4..0adb3678 100644 --- a/browser/main/NoteList/NoteList.styl +++ b/browser/main/NoteList/NoteList.styl @@ -1,25 +1,28 @@ +$control-height = 30px + .root absolute left bottom - border-top $ui-border top $topBar-height - 1 + background-color $ui-noteList-backgroundColor .control absolute top left right user-select none - height 25px - font-size 10px - border-bottom $ui-border + height $control-height + font-size 12px line-height 25px display flex - background-color $ui-backgroundColor + background-color $ui-noteList-backgroundColor color $ui-inactive-text-color .control-sortBy flex 1 - padding-left 5px + padding-left 25px .control-sortBy-select - margin-left 5px + margin-left 0 + font-size 12px + color $ui-inactive-text-color padding 0 border none background-color transparent @@ -36,8 +39,6 @@ color $ui-active-color &:hover color $ui-text-color - .control-button-tooltip - opacity 1 .control-button--active @extend .control-button @@ -45,178 +46,22 @@ &:hover color $ui-active-color -.control-button-tooltip - tooltip() - position absolute - top 20px - right 5px - padding 5px - opacity 0 - white-space nowrap - border-radius 2px - z-index 1 - .list absolute left right bottom - top 24px + top $control-height overflow auto -.item - position relative - border-bottom $ui-border - padding 2px 5px - user-select none - cursor pointer - transition background-color 0.15s - &:hover - background-color alpha($ui-active-color, 20%) - &:active - background-color $ui-active-color - color white - .item-title - .item-title-empty - .item-title-icon - .item-bottom-tagIcon - .item-bottom-tagList-empty - .item-bottom-time - color white - .item-bottom-tagList-item - background-color transparent - color white - -.item--active - @extend .item - background-color $ui-active-color - color white - .item-title - .item-title-empty - .item-title-icon - .item-bottom-tagIcon - .item-bottom-tagList-empty - .item-bottom-time - color white - .item-bottom-tagList-item - background-color transparent - color white - &:hover - background-color $ui-active-color - -.item-border - absolute top bottom left right - border-style solid - border-width 2px - border-color transparent - transition 0.15s - -.item-title - height 24px - box-sizing border-box - line-height 24px - padding 0 - overflow ellipsis - color $ui-text-color - -.item-title-icon - font-size 12px - color $ui-inactive-text-color - padding-right 3px - -.item-title-empty - font-weight normal - color $ui-inactive-text-color - -.item-bottom - margin-top 2px - height 20px - font-size 12px - line-height 20px - overflow ellipsis - display flex - -.item-bottom-tagIcon - vertical-align middle - color $ui-button-color - height 20px - line-height 20px - -.item-bottom-tagList - flex 1 - overflow ellipsis - line-height 20px - -.item-bottom-tagList-item - margin 0 4px - padding 0 4px - height 20px - box-sizing border-box - border-radius 3px - vertical-align middle - border-style solid - border-color $ui-button--focus-borderColor - border-width 0 0 0 3px - background-color $ui-backgroundColor - color $ui-text-color - -.item-bottom-tagList-empty - color $ui-inactive-text-color - vertical-align middle - font-size 10px - margin-left 5px - -.item-bottom-time - color $ui-inactive-text-color - margin-left 5px - font-size 10px - body[data-theme="dark"] .root border-color $ui-dark-borderColor - background-color $ui-dark-backgroundColor - - .item - border-color $ui-dark-borderColor - &:hover - background-color alpha($ui-active-color, 20%) - - .item--active - @extend .item - border-color $ui-dark-borderColor - .item-title - color white - .item-bottom-tagList-item - background-color transparent - color white - .item-bottom-tagList-empty - color white - &:hover - background-color $ui-active-color - - .item-title - color $ui-dark-text-color - - .item-title-icon - color $ui-darkinactive-text-color - - .item-title-empty - color $ui-dark-inactive-text-color - - .item-bottom-tagIcon - color $ui-dark-button-color - - .item-bottom-tagList-item - border-color $ui-dark-button--focus-borderColor - background-color $ui-dark-button--hover-backgroundColor - color $ui-dark-text-color - - .item-bottom-tagList-empty - color $ui-inactive-text-color - vertical-align middle + background-color $ui-dark-noteList-backgroundColor .control - background-color $ui-dark-backgroundColor + background-color $ui-dark-noteList-backgroundColor + + .control + background-color $ui-dark-noteList-backgroundColor border-color $ui-dark-borderColor - .control-sortBy-select - color $ui-dark-text-color .control-button color $ui-dark-inactive-text-color diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index b6519db8..6fc34763 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -6,6 +6,8 @@ import _ from 'lodash' import ee from 'browser/main/lib/eventEmitter' import dataApi from 'browser/main/lib/dataApi' import ConfigManager from 'browser/main/lib/ConfigManager' +import NoteItem from 'browser/components/NoteItem' +import NoteItemSimple from 'browser/components/NoteItemSimple' const { remote } = require('electron') const { Menu, MenuItem, dialog } = remote @@ -314,57 +316,40 @@ class NoteList extends React.Component { .sort(sortFunc) let noteList = notes - .map((note) => { - if (note == null) return null - let tagElements = _.isArray(note.tags) - ? note.tags.map((tag) => { - return ( - - {tag} - - ) - }) - : [] - let isActive = location.query.key === note.storage + '-' + note.key + .map(note => { + if (note == null) { + return null + } + + const isDefault = config.listStyle === 'DEFAULT' + const isActive = location.query.key === note.storage + '-' + note.key + const dateDisplay = moment( + config.sortBy === 'CREATED_AT' ? + note.createdAt : note.updatedAt + ).fromNow() + const key = `${note.storage}-${note.key}` + + if (isDefault) { + return ( + + ) + } + return ( -
this.handleNoteClick(e, note.storage + '-' + note.key)} - onContextMenu={(e) => this.handleNoteContextMenu(e, note.storage + '-' + note.key)} - > -
- {note.type === 'SNIPPET_NOTE' - ? - : - } - {note.title.trim().length > 0 - ? note.title - : Empty - } -
- - {config.listStyle === 'DEFAULT' && -
- -
- {tagElements.length > 0 - ? tagElements - : Not tagged yet - } -
- -
- {moment(config.sortBy === 'CREATED_AT' ? note.createdAt : note.updatedAt).fromNow()} -
-
- } -
+ ) }) @@ -391,10 +376,7 @@ class NoteList extends React.Component { } onClick={(e) => this.handleListStyleButtonClick(e, 'DEFAULT')} > - - - Default Size - +
{ - let isActive = location.pathname.match(new RegExp('\/storages\/' + storage.key + '\/folders\/' + folder.key)) + let isActive = !!(location.pathname.match(new RegExp('\/storages\/' + storage.key + '\/folders\/' + folder.key))) let noteSet = folderNoteMap.get(storage.key + '-' + folder.key) let noteCount = noteSet != null ? noteSet.size : 0 - return + return ( + this.handleFolderButtonClick(folder.key)(e)} + handleContextMenu={(e) => this.handleFolderButtonContextMenu(e, folder)} + folderName={folder.name} + folderColor={folder.color} + isFolded={isFolded} + noteCount={noteCount} + /> + ) }) let isActive = location.pathname.match(new RegExp('\/storages\/' + storage.key + '$')) diff --git a/browser/main/SideNav/StorageItem.styl b/browser/main/SideNav/StorageItem.styl index 28f28be3..eeef3bf4 100644 --- a/browser/main/SideNav/StorageItem.styl +++ b/browser/main/SideNav/StorageItem.styl @@ -1,10 +1,12 @@ .root width 100% user-select none + .header position relative height 26px width 100% + margin-bottom 5px transition 0.15s &:hover background-color $ui-button--hover-backgroundColor @@ -45,7 +47,7 @@ .header-info display block width 100% - height 26px + height 30px padding-left 25px padding-right 10px line-height 26px @@ -78,63 +80,6 @@ &:active color $ui-active-color -.folderList-item - display flex - width 100% - height 26px - background-color transparent - color $ui-inactive-text-color - padding 0 - margin-bottom 2px - text-align left - border none - overflow ellipsis - font-size 14px - &:first-child - margin-top 0 - &:hover - background-color $ui-button--hover-backgroundColor - &:active - color $ui-button--active-color - background-color $ui-button--active-backgroundColor - -.folderList-item--active - @extend .folderList-item - color $ui-button--active-color - background-color $ui-button--active-backgroundColor - &:hover - color $ui-button--active-color - background-color $ui-button--active-backgroundColor - -.folderList-item-name - display block - flex 1 - padding 0 10px - height 26px - line-height 26px - border-width 0 0 0 6px - border-style solid - border-color transparent - -.folderList-item-noteCount - float right - line-height 26px - padding-right 5px - font-size 12px - -.folderList-item-tooltip - tooltip() - position fixed - padding 0 10px - left 44px - z-index 10 - pointer-events none - opacity 0 - border-top-right-radius 2px - border-bottom-right-radius 2px - height 26px - line-height 26px - .root--folded @extend .root .header @@ -161,11 +106,7 @@ .header-info--folded-tooltip-path font-size 10px margin 0 5px - .folderList-item:hover, .folderList-item--active:hover - .folderList-item-tooltip - opacity 1 - .folderList-item-name - padding-left 14px + body[data-theme="dark"] .header-toggleButton .header-addFolderButton diff --git a/browser/main/SideNav/index.js b/browser/main/SideNav/index.js index 9b80791b..c0fe0fd2 100644 --- a/browser/main/SideNav/index.js +++ b/browser/main/SideNav/index.js @@ -5,6 +5,7 @@ import { openModal } from 'browser/main/lib/modal' import PreferencesModal from '../modals/PreferencesModal' import ConfigManager from 'browser/main/lib/ConfigManager' import StorageItem from './StorageItem' +import SideNavFilter from 'browser/components/SideNavFilter' const electron = require('electron') const { remote } = electron @@ -39,8 +40,8 @@ class SideNav extends React.Component { let { data, location, config, dispatch } = this.props let isFolded = config.isSideNavFolded - let isHomeActive = location.pathname.match(/^\/home$/) - let isStarredActive = location.pathname.match(/^\/starred$/) + let isHomeActive = !!location.pathname.match(/^\/home$/) + let isStarredActive = !!location.pathname.match(/^\/starred$/) let storageList = data.storageMap.map((storage, key) => { return
-
- - -
+ this.handleHomeButtonClick(e)} + isStarredActive={isStarredActive} + handleStarredButtonClick={(e) => this.handleStarredButtonClick(e)} + />
{storageList.length > 0 ? storageList : ( diff --git a/browser/main/StatusBar/StatusBar.styl b/browser/main/StatusBar/StatusBar.styl index 38083bb8..6c14b86b 100644 --- a/browser/main/StatusBar/StatusBar.styl +++ b/browser/main/StatusBar/StatusBar.styl @@ -1,9 +1,12 @@ +@import('../Detail/DetailVars') + .root absolute bottom left right height $statusBar-height - background-color $ui-backgroundColor + background-color $ui-noteDetail-backgroundColor border-top $ui-border display flex + box-shadow $note-detail-box-shadow .blank flex 1 @@ -39,8 +42,9 @@ body[data-theme="dark"] .root - background-color $ui-dark-backgroundColor + background-color $ui-dark-noteDetail-backgroundColor border-color $ui-dark-borderColor + box-shadow none .zoom border-color $ui-dark-borderColor diff --git a/browser/main/TopBar/TopBar.styl b/browser/main/TopBar/TopBar.styl index b2cfef67..9eccccb4 100644 --- a/browser/main/TopBar/TopBar.styl +++ b/browser/main/TopBar/TopBar.styl @@ -1,19 +1,19 @@ .root position relative - background-color $ui-backgroundColor + background-color $ui-noteList-backgroundColor height $topBar-height - 1 + .root--expanded @extend .root + $control-height = 34px .control position absolute - top 8px + top 13px left 8px right 8px height $control-height - border $ui-border - border-radius 20px overflow hidden display flex @@ -28,6 +28,7 @@ $control-height = 34px line-height 32px width 35px color $ui-inactive-text-color + background-color $ui-noteList-backgroundColor .control-search-input display block @@ -38,6 +39,7 @@ $control-height = 34px height 100% outline none border none + background-color $ui-noteList-backgroundColor .control-search-optionList position fixed @@ -58,6 +60,7 @@ $control-height = 34px overflow ellipsis &:hover background-color alpha($ui-active-color, 10%) + .control-search-optionList-item-folder border-left 4px solid transparent padding 2px 5px @@ -66,40 +69,30 @@ $control-height = 34px font-size 12px height 16px margin-bottom 4px + .control-search-optionList-item-folder-surfix font-size 10px margin-left 5px color $ui-inactive-text-color + .control-search-optionList-item-type font-size 12px color $ui-inactive-text-color padding-right 3px + .control-search-optionList-empty height 150px color $ui-inactive-text-color line-height 150px text-align center -.control-contextButton - display block - width 20px - height $control-height - 2 - navButtonColor() - border-left $ui-border - font-size 14px - line-height 28px - padding 0 - &:active - border-color $ui-button--active-backgroundColor - &:hover .control-newPostButton-tooltip - opacity 1 - .control-newPostButton display block - width 36px + width 32px height $control-height - 2 navButtonColor() - border-left $ui-border + border $ui-border + border-radius 32px font-size 14px line-height 28px padding 0 @@ -112,17 +105,18 @@ $control-height = 34px tooltip() position fixed pointer-events none - top 45px - left 385px - z-index 10 + top 50px + left 433px + z-index 200 padding 5px line-height normal + border-radius 2px opacity 0 transition 0.1s body[data-theme="dark"] .root, .root--expanded - background-color $ui-dark-backgroundColor + background-color $ui-dark-noteList-backgroundColor .control border-color $ui-dark-borderColor @@ -134,11 +128,13 @@ body[data-theme="dark"] line-height 32px width 35px color $ui-dark-inactive-text-color + background-color $ui-dark-noteList-backgroundColor .control-search-input input - background-color $dark-background-color + background-color $ui-dark-noteList-backgroundColor color $ui-dark-text-color + .control-search-optionList color white background-color $ui-dark-button--hover-backgroundColor @@ -162,10 +158,10 @@ body[data-theme="dark"] .control-search-optionList-empty color $ui-inactive-text-color - .control-contextButton, .control-newPostButton colorDarkDefaultButton() border-color $ui-dark-borderColor + background-color $ui-dark-noteList-backgroundColor &:active border-color $ui-dark-button--active-backgroundColor diff --git a/browser/main/TopBar/index.js b/browser/main/TopBar/index.js index 2e4e6ccf..c1094198 100644 --- a/browser/main/TopBar/index.js +++ b/browser/main/TopBar/index.js @@ -192,47 +192,6 @@ class TopBar extends React.Component { } } - handleContextButtonClick (e) { - let { config } = this.props - - let menu = new Menu() - menu.append(new MenuItem({ - label: 'Create Markdown Note', - click: (e) => this.createNote('MARKDOWN_NOTE') - })) - menu.append(new MenuItem({ - label: 'Create Snippet Note', - click: (e) => this.createNote('SNIPPET_NOTE') - })) - menu.append(new MenuItem({ - type: 'separator' - })) - menu.append(new MenuItem({ - label: 'Change Default Note', - submenu: [ - { - type: 'radio', - label: 'Markdown Note', - checked: config.ui.defaultNote === 'MARKDOWN_NOTE', - click: (e) => this.setDefaultNote('MARKDOWN_NOTE') - }, - { - type: 'radio', - label: 'Snippet Note', - checked: config.ui.defaultNote === 'SNIPPET_NOTE', - click: (e) => this.setDefaultNote('SNIPPET_NOTE') - }, - { - type: 'radio', - label: 'Always Ask', - checked: config.ui.defaultNote === 'ALWAYS_ASK', - click: (e) => this.setDefaultNote('ALWAYS_ASK') - } - ] - })) - menu.popup(remote.getCurrentWindow()) - } - createNote (noteType) { let { dispatch, location } = this.props if (noteType !== 'MARKDOWN_NOTE' && noteType !== 'SNIPPET_NOTE') throw new Error('Invalid note type.') @@ -353,14 +312,9 @@ class TopBar extends React.Component { onClick={(e) => this.handleNewPostButtonClick(e)}> - New Note {OSX ? '⌘' : '^'} + n + Make a Note {OSX ? '⌘' : '^'} + n -
) diff --git a/browser/main/lib/ConfigManager.js b/browser/main/lib/ConfigManager.js index 3df57b1b..4008b881 100644 --- a/browser/main/lib/ConfigManager.js +++ b/browser/main/lib/ConfigManager.js @@ -10,7 +10,7 @@ let isInitialized = false export const DEFAULT_CONFIG = { zoom: 1, isSideNavFolded: false, - listWidth: 250, + listWidth: 280, navWidth: 200, sortBy: 'UPDATED_AT', // 'CREATED_AT', 'UPDATED_AT', 'APLHABETICAL' listStyle: 'DEFAULT', // 'DEFAULT', 'SMALL' diff --git a/browser/main/modals/CreateFolderModal.js b/browser/main/modals/CreateFolderModal.js index 0b8adeca..2dc61271 100644 --- a/browser/main/modals/CreateFolderModal.js +++ b/browser/main/modals/CreateFolderModal.js @@ -75,24 +75,27 @@ class CreateFolderModal extends React.Component { onKeyDown={(e) => this.handleKeyDown(e)} >
-
New Folder
+
Create new folder
- +
- this.handleChange(e)} - onKeyDown={(e) => this.handleInputKeyDown(e)} - /> +
+
Folder name
+ this.handleChange(e)} + onKeyDown={(e) => this.handleInputKeyDown(e)} + /> +
diff --git a/browser/main/modals/CreateFolderModal.styl b/browser/main/modals/CreateFolderModal.styl index ff0ddfa4..6b1d208b 100644 --- a/browser/main/modals/CreateFolderModal.styl +++ b/browser/main/modals/CreateFolderModal.styl @@ -1,47 +1,52 @@ .root modal() - max-width 340px + width 700px + height 200px overflow hidden position relative + padding 0 40px .header height 50px + margin-bottom 10px + margin-top 10px font-size 18px line-height 50px - padding 0 15px background-color $ui-backgroundColor - border-bottom solid 1px $ui-borderColor color $ui-text-color -.closeButton +.close-mark + font-size 15px + +.close + height 50px position absolute - top 10px + background-color transparent + color $ui-inactive-text-color + border none + top 7px right 10px - height 30px - width 0 25px - border $ui-border - border-radius 2px - color $ui-text-color - colorDefaultButton() - -.control - padding 25px 15px 15px text-align center + width top-bar--height + height top-bar--height -.control-input +.control-folder-label + text-align left + font-size 14px + color $ui-text-color + +.control-folder-input display block height 30px - width 240px + width 620px padding 0 5px - margin 0 auto 15px - border none - border-bottom solid 1px $border-color - border-radius 2px + margin 10px auto 15px + border 1px solid #C9C9C9 // TODO: use variable. + border-radius 5px background-color transparent outline none vertical-align middle font-size 18px - text-align center &:disabled background-color $ui-input--disabled-backgroundColor &:focus, &:active @@ -50,21 +55,35 @@ .control-confirmButton display block height 30px + width 620px border none - border-radius 2px + border-radius 5px padding 0 25px - margin 0 auto + margin 20px auto + font-size 14px colorPrimaryButton() body[data-theme="dark"] .root modalDark() + width 700px + height 200px + overflow hidden + position relative + padding 0 40px .header - background-color $ui-dark-button--hover-backgroundColor + background-color transparent border-color $ui-dark-borderColor color $ui-dark-text-color + .control-folder-label + color $ui-dark-text-color + + .control-folder-input + border 1px solid #C9C9C9 // TODO: use variable. + color white + .closeButton border-color $ui-dark-borderColor color $ui-dark-text-color @@ -72,8 +91,3 @@ body[data-theme="dark"] .description color $ui-inactive-text-color - - .control-input - border-color $ui-dark-borderColor - color white - diff --git a/browser/main/modals/NewNoteModal.js b/browser/main/modals/NewNoteModal.js index a4562eaf..554652a3 100644 --- a/browser/main/modals/NewNoteModal.js +++ b/browser/main/modals/NewNoteModal.js @@ -100,7 +100,7 @@ class NewNoteModal extends React.Component { onKeyDown={(e) => this.handleKeyDown(e)} >
-
New Note
+
Make a Note
+ + {keymapAlertElement} + + {this.state.isHotkeyHintOpen && +
+

Available Keys

+
    +
  • 0 to 9
  • +
  • A to Z
  • +
  • F1 to F24
  • +
  • Punctuations like ~, !, @, #, $, etc.
  • +
  • Plus
  • +
  • Space
  • +
  • Backspace
  • +
  • Delete
  • +
  • Insert
  • +
  • Return (or Enter as alias)
  • +
  • Up, Down, Left and Right
  • +
  • Home and End
  • +
  • PageUp and PageDown
  • +
  • Escape (or Esc for short)
  • +
  • VolumeUp, VolumeDown and VolumeMute
  • +
  • MediaNextTrack, MediaPreviousTrack, MediaStop and MediaPlayPause
  • +
+
+ } + + + ) + } +} + +HotkeyTab.propTypes = { + dispatch: PropTypes.func, +} + +export default CSSModules(HotkeyTab, styles) diff --git a/browser/main/modals/PreferencesModal/InfoTab.js b/browser/main/modals/PreferencesModal/InfoTab.js index ae3d52d0..6db55648 100644 --- a/browser/main/modals/PreferencesModal/InfoTab.js +++ b/browser/main/modals/PreferencesModal/InfoTab.js @@ -22,17 +22,24 @@ class InfoTab extends React.Component { render () { return (
+
Info
+
- -
Boostnote {appVersion}
-
- A simple markdown/snippet note app for developer. +
+ +
+
Boostnote {appVersion}
+
+ A simple markdown/snippet note app for developer. +
+
+
-
Copyright 2016 MAISIN&CO. All rights reserved.
+
Copyright 2017 MAISIN&CO. All rights reserved.
  • diff --git a/browser/main/modals/PreferencesModal/InfoTab.styl b/browser/main/modals/PreferencesModal/InfoTab.styl index 63244cd2..2c17ae17 100644 --- a/browser/main/modals/PreferencesModal/InfoTab.styl +++ b/browser/main/modals/PreferencesModal/InfoTab.styl @@ -1,3 +1,5 @@ +@import('./Tab') + .root padding 15px white-space pre @@ -5,27 +7,39 @@ color $ui-text-color width 100% +.clear + clear both + .top - text-align center - margin-bottom 25px + text-align left + margin-bottom 20px + +.icon-space + margin 20px 0 + height 100px + +.icon + display inline-block + vertical-align middle + +.icon-right + display inline-block + vertical-align middle + margin-left 20px .appId font-size 24px + margin-bottom 13px .description - overflow hidden - white-space normal - line-height 1.5 - margin 5px auto 10px font-size 14px - text-align center .madeBy - font-size 12px + font-size 14px $ui-inactive-text-color .copyright - font-size 12px + font-size 14px $ui-inactive-text-color .list @@ -36,7 +50,7 @@ body[data-theme="dark"] .root - color $ui-dark-text-color + color $tab--dark-text-color .madeBy color $ui-dark-inactive-text-color diff --git a/browser/main/modals/PreferencesModal/PreferencesModal.styl b/browser/main/modals/PreferencesModal/PreferencesModal.styl index 73a6719a..ec16a2be 100644 --- a/browser/main/modals/PreferencesModal/PreferencesModal.styl +++ b/browser/main/modals/PreferencesModal/PreferencesModal.styl @@ -1,51 +1,93 @@ +@import('./Tab') + +top-bar--height = 50px + .root modal() - max-width 540px - min-height 400px + max-width 800px + min-height 500px height 80% overflow hidden position relative -.nav +.top-bar absolute top left right - height 50px + height top-bar--height background-color $ui-backgroundColor border-bottom solid 1px $ui-borderColor + p + text-align center + font-size 18px + line-height top-bar--height + +.top-bar-close + position absolute + background-color transparent + color $ui-inactive-text-color + border none + top 0 + right 0 + text-align center + width top-bar--height + height top-bar--height + +.nav + absolute top left right + top top-bar--height + left 0 + width 140px + margin-left 30px + margin-top 20px + background-color $ui-backgroundColor .nav-button - width 80px - height 50px + font-size 14px + text-align left + width 100px + margin 4px 0 + padding 7px 0 + padding-left 7px border none + border-radius 3px background-color transparent - color #939395 + color $ui-text-color font-size 14px &:hover - color #515151 + color $ui-active-color .nav-button--active @extend .nav-button - color #6AA5E9 + color white + background-color $ui-active-color &:hover - color #6AA5E9 + color white .nav-button-icon display block .content absolute left right bottom - top 50px + top top-bar--height + left 140px + margin-top 10px overflow-y auto body[data-theme="dark"] .root modalDark() + .top-bar + background-color transparent + border-color #4A4D52 + p + color $tab--dark-text-color + .nav - background-color $ui-dark-button--hover-backgroundColor + background-color transparent border-color $ui-dark-borderColor .nav-button background-color transparent - color #939395 + color $tab--dark-text-color &:hover color $ui-dark-text-color diff --git a/browser/main/modals/PreferencesModal/StoragesTab.js b/browser/main/modals/PreferencesModal/StoragesTab.js index f0609e6e..33ee6c39 100644 --- a/browser/main/modals/PreferencesModal/StoragesTab.js +++ b/browser/main/modals/PreferencesModal/StoragesTab.js @@ -63,6 +63,7 @@ class StoragesTab extends React.Component { }) return (
    +
    Storages
    {storageList.length > 0 ? storageList :
    No storage found.
    diff --git a/browser/main/modals/PreferencesModal/StoragesTab.styl b/browser/main/modals/PreferencesModal/StoragesTab.styl index a8b136f7..7bd98f0d 100644 --- a/browser/main/modals/PreferencesModal/StoragesTab.styl +++ b/browser/main/modals/PreferencesModal/StoragesTab.styl @@ -1,3 +1,5 @@ +@import('./Tab') + .root padding 15px color $ui-text-color @@ -26,11 +28,12 @@ .list-control height 30px .list-control-addStorageButton - height 30px + height $tab--button-height padding 0 15px border $ui-border colorDefaultButton() - border-radius 2px + font-size $tab--button-font-size + border-radius $tab--button-border-radius .addStorage margin-bottom 15px diff --git a/browser/main/modals/PreferencesModal/Tab.styl b/browser/main/modals/PreferencesModal/Tab.styl new file mode 100644 index 00000000..7280407b --- /dev/null +++ b/browser/main/modals/PreferencesModal/Tab.styl @@ -0,0 +1,18 @@ +/** + * Common style for tabs on config modal. + */ + +$tab--input-border-radius = 5px +$tab--button-border-radius = 5px +$tab--button-height = 40px +$tab--button-font-size = 14px + +$tab--dark-text-color = #E5E5E5 + +.header + font-size 24px + margin-bottom 30px + +body[data-theme="dark"] + .header + color $tab--dark-text-color diff --git a/browser/main/modals/PreferencesModal/ConfigTab.js b/browser/main/modals/PreferencesModal/UiTab.js similarity index 60% rename from browser/main/modals/PreferencesModal/ConfigTab.js rename to browser/main/modals/PreferencesModal/UiTab.js index 4091a749..a4031a90 100644 --- a/browser/main/modals/PreferencesModal/ConfigTab.js +++ b/browser/main/modals/PreferencesModal/UiTab.js @@ -10,97 +10,15 @@ const ipc = electron.ipcRenderer const OSX = global.process.platform === 'darwin' -class ConfigTab extends React.Component { +class UiTab extends React.Component { constructor (props) { super(props) this.state = { - isHotkeyHintOpen: false, config: props.config } } - componentDidMount () { - this.handleSettingDone = () => { - this.setState({keymapAlert: { - type: 'success', - message: 'Successfully applied!' - }}) - } - this.handleSettingError = (err) => { - this.setState({keymapAlert: { - type: 'error', - message: err.message != null ? err.message : 'Error occurs!' - }}) - } - ipc.addListener('APP_SETTING_DONE', this.handleSettingDone) - ipc.addListener('APP_SETTING_ERROR', this.handleSettingError) - } - - componentWillUnmount () { - ipc.removeListener('APP_SETTING_DONE', this.handleSettingDone) - ipc.removeListener('APP_SETTING_ERROR', this.handleSettingError) - } - - handleSaveButtonClick (e) { - let newConfig = { - hotkey: this.state.config.hotkey - } - - ConfigManager.set(newConfig) - - store.dispatch({ - type: 'SET_UI', - config: newConfig - }) - } - - handleKeyDown (e) { - if (e.keyCode === 13) { - this.submitHotKey() - } - } - - handleConfigKeyDown (e) { - if (e.keyCode === 13) { - this.submitConfig() - } - } - - handleLineNumberingClick (e) { - let config = this.state.config - - config['preview-line-number'] = e.target.checked - this.setState({ - config - }) - } - - handleDisableDirectWriteClick (e) { - let config = this.state.config - config['disable-direct-write'] = e.target.checked - this.setState({ - config - }) - } - - handleHintToggleButtonClick (e) { - this.setState({ - isHotkeyHintOpen: !this.state.isHotkeyHintOpen - }) - } - - handleHotkeyChange (e) { - let { config } = this.state - config.hotkey = { - toggleFinder: this.refs.toggleFinder.value, - toggleMain: this.refs.toggleMain.value - } - this.setState({ - config - }) - } - handleUIChange (e) { let { config } = this.state @@ -125,13 +43,11 @@ class ConfigTab extends React.Component { lineNumber: this.refs.previewLineNumber.checked } - this.setState({ - config - }) + this.setState({ config }) } handleSaveUIClick (e) { - let newConfig = { + const newConfig = { ui: this.state.config.ui, editor: this.state.config.editor, preview: this.state.config.preview @@ -146,84 +62,17 @@ class ConfigTab extends React.Component { } render () { - let keymapAlert = this.state.keymapAlert - let keymapAlertElement = keymapAlert != null - ?

    - {keymapAlert.message} -

    - : null - let themes = consts.THEMES - let { config } = this.state + const themes = consts.THEMES + const { config } = this.state return (
    -
    -
    Hotkey
    -
    -
    Toggle Main
    -
    - this.handleHotkeyChange(e)} - ref='toggleMain' - value={config.hotkey.toggleMain} - type='text' - /> -
    -
    -
    -
    Toggle Finder(popup)
    -
    - this.handleHotkeyChange(e)} - ref='toggleFinder' - value={config.hotkey.toggleFinder} - type='text' - /> -
    -
    -
    - - - {keymapAlertElement} -
    - {this.state.isHotkeyHintOpen && -
    -

    Available Keys

    -
      -
    • 0 to 9
    • -
    • A to Z
    • -
    • F1 to F24
    • -
    • Punctuations like ~, !, @, #, $, etc.
    • -
    • Plus
    • -
    • Space
    • -
    • Backspace
    • -
    • Delete
    • -
    • Insert
    • -
    • Return (or Enter as alias)
    • -
    • Up, Down, Left and Right
    • -
    • Home and End
    • -
    • PageUp and PageDown
    • -
    • Escape (or Esc for short)
    • -
    • VolumeUp, VolumeDown and VolumeMute
    • -
    • MediaNextTrack, MediaPreviousTrack, MediaStop and MediaPlayPause
    • -
    -
    - } -
    -
    UI
    + +
    Theme
    +
    -
    Theme