├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE └── PULL_REQUEST_TEMPLATE ├── .gitignore ├── .jscsrc ├── .travis.yml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app ├── actions │ ├── AliasesActions.js │ ├── KeychainActions.js │ ├── UIActions.js │ └── index.js ├── app.global.css ├── app.html ├── app.icns ├── assets │ ├── fonts │ │ └── work-sans │ │ │ ├── WorkSans-Bold.woff2 │ │ │ ├── WorkSans-Light.woff2 │ │ │ ├── WorkSans-Medium.woff2 │ │ │ ├── WorkSans-Regular.woff2 │ │ │ └── WorkSans.css │ ├── images │ │ ├── avatar.png │ │ ├── avatar1.png │ │ ├── avatar1.svg │ │ ├── avatar10.png │ │ ├── avatar10.svg │ │ ├── avatar11.png │ │ ├── avatar11.svg │ │ ├── avatar12.png │ │ ├── avatar12.svg │ │ ├── avatar13.png │ │ ├── avatar13.svg │ │ ├── avatar14.png │ │ ├── avatar14.svg │ │ ├── avatar15.png │ │ ├── avatar15.svg │ │ ├── avatar16.png │ │ ├── avatar16.svg │ │ ├── avatar17.png │ │ ├── avatar17.svg │ │ ├── avatar18.png │ │ ├── avatar18.svg │ │ ├── avatar19.png │ │ ├── avatar19.svg │ │ ├── avatar2.png │ │ ├── avatar2.svg │ │ ├── avatar20.png │ │ ├── avatar20.svg │ │ ├── avatar21.png │ │ ├── avatar21.svg │ │ ├── avatar22.png │ │ ├── avatar22.svg │ │ ├── avatar23.png │ │ ├── avatar23.svg │ │ ├── avatar3.png │ │ ├── avatar3.svg │ │ ├── avatar4.png │ │ ├── avatar4.svg │ │ ├── avatar5.png │ │ ├── avatar5.svg │ │ ├── avatar6.png │ │ ├── avatar6.svg │ │ ├── avatar7.png │ │ ├── avatar7.svg │ │ ├── avatar8.png │ │ ├── avatar8.svg │ │ ├── avatar9.png │ │ ├── avatar9.svg │ │ ├── logo.png │ │ ├── logo@2x.png │ │ └── slant.svg │ └── styles │ │ ├── felony.css │ │ ├── spinner.css │ │ └── variables │ │ ├── colors.js │ │ └── utils.js ├── components │ ├── Felony.js │ ├── alias │ │ ├── Alias.js │ │ └── AliasComposerForm.js │ ├── common │ │ ├── Avatar.js │ │ ├── Button.js │ │ ├── Icon.js │ │ ├── Overlay.js │ │ ├── User.js │ │ └── index.js │ ├── composer │ │ ├── Composer.js │ │ ├── ComposerAliasForm.js │ │ ├── ComposerAliasFormInput.js │ │ ├── ComposerAliasSuccess.js │ │ ├── ComposerForm.js │ │ └── ComposerFormSubmit.js │ ├── decrypt │ │ ├── Decrypt.js │ │ └── DecryptActions.js │ ├── floating-button │ │ ├── FloatingButton.js │ │ ├── FloatingButtonItem.js │ │ └── FloatingButtonItemLabel.js │ ├── header │ │ ├── Header.js │ │ ├── HeaderKeyCopy.js │ │ ├── HeaderKeyStatus.js │ │ ├── HeaderKeyStatusSpinner.js │ │ └── HeaderKeyStatusTooltip.js │ ├── keychain │ │ ├── Keychain.js │ │ ├── KeychainComposerOpener.js │ │ ├── KeychainList.js │ │ └── KeychainListItem.js │ └── output │ │ └── Output.js ├── config │ └── database.js ├── constants │ ├── KeychainConstants.js │ └── UIConstants.js ├── containers │ ├── App.js │ ├── ComposerContainer.js │ ├── DevTools.js │ ├── FloatingButtonContainer.js │ ├── HeaderContainer.js │ ├── KeychainContainer.js │ └── OutputContainer.js ├── index.js ├── package.json ├── reducers │ ├── index.js │ ├── keychainReducer.js │ └── uiReducer.js ├── routes.js └── utils │ ├── .gitkeep │ ├── icons.js │ └── pgp.js ├── main.development.js ├── package.js ├── package.json ├── server.js ├── webpack.config.base.js ├── webpack.config.development.js ├── webpack.config.electron.js ├── webpack.config.node.js └── webpack.config.production.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ "es2015", "stage-0", "react" ] 3 | } 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.{json,js,jsx,html,css}] 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [.eslintrc] 15 | indent_style = space 16 | indent_size = 2 17 | 18 | [*.md] 19 | trim_trailing_whitespace = false 20 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | main.js 2 | build/** 3 | docs/build/** 4 | lib/** 5 | node_modules/** 6 | modules/** 7 | config.js 8 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | var IGNORE = 0 2 | var WARN = 1 3 | var ERROR = 2 4 | 5 | var ALWAYS = 'always' 6 | var NEVER = 'never' 7 | var OFF = 'off' 8 | 9 | module.exports = { 10 | extends: 'airbnb', 11 | parser: 'babel-eslint', 12 | env: { 13 | browser: true, 14 | node: true 15 | }, 16 | rules: { 17 | 'react/jsx-curly-spacing': [ERROR, ALWAYS, { spacing: { objectLiterals: NEVER }}], 18 | 'react/jsx-filename-extension': [IGNORE], 19 | 'react/prop-types': [IGNORE], 20 | 'template-curly-spacing': [ERROR, ALWAYS], 21 | 'strict': [IGNORE], 22 | 'no-unused-expressions': IGNORE, 23 | 'no-unused-vars': [ERROR, { 'vars': 'local' }], 24 | 'arrow-body-style': [IGNORE, ALWAYS], 25 | 'camelcase': [ERROR], 26 | 'constructor-super': ERROR, 27 | 'quote-props': [ERROR, 'consistent'], 28 | 'no-underscore-dangle': [WARN], 29 | 'semi': [ERROR, NEVER], 30 | 'import/no-unresolved': [ERROR, { ignore: ['electron'] }], 31 | 'new-cap': [IGNORE], 32 | 'import/no-named-as-default': [IGNORE], 33 | 'import/no-extraneous-dependencies': [IGNORE], 34 | 'jsx-a11y/no-static-element-interactions': IGNORE 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE: -------------------------------------------------------------------------------- 1 | 2 | 3 | #### What's this issue about? 4 | 5 | 6 | 11 | 12 | 13 | 19 | 20 | #### Expected behavior 21 | 22 | 23 | #### Actual behavior 24 | 25 | 26 | #### Steps to reproduce 27 | 28 | 29 | #### Environment 30 | 31 | 32 | 33 | 34 | #### About the Feature 35 | 36 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE: -------------------------------------------------------------------------------- 1 | 2 | 3 | #### What's in this pull request? 4 | 5 | 6 | #### Bugs Squashed 7 | 8 | Resolves issue #x. 9 | 10 | 11 | #### Changes proposed 12 | 13 | - 14 | - 15 | - 16 | 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # OSX 30 | .DS_Store 31 | 32 | # App packaged 33 | dist 34 | release 35 | main.js 36 | main.js.map 37 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "airbnb", 3 | "excludeFiles": ["build/**", "node_modules/**", "config.js"], 4 | "disallowQuotedKeysInObjects": null, 5 | "validateQuoteMarks": null, 6 | "requireSemicolons": false, 7 | "disallowSemicolons": true, 8 | } 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | language: node_js 3 | notifications: 4 | email: false 5 | node_js: 6 | - "6.3.1" 7 | 8 | addons: 9 | apt: 10 | packages: 11 | - xvfb 12 | - g++-4.8 13 | - libgnome-keyring-dev 14 | sources: 15 | - ubuntu-toolchain-r-test 16 | 17 | 18 | env: 19 | - CXX=g++-4.8 20 | 21 | cache: 22 | directories: 23 | - node_modules 24 | 25 | before_install: 26 | - npm install -g npm@latest 27 | 28 | install: 29 | - export CXX="g++-4.8" 30 | - export DISPLAY=':99.0' 31 | - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & 32 | - npm install 33 | 34 | script: 35 | - npm run dev 36 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Opening an Issue 2 | 3 | Please feel free to open an issue for any reason, including but not limited to bugs, feature requests, and help. 4 | If the issue is a duplicate, it will be flagged as such and subsequently closed by the Felony team. 5 | If not, expect some serious discussion! 6 | If you're reporting a bug, please include as much information as possible about your environment and the steps leading up to it. A good bug report is usually one that has enough information for the developers to replicate the bug. 7 | 8 | # Submitting a Pull Request 9 | 10 | Internally, we try to minimize the use of our core branch. 11 | If you're contributing and fixing an issue, please be sure that your push references the associated issue number. 12 | 13 | # Check Log File 14 | 15 | If your log file contains any information please attach it. 16 | 17 | - Linux: ~/.config/Felony/log.log 18 | - OS X: ~/Library/Logs/Felony/log.log 19 | - Windows: %AppData%/Felony/log.log 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Henry Boldizsar, Case Sandberg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Felony Logo](https://i.imgur.com/gqG7XoQ.png) 2 | ![Felony Screenshot](https://i.imgur.com/0e1ZOLp.png) 3 | 4 | **Felony is an open-source pgp keychain built on the modern web with Electron, React, and Redux.** Felony is the first PGP app that's easy for anyone to use, without a tutorial. 5 | 6 | [![Github All Releases](https://img.shields.io/github/downloads/henryboldi/felony/total.svg?maxAge=2592000)]() 7 | 8 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fhenryboldi%2Ffelony.svg?size=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fhenryboldi%2Ffelony?ref=badge_large) 9 | 10 | ## Download Felony 11 | You can download compiled versions of Felony for Windows, macOS, and Linux from https://github.com/henryboldi/felony/releases. The app is currently in its pre-release stage, so it hasn't been fully tested on all platforms. Confirmed to be working on Mac, as that's what the developers own. 12 | 13 | ## How it works 14 | ### 1. Add public keys to your buddies list 15 | A public key is like a username - Adding someone’s public key to your buddies list lets you send them messages. You can find other public keys on markets like Keybase.io and Darknet. 16 | ### 2. Encrypt a message 17 | Select a recipient from your buddies list and compose a message. Only your chosen recipient(s) can read the message. Encrypted messages can be used to send sensitive information, such as an address, document, or anything intended to be read only by intended recipients. 18 | ### 3. Send the encrypted message anywhere 19 | You can send the encrypted message on any website! Send encrypted messages over Facebook Messenger, Twitter DMs, YouTube, Instagram, or anywhere else. **Felony is security when and where you want it.** 20 | 21 | ## Running Locally 22 | To run the development environment run 23 | ``` 24 | npm run dev 25 | ``` 26 | To package felony run 27 | ``` 28 | npm run package 29 | ``` 30 | To build for all platforms 31 | ``` 32 | npm run package-all 33 | ``` 34 | For more information check out [electron-react-boilerplate](https://github.com/chentsulin/electron-react-boilerplate), which we used as a starting point. 35 | 36 | ## Feature Requests 37 | Have an idea for a feature you'd love to see in Felony? Create an issue and tag it as a feature request. 38 | 39 | ## Maintainers 40 | 41 | Maintained with ❤️ by [Sanil](https://github.com/TechyPeople), [Frank](https://github.com/frankcash). 42 | 43 | Created by [Henry](https://github.com/henryboldi) & [Case](https://github.com/casesandberg). 44 | 45 | > 100% inline styles via [ReactCSS](http://reactcss.com/) 46 | -------------------------------------------------------------------------------- /app/actions/AliasesActions.js: -------------------------------------------------------------------------------- 1 | import * as types from '../constants/AliasesConstants' 2 | import db from '../config/database.js' 3 | import { generateKey } from '../../utils/pgp' 4 | let log = require('electron-log'); 5 | 6 | export function addAlias(alias) { 7 | return async function (dispatch) { 8 | try { 9 | const generatedKey = await generateKey() 10 | const insertedAlias = await db('aliases').insert(alias) 11 | return dispatch({ type: types.ADD_KEY, alias: insertedAlias }) 12 | } catch (err) { 13 | console.log(err) 14 | log.warn(err); 15 | } 16 | } 17 | } 18 | 19 | export function setAliases(aliases) { 20 | return { type: types.SET_KEYCHAIN, aliases } 21 | } 22 | 23 | export function fetchAliases() { 24 | return async function (dispatch) { 25 | try { 26 | const aliases = await db('aliases').value() 27 | return dispatch(setAliases(aliases)) 28 | } catch (err) { 29 | log.warn(err); 30 | 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/actions/KeychainActions.js: -------------------------------------------------------------------------------- 1 | import * as types from '../constants/KeychainConstants' 2 | import db from '../config/database.js' 3 | let log = require('electron-log'); 4 | 5 | 6 | export function addKey(key) { 7 | return async function (dispatch) { 8 | try { 9 | const insertedKey = await db('keychain').insert(key) 10 | return dispatch({ type: types.ADD_KEY, key: insertedKey }) 11 | } catch (err) { 12 | console.log(err) 13 | log.warn(err); 14 | } 15 | } 16 | } 17 | 18 | export function setKeychain(keychain) { 19 | return { type: types.SET_KEYCHAIN, keychain } 20 | } 21 | 22 | export function fetchKeychain() { 23 | return async function (dispatch) { 24 | try { 25 | const keychain = await db('keychain').value() 26 | return dispatch(setKeychain(keychain)) 27 | } catch (err) { 28 | log.warn(err); 29 | 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/actions/UIActions.js: -------------------------------------------------------------------------------- 1 | import * as types from '../constants/UIConstants' 2 | 3 | export function selectKey(id) { 4 | return { type: types.SELECT_KEY, id } 5 | } 6 | 7 | export function toggleComposer() { 8 | return { type: types.TOGGLE_COMPOSER } 9 | } 10 | 11 | export function toggleGeneratingKey() { 12 | return { type: types.TOGGLE_GENERATING_KEY } 13 | } 14 | 15 | export function toggleIsCopied() { 16 | return { type: types.TOGGLE_IS_COPIED } 17 | } 18 | 19 | export function clearSelectedKeys() { 20 | return { type: types.CLEAR_SELECTED_KEYS } 21 | } 22 | 23 | export function showComposerWithType(type) { 24 | return { type: types.SHOW_COMPOSER_WITH_TYPE, data: type } 25 | } 26 | 27 | export function setOutput(output) { 28 | return { type: types.SET_OUTPUT, output } 29 | } 30 | -------------------------------------------------------------------------------- /app/actions/index.js: -------------------------------------------------------------------------------- 1 | export * from './KeychainActions' 2 | export * from './UIActions' 3 | -------------------------------------------------------------------------------- /app/app.global.css: -------------------------------------------------------------------------------- 1 | body { 2 | position: relative; 3 | color: white; 4 | height: 100vh; 5 | background-color: #232C39; 6 | background-image: linear-gradient(45deg, rgba(0, 216, 255, .5) 10%, rgba(0, 1, 127, .7)); 7 | font-family: Arial, Helvetica, Helvetica Neue; 8 | overflow-y: hidden; 9 | } 10 | 11 | h2 { 12 | margin: 0; 13 | font-size: 2.25rem; 14 | font-weight: bold; 15 | letter-spacing: -.025em; 16 | color: #fff; 17 | } 18 | 19 | p { 20 | font-size: 24px; 21 | } 22 | 23 | li { 24 | list-style: none; 25 | } 26 | 27 | a { 28 | color: white; 29 | opacity: .75; 30 | text-decoration: none; 31 | } 32 | 33 | a:hover { 34 | opacity: 1; 35 | text-decoration: none; 36 | cursor: pointer; 37 | } 38 | -------------------------------------------------------------------------------- /app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Felony 6 | 16 | 17 | 18 |
19 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/app.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/app.icns -------------------------------------------------------------------------------- /app/assets/fonts/work-sans/WorkSans-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/fonts/work-sans/WorkSans-Bold.woff2 -------------------------------------------------------------------------------- /app/assets/fonts/work-sans/WorkSans-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/fonts/work-sans/WorkSans-Light.woff2 -------------------------------------------------------------------------------- /app/assets/fonts/work-sans/WorkSans-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/fonts/work-sans/WorkSans-Medium.woff2 -------------------------------------------------------------------------------- /app/assets/fonts/work-sans/WorkSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/fonts/work-sans/WorkSans-Regular.woff2 -------------------------------------------------------------------------------- /app/assets/fonts/work-sans/WorkSans.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'work-sans'; 3 | font-weight: 300; 4 | src: url('./WorkSans-Light.woff2'); 5 | } 6 | 7 | @font-face { 8 | font-family: 'work-sans'; 9 | src: url('./WorkSans-Regular.woff2'); 10 | } 11 | 12 | @font-face { 13 | font-family: 'work-sans'; 14 | font-weight: 500; 15 | src: url('./WorkSans-Medium.woff2'); 16 | } 17 | 18 | @font-face { 19 | font-family: 'work-sans'; 20 | font-weight: 700; 21 | src: url('./WorkSans-Bold.woff2'); 22 | } 23 | -------------------------------------------------------------------------------- /app/assets/images/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar.png -------------------------------------------------------------------------------- /app/assets/images/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar1.png -------------------------------------------------------------------------------- /app/assets/images/avatar1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar1 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/assets/images/avatar10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar10.png -------------------------------------------------------------------------------- /app/assets/images/avatar10.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar10 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/assets/images/avatar11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar11.png -------------------------------------------------------------------------------- /app/assets/images/avatar11.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar11 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/assets/images/avatar12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar12.png -------------------------------------------------------------------------------- /app/assets/images/avatar12.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar12 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/assets/images/avatar13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar13.png -------------------------------------------------------------------------------- /app/assets/images/avatar13.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar13 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/assets/images/avatar14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar14.png -------------------------------------------------------------------------------- /app/assets/images/avatar14.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar14 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/assets/images/avatar15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar15.png -------------------------------------------------------------------------------- /app/assets/images/avatar15.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar15 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/assets/images/avatar16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar16.png -------------------------------------------------------------------------------- /app/assets/images/avatar16.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar16 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/assets/images/avatar17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar17.png -------------------------------------------------------------------------------- /app/assets/images/avatar17.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar17 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/assets/images/avatar18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar18.png -------------------------------------------------------------------------------- /app/assets/images/avatar18.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar18 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/assets/images/avatar19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar19.png -------------------------------------------------------------------------------- /app/assets/images/avatar19.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar19 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/assets/images/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar2.png -------------------------------------------------------------------------------- /app/assets/images/avatar2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar2 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/assets/images/avatar20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar20.png -------------------------------------------------------------------------------- /app/assets/images/avatar20.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar20 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/assets/images/avatar21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar21.png -------------------------------------------------------------------------------- /app/assets/images/avatar21.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar21 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/assets/images/avatar22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar22.png -------------------------------------------------------------------------------- /app/assets/images/avatar22.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar22 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/assets/images/avatar23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar23.png -------------------------------------------------------------------------------- /app/assets/images/avatar23.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar23 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/assets/images/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar3.png -------------------------------------------------------------------------------- /app/assets/images/avatar3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar3 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/assets/images/avatar4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar4.png -------------------------------------------------------------------------------- /app/assets/images/avatar4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar4 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/assets/images/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar5.png -------------------------------------------------------------------------------- /app/assets/images/avatar5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar5 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/assets/images/avatar6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar6.png -------------------------------------------------------------------------------- /app/assets/images/avatar6.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar6 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/assets/images/avatar7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar7.png -------------------------------------------------------------------------------- /app/assets/images/avatar7.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar7 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/assets/images/avatar8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar8.png -------------------------------------------------------------------------------- /app/assets/images/avatar8.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar8 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/assets/images/avatar9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/avatar9.png -------------------------------------------------------------------------------- /app/assets/images/avatar9.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | avatar9 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/logo.png -------------------------------------------------------------------------------- /app/assets/images/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henryboldi/felony/8e948160125e3fb69ff1992f03ae0e246577aca7/app/assets/images/logo@2x.png -------------------------------------------------------------------------------- /app/assets/images/slant.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | slant 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/assets/styles/felony.css: -------------------------------------------------------------------------------- 1 | body, html { 2 | -webkit-overflow-scrolling: touch; 3 | overflow: hidden; 4 | font-family: 'work-sans'; 5 | } 6 | -------------------------------------------------------------------------------- /app/assets/styles/spinner.css: -------------------------------------------------------------------------------- 1 | .spinner { 2 | width: 20px; 3 | height: 20px; 4 | 5 | position: relative; 6 | align-self: center; 7 | margin-top: 2px; 8 | } 9 | 10 | .double-bounce1, .double-bounce2 { 11 | width: 100%; 12 | height: 100%; 13 | border-radius: 50%; 14 | background-color: #fff; 15 | opacity: 0.6; 16 | position: absolute; 17 | top: 0; 18 | left: 0; 19 | 20 | -webkit-animation: sk-bounce 2.0s infinite ease-in-out; 21 | animation: sk-bounce 2.0s infinite ease-in-out; 22 | } 23 | 24 | .double-bounce2 { 25 | -webkit-animation-delay: -1.0s; 26 | animation-delay: -1.0s; 27 | } 28 | 29 | @-webkit-keyframes sk-bounce { 30 | 0%, 100% { -webkit-transform: scale(0.0) } 31 | 50% { -webkit-transform: scale(1.0) } 32 | } 33 | 34 | @keyframes sk-bounce { 35 | 0%, 100% { 36 | transform: scale(0.0); 37 | -webkit-transform: scale(0.0); 38 | } 50% { 39 | transform: scale(1.0); 40 | -webkit-transform: scale(1.0); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/assets/styles/variables/colors.js: -------------------------------------------------------------------------------- 1 | const colors = { 2 | bgDark: '#2B272C', 3 | bgLight: '#37373C', 4 | bgGrey: '#EAE4E4', 5 | offBgLight: '#DEE3ED', 6 | primary: '#E4212A', 7 | primaryGradient: 'linear-gradient(to left bottom, #E4212A 0%, #B61E4F 100%)', 8 | green: '#00E676', 9 | } 10 | 11 | export default colors 12 | -------------------------------------------------------------------------------- /app/assets/styles/variables/utils.js: -------------------------------------------------------------------------------- 1 | export const spacing = { 2 | s: 8, 3 | m: 12, 4 | l: 16, 5 | statusBarHeight: 20, 6 | } 7 | 8 | export const sizing = { 9 | avatar: 34, 10 | } 11 | -------------------------------------------------------------------------------- /app/components/Felony.js: -------------------------------------------------------------------------------- 1 | import 'normalize.css' 2 | import React, { Component } from 'react' 3 | import ReactCSS from 'reactcss' 4 | 5 | import '../assets/fonts/work-sans/WorkSans.css' 6 | import '../assets/styles/felony.css' 7 | import '../assets/styles/spinner.css' 8 | import colors from '../assets/styles/variables/colors' 9 | 10 | import HeaderContainer from '../containers/HeaderContainer' 11 | import FloatingButtonContainer from '../containers/FloatingButtonContainer' 12 | import ComposerContainer from '../containers/ComposerContainer' 13 | import OutputContainer from '../containers/OutputContainer' 14 | import KeychainContainer from '../containers/KeychainContainer' 15 | 16 | export class Felony extends Component { 17 | state = { 18 | selected: [], // replaced with redux 19 | } 20 | 21 | classes() { // eslint-disable-line 22 | return { 23 | 'default': { 24 | app: { 25 | 26 | // NOTE: Set here and not in felony.css in order to use color variable 27 | background: colors.bgLight, 28 | position: 'absolute', 29 | width: '100%', 30 | height: '100%', 31 | color: 'white', 32 | }, 33 | header: { 34 | position: 'fixed', 35 | top: '0px', 36 | left: '0px', 37 | right: '0px', 38 | }, 39 | }, 40 | } 41 | } 42 | 43 | // this will be replaced with Redux 44 | handleAddToSelected = (selected) => { 45 | this.setState({ 46 | selected: this.state.selected.concat([selected]), 47 | }) 48 | } 49 | 50 | render() { 51 | return ( 52 |
53 |
54 | 55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 |
63 | ) 64 | } 65 | } 66 | 67 | export default ReactCSS(Felony) 68 | -------------------------------------------------------------------------------- /app/components/alias/Alias.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import ReactCSS from 'reactcss' 3 | 4 | import { User } from '../common/index' 5 | 6 | class Alias extends Component { 7 | classes() { // eslint-disable-line 8 | return { 9 | 'default': { 10 | user: { 11 | color: '#fff', 12 | flex: '1', 13 | fontWeight: '500', 14 | }, 15 | }, 16 | } 17 | } 18 | 19 | render() { 20 | return ( 21 |
22 | 27 |
28 | ) 29 | } 30 | } 31 | 32 | export default ReactCSS(Alias) 33 | -------------------------------------------------------------------------------- /app/components/alias/AliasComposerForm.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import ReactCSS from 'reactcss' 3 | 4 | import colors from '../../assets/styles/variables/colors' 5 | 6 | class AliasComposer extends Component { 7 | classes() { // eslint-disable-line 8 | return { 9 | 'default': { 10 | text: { 11 | flex: '1', 12 | position: 'relative', 13 | }, 14 | textarea: { 15 | Absolute: '23px 10px 10px 10px', 16 | border: 'none', 17 | outline: 'none', 18 | width: '94%', 19 | boxSizing: 'border-box', 20 | padding: '10px 3%', 21 | color: '#333', 22 | borderRadius: '2px', 23 | fontSize: '14px', 24 | fontFamily: 'Andale Mono', 25 | }, 26 | actions: { 27 | marginTop: '-10px', 28 | height: '40px', 29 | display: 'flex', 30 | alignItems: 'center', 31 | justifyContent: 'space-between', 32 | padding: '0 10px', 33 | }, 34 | link: { 35 | textDecoration: 'none', 36 | cursor: 'pointer', 37 | }, 38 | cancel: { 39 | color: '#999', 40 | }, 41 | confirm: { 42 | color: colors.primary, 43 | }, 44 | }, 45 | } 46 | } 47 | 48 | handleCancel = () => { 49 | this.props.toggleAliasComposer() 50 | } 51 | 52 | handleKeyDown = (e) => { 53 | (e.keyCode === 27 && this.props.isShowingAliasComposer) && this.handleCancel() 54 | } 55 | 56 | render() { 57 | return ( 58 |
59 |
60 |