Browse Source

Merge pull request #897 from mrfelton/refactor/general-cleaup

Refactor: general cleanup
renovate/lint-staged-8.x
JimmyMow 6 years ago
committed by GitHub
parent
commit
1336bad1f4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      .storybook/config.js
  2. 29
      .storybook/preview-head.html
  3. 1
      .svgrrc
  4. 95
      app/components/Activity/Countdown/Countdown.js
  5. 16
      app/components/Activity/Countdown/Countdown.scss
  6. 3
      app/components/Activity/Countdown/index.js
  7. 6
      app/components/Activity/Countdown/messages.js
  8. 2
      app/components/Activity/Invoice/Invoice.js
  9. 8
      app/components/Activity/InvoiceModal/InvoiceModal.js
  10. 2
      app/components/Activity/Payment/Payment.js
  11. 3
      app/components/Activity/PaymentModal/PaymentModal.js
  12. 2
      app/components/Activity/Transaction/Transaction.js
  13. 3
      app/components/Activity/TransactionModal/TransactionModal.js
  14. 0
      app/components/AmountInput/AmountInput.scss
  15. 3
      app/components/AmountInput/index.js
  16. 3
      app/components/Contacts/Network/Network.js
  17. 3
      app/components/Contacts/SubmitChannelForm/SubmitChannelForm.js
  18. 23
      app/components/CryptoIcon/CryptoIcon.js
  19. 3
      app/components/CryptoIcon/index.js
  20. 20
      app/components/CurrencyIcon/CurrencyIcon.js
  21. 3
      app/components/CurrencyIcon/index.js
  22. 2
      app/components/Icon/BigArrowLeft.js
  23. 2
      app/components/Icon/BigArrowRight.js
  24. 2
      app/components/Icon/Bitcoin.js
  25. 2
      app/components/Icon/Btcpay.js
  26. 6
      app/components/Icon/ChainLink.js
  27. 4
      app/components/Icon/Channels.js
  28. 6
      app/components/Icon/Check.js
  29. 16
      app/components/Icon/CheckAnimated.js
  30. 6
      app/components/Icon/CheckCircle.js
  31. 6
      app/components/Icon/Clock.js
  32. 2
      app/components/Icon/Close.js
  33. 6
      app/components/Icon/CloudLightning.js
  34. 4
      app/components/Icon/Cloudbolt.js
  35. 2
      app/components/Icon/Contacts.js
  36. 6
      app/components/Icon/Copy.js
  37. 2
      app/components/Icon/Error.js
  38. 6
      app/components/Icon/Eye.js
  39. 6
      app/components/Icon/Globe.js
  40. 2
      app/components/Icon/Hand.js
  41. 6
      app/components/Icon/Help.js
  42. 2
      app/components/Icon/Help2.js
  43. 4
      app/components/Icon/IconPlus.js
  44. 6
      app/components/Icon/Lightning.js
  45. 2
      app/components/Icon/Litecoin.js
  46. 2
      app/components/Icon/LndLogo.js
  47. 2
      app/components/Icon/LtcLogo.js
  48. 2
      app/components/Icon/Network.js
  49. 6
      app/components/Icon/Onchain.js
  50. 2
      app/components/Icon/PaperPlane.js
  51. 3
      app/components/Icon/Peers.js
  52. 6
      app/components/Icon/Plus.js
  53. 6
      app/components/Icon/PlusCircle.js
  54. 4
      app/components/Icon/Qrcode.js
  55. 6
      app/components/Icon/Search.js
  56. 3
      app/components/Icon/Settings.js
  57. 2
      app/components/Icon/SkinnyBitcoin.js
  58. 12
      app/components/Icon/Spinner.js
  59. 12
      app/components/Icon/Success.js
  60. 6
      app/components/Icon/User.js
  61. 2
      app/components/Icon/Wallet.js
  62. 2
      app/components/Icon/Wallet2.js
  63. 12
      app/components/Icon/X.js
  64. 6
      app/components/Icon/Zap.js
  65. 2
      app/components/Icon/ZapLogo.js
  66. 2
      app/components/Icon/ZapLogoBlack.js
  67. 10
      app/components/Pay/Pay.js
  68. 10
      app/components/Pay/PaySummaryLightning.js
  69. 8
      app/components/Pay/PaySummaryOnChain.js
  70. 24
      app/components/Pay/PaySummaryRow.js
  71. 1
      app/components/Pay/index.js
  72. 14
      app/components/Request/RequestSummary.js
  73. 0
      app/components/UI/AmountInput.js
  74. 7
      app/components/UI/Button.js
  75. 85
      app/components/UI/Countdown.js
  76. 22
      app/components/UI/DataRow.js
  77. 6
      app/components/UI/GlobalStyle.js
  78. 10
      app/components/UI/Input.js
  79. 6
      app/components/UI/LightningInvoiceInput.js
  80. 16
      app/components/UI/Message.js
  81. 2
      app/components/UI/Modal.js
  82. 1
      app/components/UI/Page.js
  83. 10
      app/components/UI/TextArea.js
  84. 0
      app/components/UI/Value.js
  85. 6
      app/components/UI/index.js
  86. 2
      app/components/UI/messages.js
  87. 0
      app/components/Value/Value.scss
  88. 3
      app/components/Value/index.js
  89. 3
      app/components/Wallet/Wallet.js
  90. 2
      app/icons/channels.svg
  91. 2
      app/icons/icon-plus.svg
  92. 2
      app/icons/peers.svg
  93. 2
      app/icons/qrcode.svg
  94. 2
      app/icons/settings.svg
  95. 185
      stories/_welcome.stories.js
  96. 83
      stories/color.stories.js
  97. 30
      stories/components/countdown.stories.js
  98. 20
      stories/helpers.js
  99. 6
      stories/pages/pay.stories.js
  100. 39
      test/unit/components/CryptoIcon.spec.js

12
.storybook/config.js

@ -1,6 +1,7 @@
import React from 'react'
import { addDecorator, configure, setAddon } from '@storybook/react'
import { withThemes } from 'storybook-styled-components'
import { withTheme } from 'styled-components'
import { themes } from '@storybook/components'
import { withOptions } from '@storybook/addon-options'
import { withInfo } from '@storybook/addon-info'
@ -14,6 +15,12 @@ import { dark, light } from 'themes'
import { getDefaultLocale, locales } from 'lib/i18n'
import { BackgroundDark, GlobalStyle } from 'components/UI'
const BackgroundDarkWithTheme = withTheme(({ theme, ...rest }) => (
<div className={theme.name}>
<BackgroundDark p={3} css={{ height: '100vh', 'overflow-y': 'scroll !important' }} {...rest} />
</div>
))
// Register supported locales.
import '../app/lib/i18n/locale'
@ -66,9 +73,7 @@ addDecorator(
addDecorator(story => (
<React.Fragment>
<GlobalStyle />
<BackgroundDark p={3} css={{ height: '100vh', 'overflow-y': 'scroll !important' }}>
{story()}
</BackgroundDark>
<BackgroundDarkWithTheme>{story()}</BackgroundDarkWithTheme>
</React.Fragment>
))
@ -77,6 +82,7 @@ addDecorator(withThemes({ Dark: dark, Light: light }))
// Chapters
setAddon(chaptersAddon)
setDefaults({
sectionOptions: {
showSource: false,

29
.storybook/preview-head.html

@ -1,10 +1,25 @@
<style>
.story-title,
.story-subtitle,
.chapter-header,
.section-header,
.section-subsection,
.section-button-container {
filter: invert(100%);
.dark .story-title,
.dark .story-subtitle,
.dark .chapter-header,
.dark .section-header,
.dark .section-subsection,
.dark .section-button-container {
color: white !important;
display: block;
}
.light .story-title,
.light .story-subtitle,
.light .chapter-header,
.light .section-header,
.light .section-subsection,
.light .section-button-container {
color: black !important;
display: block;
}
.story-header p {
margin-bottom: 1em;
}
</style>

1
.svgrrc

@ -2,6 +2,7 @@
"icon": true,
"replaceAttrValues": {
"#FFF": "currentColor",
"#FFFFFF": "currentColor",
"#F5A623": "currentColor",
"#010002": "currentColor",
"#E63939": "currentColor",

95
app/components/Activity/Countdown/Countdown.js

@ -1,95 +0,0 @@
import React from 'react'
import PropTypes from 'prop-types'
import { FormattedMessage } from 'react-intl'
import messages from './messages'
import styles from './Countdown.scss'
class Countdown extends React.Component {
constructor(props) {
super(props)
this.state = {
days: null,
hours: null,
minutes: null,
seconds: null,
expired: false,
interval: null
}
this.timerInterval = this.timerInterval.bind(this)
}
componentDidMount() {
const interval = setInterval(this.timerInterval, 1000)
// store interval in the state so it can be accessed later
this.setState({ interval })
}
componentWillUnmount() {
const { interval } = this.state
// use interval from the state to clear the interval
clearInterval(interval)
}
timerInterval() {
const convertTwoDigits = n => (n > 9 ? n : `0${n}`.slice(-2))
const now = new Date().getTime()
const { countDownDate } = this.props
const countDownSeconds = countDownDate * 1000
const distance = countDownSeconds - now
if (distance <= 0) {
this.setState({ expired: true })
const { interval } = this.state
clearInterval(interval)
return
}
const days = convertTwoDigits(Math.floor(distance / (1000 * 60 * 60 * 24)))
const hours = convertTwoDigits(
Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
)
const minutes = convertTwoDigits(Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)))
const seconds = convertTwoDigits(Math.floor((distance % (1000 * 60)) / 1000))
this.setState({
days,
hours,
minutes,
seconds
})
}
render() {
const { days, hours, minutes, seconds, expired } = this.state
if (expired) {
return <span className={`${styles.container} ${styles.expired}`}>Expired</span>
}
if (!days && !hours && !minutes && !seconds) {
return <span className={styles.container} />
}
return (
<span className={styles.container}>
<i className={styles.caption}>
<FormattedMessage {...messages.expires} />
</i>
<i>{days > 0 && `${days}:`}</i>
<i>{hours > 0 && `${hours}:`}</i>
<i>{minutes > 0 && `${minutes}:`}</i>
<i>{seconds >= 0 && `${seconds}`}</i>
</span>
)
}
}
Countdown.propTypes = {
countDownDate: PropTypes.number.isRequired
}
export default Countdown

16
app/components/Activity/Countdown/Countdown.scss

@ -1,16 +0,0 @@
@import 'styles/variables.scss';
.container {
display: block;
text-align: center;
font-size: 12px;
min-height: 12px;
&.expired {
color: $red;
}
}
.caption {
margin-right: 4px;
}

3
app/components/Activity/Countdown/index.js

@ -1,3 +0,0 @@
import Countdown from './Countdown'
export default Countdown

6
app/components/Activity/Countdown/messages.js

@ -1,6 +0,0 @@
import { defineMessages } from 'react-intl'
/* eslint-disable max-len */
export default defineMessages({
expires: 'Expires in'
})

2
app/components/Activity/Invoice/Invoice.js

@ -1,7 +1,7 @@
import React from 'react'
import PropTypes from 'prop-types'
import { btc } from 'lib/utils'
import Value from 'components/Value'
import { Value } from 'components/UI'
import CheckCircle from 'components/Icon/CheckCircle'
import { FormattedNumber, FormattedTime, FormattedMessage, injectIntl } from 'react-intl'

8
app/components/Activity/InvoiceModal/InvoiceModal.js

@ -3,10 +3,8 @@ import PropTypes from 'prop-types'
import QRCode from 'qrcode.react'
import copy from 'copy-to-clipboard'
import { showNotification } from 'lib/utils/notifications'
import Value from 'components/Value'
import { Dropdown } from 'components/UI'
import { Countdown, Dropdown, Value } from 'components/UI'
import { FormattedDate, FormattedTime, FormattedMessage } from 'react-intl'
import Countdown from '../Countdown'
import messages from './messages'
import styles from './InvoiceModal.scss'
@ -22,7 +20,7 @@ const InvoiceModal = ({
showNotification('Noice', <FormattedMessage {...messages.copied} />)
}
const countDownDate = parseInt(invoice.creation_date, 10) + parseInt(invoice.expiry, 10)
const countDownDate = (parseInt(invoice.creation_date, 10) + parseInt(invoice.expiry, 10)) * 1000
return (
<div className={styles.container}>
@ -40,7 +38,7 @@ const InvoiceModal = ({
level="L"
className={styles.qrcode}
/>
<Countdown countDownDate={countDownDate} />
<Countdown date={countDownDate} countUpAfterExpire={false} />
</section>
<section className={styles.right}>
<div className={styles.details}>

2
app/components/Activity/Payment/Payment.js

@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
import Zap from 'components/Icon/Zap'
import { btc } from 'lib/utils'
import Value from 'components/Value'
import { Value } from 'components/UI'
import { FormattedNumber, FormattedTime, injectIntl } from 'react-intl'
import messages from './messages'

3
app/components/Activity/PaymentModal/PaymentModal.js

@ -2,8 +2,7 @@ import React from 'react'
import PropTypes from 'prop-types'
import PaperPlane from 'components/Icon/PaperPlane'
import Zap from 'components/Icon/Zap'
import { Dropdown } from 'components/UI'
import Value from 'components/Value'
import { Dropdown, Value } from 'components/UI'
import { FormattedDate, FormattedTime, FormattedMessage } from 'react-intl'
import messages from './messages'
import styles from './PaymentModal.scss'

2
app/components/Activity/Transaction/Transaction.js

@ -3,7 +3,7 @@ import PropTypes from 'prop-types'
import ChainLink from 'components/Icon/ChainLink'
import { btc } from 'lib/utils'
import Value from 'components/Value'
import { Value } from 'components/UI'
import { FormattedNumber, FormattedTime, FormattedMessage, injectIntl } from 'react-intl'
import messages from './messages'

3
app/components/Activity/TransactionModal/TransactionModal.js

@ -3,9 +3,8 @@ import PropTypes from 'prop-types'
import PaperPlane from 'components/Icon/PaperPlane'
import Hand from 'components/Icon/Hand'
import ChainLink from 'components/Icon/ChainLink'
import { Dropdown } from 'components/UI'
import { Dropdown, Value } from 'components/UI'
import { blockExplorer } from 'lib/utils'
import Value from 'components/Value'
import { FormattedDate, FormattedTime, FormattedMessage } from 'react-intl'
import messages from './messages'
import styles from './TransactionModal.scss'

0
app/components/AmountInput/AmountInput.scss

3
app/components/AmountInput/index.js

@ -1,3 +0,0 @@
import AmountInput from './AmountInput'
export default AmountInput

3
app/components/Contacts/Network/Network.js

@ -7,8 +7,7 @@ import FaAngleDown from 'react-icons/lib/fa/angle-down'
import { btc, blockExplorer } from 'lib/utils'
import Plus from 'components/Icon/Plus'
import Search from 'components/Icon/Search'
import { BackgroundLight, Text } from 'components/UI'
import Value from 'components/Value'
import { BackgroundLight, Text, Value } from 'components/UI'
import { FormattedNumber, FormattedMessage, injectIntl } from 'react-intl'
import messages from './messages'

3
app/components/Contacts/SubmitChannelForm/SubmitChannelForm.js

@ -1,8 +1,7 @@
import React from 'react'
import PropTypes from 'prop-types'
import FaExclamationCircle from 'react-icons/lib/fa/exclamation-circle'
import AmountInput from 'components/AmountInput'
import { Button, Dropdown } from 'components/UI'
import { AmountInput, Button, Dropdown } from 'components/UI'
import { FormattedNumber, FormattedMessage } from 'react-intl'
import messages from './messages'
import styles from './SubmitChannelForm.scss'

23
app/components/CryptoIcon/CryptoIcon.js

@ -1,23 +0,0 @@
import React from 'react'
import PropTypes from 'prop-types'
import SkinnyBitcoin from 'components/Icon/SkinnyBitcoin'
import Litecoin from 'components/Icon/Litecoin'
const CryptoIcon = ({ currency, styles }) => {
switch (currency) {
case 'btc':
return <SkinnyBitcoin style={styles} />
case 'ltc':
return <Litecoin style={styles} />
default:
return <span />
}
}
CryptoIcon.propTypes = {
currency: PropTypes.string.isRequired,
styles: PropTypes.object
}
export default CryptoIcon

3
app/components/CryptoIcon/index.js

@ -1,3 +0,0 @@
import CryptoIcon from './CryptoIcon'
export default CryptoIcon

20
app/components/CurrencyIcon/CurrencyIcon.js

@ -1,20 +0,0 @@
import React from 'react'
import PropTypes from 'prop-types'
import FaDollar from 'react-icons/lib/fa/dollar'
import CryptoIcon from '../CryptoIcon'
const CurrencyIcon = ({ currency, crypto, styles }) => {
return currency === 'usd' ? (
<FaDollar style={styles} />
) : (
<CryptoIcon styles={styles} currency={crypto} />
)
}
CurrencyIcon.propTypes = {
currency: PropTypes.string.isRequired,
crypto: PropTypes.string.isRequired,
styles: PropTypes.object
}
export default CurrencyIcon

3
app/components/CurrencyIcon/index.js

@ -1,3 +0,0 @@
import CurrencyIcon from './CurrencyIcon'
export default CurrencyIcon

2
app/components/Icon/BigArrowLeft.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgBigArrowLeft = props => (
<svg viewBox="0 0 16 12" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 16 12" {...props}>
<path
d="M1 6h14m-8.474 5L1 6l5.526-5"
fill="none"

2
app/components/Icon/BigArrowRight.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgBigArrowRight = props => (
<svg viewBox="0 0 40 28" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 40 28" {...props}>
<path
d="M1 14h38M24 27l15-13L24 1"
fill="none"

2
app/components/Icon/Bitcoin.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgBitcoin = props => (
<svg viewBox="0 0 32 33" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 32 33" {...props}>
<path
d="M15.85 32.1C7.096 32.1 0 25.004 0 16.25S7.096.4 15.85.4 31.7 7.496 31.7 16.25 24.604 32.1 15.85 32.1zm-4.3-23.95c-.05.05-.05.05.15-.1-.15.55-.3 1.15-.45 1.7-.05.1 0 .15.1.15.4.1.85.2 1.3.35.45.15.7.6.6 1-.6 2.6-1.25 5.15-1.9 7.7-.05.35-.35.55-.75.45-.35-.05-.75-.15-1.1-.25-.15 0-.2 0-.25.15-.15.4-.35.85-.55 1.3-.1.2-.15.35-.25.55 1.2.3 2.35.6 3.5.9 0 .1-.05.15-.05.2-.25.8-.45 1.65-.65 2.5-.05.1-.05.15.1.2.5.1 1 .2 1.5.35.15.05.15 0 .2-.1.1-.45.25-.9.35-1.35.1-.45.25-.9.35-1.35.45.1.85.2 1.25.3.1.05.05.1.05.2-.25.8-.45 1.65-.65 2.5-.05.1-.05.15.1.2.45.1.95.25 1.4.35.25.1.25.05.3-.15.2-.8.4-1.65.6-2.45.05-.15.15-.2.3-.15 1 .15 2 .25 3.05.1.8-.1 1.5-.45 2.05-1.1.45-.55.7-1.15.9-1.85.15-.55.2-1.15.1-1.7-.2-.7-.6-1.25-1.2-1.7-.2-.15-.4-.25-.6-.4.1 0 .15-.05.2-.05.4-.15.8-.35 1.1-.65.4-.4.6-.9.75-1.45.2-.8.15-1.6-.3-2.35-.35-.5-.8-.9-1.3-1.2l-1.65-.75c-.15-.05-.2-.1-.15-.25.1-.25.15-.5.2-.75.15-.6.3-1.2.45-1.85-.05 0-.05-.05-.1-.05-.55-.15-1.05-.25-1.55-.4-.1-.05-.15 0-.15.1l-.15.6c-.2.65-.35 1.25-.5 1.9-.05.05-.1.15-.15.15-.4-.1-.85-.2-1.25-.3.05-.1.05-.15.05-.2.2-.8.4-1.65.6-2.45.05-.1.05-.15-.1-.2-.5-.1-.95-.2-1.45-.35-.15-.05-.2 0-.25.15-.2.85-.4 1.65-.6 2.5-.05.15-.1.2-.25.15-.55-.15-1.1-.25-1.65-.4-.55-.15-1.1-.25-1.65-.4zM14.1 20.5c.2-.75.35-1.45.55-2.15.1-.5.25-.95.35-1.45.05-.15.05-.2.2-.15 1 .2 2.05.4 2.95.9.4.25.8.5 1.05.9.55.8.15 2.05-.8 2.35-.55.2-1.1.2-1.7.15-.85-.05-1.7-.3-2.5-.5 0 0-.05-.05-.1-.05zm4.2-5.1c-.8 0-1.45-.15-2.2-.25-.2-.05-.35-.1-.55-.15-.1-.05-.15-.1-.1-.2.3-1.05.55-2.05.8-3.1.05-.15.1-.2.25-.15.75.2 1.45.35 2.15.65.45.2.9.5 1.15.95.5.85 0 1.95-.95 2.15-.2.05-.45.1-.55.1z"
fillRule="nonzero"

2
app/components/Icon/Btcpay.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgBtcpay = props => (
<svg viewBox="0 0 400 400" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 400 400" {...props}>
<g fillRule="evenodd">
<path
d="M132.759 62.5c-.022.055-.104.809-.182 1.676l-.141 1.577.582-1.122c.677-1.305.752-2.231.182-2.231-.22 0-.418.045-.441.1m60.631 6.548c.357.356.769.526.917.378.149-.148.005-.437-.319-.642-.945-.597-1.301-.44-.598.264M132.537 78.6c.002 1.76.072 2.43.156 1.489.085-.94.084-2.38-.002-3.2-.086-.819-.155-.049-.154 1.711M244.19 93.048c.357.356.769.526.917.378.149-.148.005-.437-.319-.642-.945-.597-1.301-.44-.598.264m4.062 1.943c.128.335.484.609.791.609.781 0 .693-.299-.234-.795-.645-.346-.748-.311-.557.186m-79.84 11.509c.015 11.431.602 11.333 1.007-.167.259-7.337.364-8.243.936-8.067.476.147.442.034-.131-.433-1.772-1.444-1.825-1.19-1.812 8.667M210 117c.274.33.701.586.949.568.281-.019.262-.108-.051-.234-.277-.111-.401-.367-.277-.568.124-.201-.076-.366-.446-.366-.553 0-.584.107-.175.6m32.8 15.757c0 .197.27.461.6.588.365.14.6 0 .6-.358a.595.595 0 0 0-.6-.587c-.33 0-.6.161-.6.357m2 1.071c0 .315.343.572.763.572.561 0 .708.208.557.786-.113.432-.322.748-.463.703-.477-.153-2.211 1.29-1.911 1.59.164.164.441.066.616-.217.384-.622 2.314-1.662 3.084-1.662.644 0 .748-1.033.141-1.408-1.149-.71-2.787-.924-2.787-.364M180.4 171.2c0 .22.27.4.6.4.33 0 .6.21.6.467 0 .256.116.351.257.209.298-.297-.585-1.476-1.106-1.476-.193 0-.351.18-.351.4m3.2 1.81c0 .446 1.199 1.457 1.567 1.322.197-.073-.074-.455-.604-.851-.53-.395-.963-.607-.963-.471m4.232 2.939c-.154.248-.089.451.144.451.233 0 .424.27.424.6 0 .33.354.6.787.6.535 0 .714-.192.559-.598-.127-.328-.38-.505-.563-.391-.184.113-.5-.091-.703-.454-.252-.45-.458-.516-.648-.208m32.703 23.494c-.647.988-.646 1.063.036 1.445.396.221 1.059.742 1.474 1.157.415.415.935.755 1.155.755.22 0 .4.18.4.4 0 .22.278.4.619.4.787 0-.518-1.967-1.319-1.987-.275-.007-.5-.268-.5-.58 0-.311-.188-.629-.418-.706-.23-.076-.448-.541-.485-1.033-.085-1.126-.131-1.119-.962.149m5.165 4.589c.385.224.7.669.7.988 0 .6.477.77.92.327.272-.272-1.423-1.755-1.983-1.735-.185.007-.022.196.363.42m7.9 5.959c0 .225.18.409.4.409.22 0 .4.27.4.6 0 .33.27.6.6.6.906 0 .721-.629-.4-1.363-.55-.361-1-.471-1-.246m10.8 7.806c0 .255 1.534 1.803 1.787 1.803.104 0 .1-.229-.007-.509-.199-.516-1.78-1.667-1.78-1.294M178.4 231c0 .33.191.6.424.6.233 0 .321-.165.197-.366-.124-.201 0-.457.277-.568.303-.122.224-.215-.198-.234-.385-.018-.7.238-.7.568m85.5 1.265c.275.111.5.457.5.768 0 .593.482.752.927.307.296-.296-.917-1.324-1.527-1.296-.22.011-.175.11.1.221m3.3 2.286c0 .07.336.514.747.988.782.901 1.653 1.144 1.653.461 0-.22-.27-.4-.6-.4-.33 0-.6-.161-.6-.357 0-.197-.27-.461-.6-.588-.33-.126-.6-.173-.6-.104m-96.74 2.229c.172.516.721.608.77.13.016-.16-.186-.362-.45-.45-.264-.088-.408.056-.32.32m101.94 2.42c0 .22.27.4.6.4.33 0 .6-.18.6-.4 0-.22-.27-.4-.6-.4-.33 0-.6.18-.6.4m14 9.813c0 .323.27.587.6.587.33 0 .6-.161.6-.357 0-.197-.27-.461-.6-.588-.365-.14-.6 0-.6.358m-61.6.816c0 .422 1.102 1.335 1.333 1.104.126-.125-.02-.477-.323-.781-.577-.576-1.01-.715-1.01-.323m3.6 2.971c0 .22.27.4.6.4.33 0 .6-.18.6-.4 0-.22-.27-.4-.6-.4-.33 0-.6.18-.6.4m8.255 6.2c.127.33.391.6.588.6.196 0 .357-.27.357-.6 0-.33-.264-.6-.587-.6-.358 0-.498.235-.358.6m4.245 9.665c-.693.279-.627.802.1.802.33 0 .6-.24.6-.534 0-.293-.045-.519-.1-.501-.055.017-.325.122-.6.233m-17.033 8.002c-.461.46-.292.933.333.933.33 0 .6-.27.6-.6 0-.625-.473-.794-.933-.333M219.6 279c-.408.491-.38.6.151.6.357 0 .649-.27.649-.6 0-.33-.068-.6-.151-.6-.083 0-.375.27-.649.6m-12.8 6c-.408.491-.38.6.151.6.357 0 .649-.27.649-.6 0-.33-.068-.6-.151-.6-.083 0-.375.27-.649.6m-38.4 12.12c0 5.341.1 6.48.57 6.48.478 0 .534-.985.35-6.1-.297-8.258-.92-8.515-.92-.38m12.8-.12c-.408.491-.38.6.151.6.357 0 .649-.27.649-.6 0-.33-.068-.6-.151-.6-.083 0-.375.27-.649.6m83.2 1.787c0 .214.3.273.666.132.483-.185.576-.11.338.275-.218.352-.173.434.134.244.73-.451.539-1.038-.338-1.038-.44 0-.8.174-.8.387m-8 4.2c0 .358.235.498.6.358.33-.127.6-.391.6-.588 0-.196-.27-.357-.6-.357-.33 0-.6.264-.6.587m-4 2.013c0 .33.161.6.357.6.197 0 .461-.27.588-.6.14-.365 0-.6-.358-.6a.595.595 0 0 0-.587.6m-8.8 4c0 .33.191.6.424.6.233 0 .32-.166.195-.37-.126-.203.088-.452.476-.553.537-.14.49-.195-.195-.231-.554-.028-.9.185-.9.554m-4 2c0 .33.18.6.4.6.22 0 .4-.27.4-.6 0-.33-.18-.6-.4-.6-.22 0-.4.27-.4.6m-8.133 3.667c-.486.486-.277.912.333.678.33-.127.6-.391.6-.588 0-.419-.551-.473-.933-.09m-5.067 2.12c0 .214.3.273.666.132.483-.185.576-.11.338.275-.218.352-.173.434.134.244.73-.451.539-1.038-.338-1.038-.44 0-.8.174-.8.387m-2 1.178c0 .406 1.023.346 1.455-.087.153-.153-.112-.278-.588-.278-.477 0-.867.164-.867.365m-6 3.068c0 .349.214.562.475.475.742-.247.865-1.108.158-1.108a.635.635 0 0 0-.633.633m-20.957 10c-.15.39-.061.573.232.475.598-.199.927-1.108.401-1.108-.215 0-.5.285-.633.633m-13.043 6.016c0 .531.109.559.6.151.33-.274.6-.566.6-.649 0-.083-.27-.151-.6-.151-.33 0-.6.292-.6.649m-4 1.984c0 .707.861.584 1.108-.158.087-.261-.126-.475-.475-.475a.635.635 0 0 0-.633.633m-12.919 5.9c-.113.294.048.534.357.534s.562-.24.562-.534c0-.293-.161-.533-.357-.533-.197 0-.45.24-.562.533"

6
app/components/Icon/ChainLink.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgChainLink = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-link"
width="1em"
height="1em"
className="chain-link_svg__feather chain-link_svg__feather-link"
{...props}
>
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" />

4
app/components/Icon/Channels.js

@ -1,8 +1,8 @@
import React from 'react'
const SvgChannels = props => (
<svg viewBox="0 0 22 26" width="1em" height="1em" {...props}>
<g fill="currentColor" fillRule="evenodd" opacity={0.7}>
<svg width="1em" height="1em" viewBox="0 0 22 26" {...props}>
<g fill="currentColor" fillRule="evenodd">
<path d="M13.148 22.728c-1.427 0-2.588-1.151-2.588-2.564 0-1.439 1.102-2.564 2.508-2.564.642 0 1.061.245 1.418.517a.422.422 0 1 1-.505.676c-.342-.253-.58-.346-.913-.346-.932 0-1.662.753-1.662 1.717 0 .948.781 1.717 1.742 1.717.373 0 .753-.126 1.045-.346a.426.426 0 0 1 .592.085.421.421 0 0 1-.085.591c-.441.331-.992.517-1.552.517M18.628 22.728c-.549 0-1.076-.178-1.525-.517a.422.422 0 0 1-.086-.591.42.42 0 0 1 .593-.085c.3.228.653.346 1.018.346a1.718 1.718 0 0 0 0-3.434c-.425 0-.978.151-1.232.346a.422.422 0 1 1-.507-.676c.471-.356 1.232-.517 1.74-.517a2.567 2.567 0 0 1 2.562 2.564 2.567 2.567 0 0 1-2.563 2.564" />
<path d="M17.854 21.085h-4.23a.42.42 0 0 1-.424-.422.42.42 0 0 1 .423-.423h4.23a.42.42 0 0 1 .424.423.42.42 0 0 1-.423.422" />
<path d="M11 25.384H.423A.422.422 0 0 1 0 24.96V6.328c0-.109.041-.21.116-.296L5.712.135A.429.429 0 0 1 6.019 0h13.02a.42.42 0 0 1 .423.423v15.653c0 .237-.19.424-.424.424a.422.422 0 0 1-.423-.424V.846H6.201L.846 6.496v18.04H11a.42.42 0 0 1 .423.423c0 .237-.19.424-.423.424" />

6
app/components/Icon/Check.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgCheck = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-check"
width="1em"
height="1em"
className="check_svg__feather check_svg__feather-check"
{...props}
>
<path d="M20 6L9 17l-5-5" />

16
app/components/Icon/CheckAnimated.js

@ -1,9 +1,19 @@
import React from 'react'
const SvgCheckAnimated = props => (
<svg className="checkmark" viewBox="0 0 52 52" width="1em" height="1em" {...props}>
<circle className="checkmark__circle" cx={26} cy={26} r={25} fill="none" />
<path className="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8" />
<svg
className="check-animated_svg__checkmark"
viewBox="0 0 52 52"
{...props}
width="1em"
height="1em"
>
<circle className="check-animated_svg__checkmark__circle" cx={26} cy={26} r={25} fill="none" />
<path
className="check-animated_svg__checkmark__check"
fill="none"
d="M14.1 27.2l7.1 7.2 16.7-16.8"
/>
</svg>
)

6
app/components/Icon/CheckCircle.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgCheckCircle = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={0.5}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-check-circle"
width="1em"
height="1em"
className="check-circle_svg__feather check-circle_svg__feather-check-circle"
{...props}
>
<path d="M22 11.07V12a10 10 0 1 1-5.93-9.14" />

6
app/components/Icon/Clock.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgClock = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-clock"
width="1em"
height="1em"
className="clock_svg__feather clock_svg__feather-clock"
{...props}
>
<circle cx={12} cy={12} r={10} />

2
app/components/Icon/Close.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgClose = props => (
<svg viewBox="0 0 10 10" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 10 10" {...props}>
<g fill="currentColor" fillRule="evenodd">
<path d="M7.744 1.077a.833.833 0 1 1 1.179 1.179L2.256 8.923a.833.833 0 1 1-1.179-1.179l6.667-6.667z" />
<path d="M1.077 2.256a.833.833 0 1 1 1.179-1.179l6.667 6.667a.833.833 0 1 1-1.179 1.179L1.077 2.256z" />

6
app/components/Icon/CloudLightning.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgCloudLightning = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={0.5}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-cloud-lightning"
width="1em"
height="1em"
className="cloud-lightning_svg__feather cloud-lightning_svg__feather-cloud-lightning"
{...props}
>
<path d="M19 16.9A5 5 0 0 0 18 7h-1.26a8 8 0 1 0-11.62 9" />

4
app/components/Icon/Cloudbolt.js

@ -1,9 +1,9 @@
import React from 'react'
const SvgCloudbolt = props => (
<svg viewBox="0 0 79.536 79.536" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 79.536 79.536" {...props}>
<path
className="load-draw-svg"
className="cloudbolt_svg__load-draw-svg"
d="M78.967 29.396c0 8.124-6.582 14.7-14.706 14.7H9.145c-4.735 0-8.575-1.799-8.575-6.54a8.576 8.576 0 0 1 8.575-8.575c.857 0 1.675.171 2.47.409 0-.067-.021-.132-.021-.202 0-5.525 4.479-9.999 10.004-9.999.228 0 .456.052.687.067-.013-.233-.075-.451-.075-.684C22.209 8.313 30.522 0 40.788 0c9.264 0 16.896 6.814 18.289 15.689 1.61-.616 3.351-.991 5.184-.991 8.124 0 14.706 6.581 14.706 14.698zm-29.79 18.222H34.504c-4.306 4.329-11.283 11.34-11.363 11.34h11.757L23.146 79.536l26.45-23.52h-8.818l8.399-8.398z"
fill="currentColor"
/>

2
app/components/Icon/Contacts.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgContacts = props => (
<svg viewBox="0 0 20 15" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 20 15" {...props}>
<g
transform="translate(1 1)"
stroke="currentColor"

6
app/components/Icon/Copy.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgCopy = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-copy"
width="1em"
height="1em"
className="copy_svg__feather copy_svg__feather-copy"
{...props}
>
<rect x={9} y={9} width={13} height={13} rx={2} ry={2} />

2
app/components/Icon/Error.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgError = props => (
<svg viewBox="0 0 17 17" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 17 17" {...props}>
<path
fill="currentColor"
fillRule="evenodd"

6
app/components/Icon/Eye.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgEye = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-eye"
width="1em"
height="1em"
className="eye_svg__feather eye_svg__feather-eye"
{...props}
>
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" />

6
app/components/Icon/Globe.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgGlobe = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-globe"
width="1em"
height="1em"
className="globe_svg__feather globe_svg__feather-globe"
{...props}
>
<circle cx={12} cy={12} r={10} />

2
app/components/Icon/Hand.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgHand = props => (
<svg viewBox="0 0 32 14" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 32 14" {...props}>
<g stroke="currentColor" strokeWidth={0.75} fill="none" fillRule="evenodd">
<path d="M7 2.078c4.025-.372 7.34.589 9.943 2.882h4.623c2.038 0 1.782 3.04 0 3.04h-7.134M3.11 10.925H7V1H1c.208 5.035.966 8.368 2.272 10" />
<path d="M7 9.843C12.434 11.948 16.079 13 17.933 13c2.782 0 10.816-4.844 12.351-5.842C31.82 6.159 30.524 5 29.738 5c-.525 0-2.798.752-6.818 2.257" />

6
app/components/Icon/Help.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgHelp = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-life-buoy"
width="1em"
height="1em"
className="help_svg__feather help_svg__feather-life-buoy"
{...props}
>
<circle cx={12} cy={12} r={10} />

2
app/components/Icon/Help2.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgHelp2 = props => (
<svg viewBox="0 0 18 18" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 18 18" {...props}>
<g
transform="translate(1 1)"
stroke="currentColor"

4
app/components/Icon/IconPlus.js

@ -1,8 +1,8 @@
import React from 'react'
const SvgIconPlus = props => (
<svg viewBox="0 0 18 18" width="1em" height="1em" {...props}>
<g fill="none" fillRule="evenodd" stroke="#FD9800" transform="translate(1 1)">
<svg width="1em" height="1em" viewBox="0 0 18 18" {...props}>
<g fill="none" fillRule="evenodd" stroke="currentColor" transform="translate(1 1)">
<path d="M8.09 5v6M5 8.09h6" strokeLinecap="round" strokeLinejoin="round" />
<circle cx={8} cy={8} r={8} />
</g>

6
app/components/Icon/Lightning.js

@ -1,15 +1,15 @@
import React from 'react'
const SvgLightning = props => (
<svg viewBox="0 0 50 50" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 50 50" {...props}>
<defs>
<linearGradient id="b" x1="0%" y1="0%" y2="100%">
<linearGradient id="lightning_svg__a" x1="0%" y1="0%" y2="100%">
<stop offset="0%" stopColor="#FFBD59" />
<stop offset="100%" stopColor="#FD9800" />
</linearGradient>
</defs>
<g fill="none" fillRule="evenodd">
<circle cx={25} cy={25} r={25} fill="url(#b)" />
<circle cx={25} cy={25} r={25} fill="url(#lightning_svg__a)" />
<path
fill="currentColor"
fillRule="nonzero"

2
app/components/Icon/Litecoin.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgLitecoin = props => (
<svg fill="currentColor" viewBox="0 0 40 40" data-icon="ltc" width="1em" height="1em" {...props}>
<svg fill="currentColor" viewBox="0 0 40 40" dataIcon="ltc" {...props} width="1em" height="1em">
<path d="M12.29 28.04l1.29-5.52-1.58.67.63-2.85 1.64-.68L16.52 10h5.23l-1.52 7.14 2.09-.74-.58 2.7-2.05.8-.9 4.34h8.1l-.99 3.8z" />
</svg>
)

2
app/components/Icon/LndLogo.js

File diff suppressed because one or more lines are too long

2
app/components/Icon/LtcLogo.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgLtcLogo = props => (
<svg viewBox="0.847 0.876 329.254 329.256" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0.847 0.876 329.254 329.256" {...props}>
<path
d="M330.102 165.503c0 90.922-73.705 164.629-164.626 164.629C74.554 330.132.848 256.425.848 165.503.848 74.582 74.554.876 165.476.876c90.92 0 164.626 73.706 164.626 164.627"
fill="#bebebe"

2
app/components/Icon/Network.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgNetwork = props => (
<svg viewBox="0 0 18 18" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 18 18" {...props}>
<g
transform="translate(1 1)"
stroke="currentColor"

6
app/components/Icon/Onchain.js

@ -1,15 +1,15 @@
import React from 'react'
const SvgOnchain = props => (
<svg viewBox="0 0 50 50" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 50 50" {...props}>
<defs>
<linearGradient id="c" x1="0%" y1="0%" y2="100%">
<linearGradient id="onchain_svg__a" x1="0%" y1="0%" y2="100%">
<stop offset="0%" stopColor="#FFBD59" />
<stop offset="100%" stopColor="#FD9800" />
</linearGradient>
</defs>
<g fill="none" fillRule="evenodd">
<circle cx={25} cy={25} r={25} fill="url(#c)" />
<circle cx={25} cy={25} r={25} fill="url(#onchain_svg__a)" />
<path
stroke="currentColor"
strokeLinecap="round"

2
app/components/Icon/PaperPlane.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgPaperPlane = props => (
<svg viewBox="0 0 22 22" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 22 22" {...props}>
<g
stroke="currentColor"
strokeWidth={0.75}

3
app/components/Icon/Peers.js

@ -1,14 +1,13 @@
import React from 'react'
const SvgPeers = props => (
<svg viewBox="0 0 24 19" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 24 19" {...props}>
<g
transform="translate(1 1)"
stroke="currentColor"
fill="none"
fillRule="evenodd"
strokeLinecap="round"
opacity={0.7}
strokeLinejoin="round"
>
<path d="M16 18v-2a4 4 0 0 0-4-4H4a4 4 0 0 0-4 4v2" />

6
app/components/Icon/Plus.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgPlus = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-plus"
width="1em"
height="1em"
className="plus_svg__feather plus_svg__feather-plus"
{...props}
>
<path d="M12 5v14M5 12h14" />

6
app/components/Icon/PlusCircle.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgPlusCircle = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-plus-circle"
width="1em"
height="1em"
className="plus-circle_svg__feather plus-circle_svg__feather-plus-circle"
{...props}
>
<circle cx={12} cy={12} r={10} />

4
app/components/Icon/Qrcode.js

@ -1,8 +1,8 @@
import React from 'react'
const SvgQrcode = props => (
<svg viewBox="0 0 16 16" width="1em" height="1em" {...props}>
<g fill="currentColor" fillRule="nonzero" opacity={0.5}>
<svg width="1em" height="1em" viewBox="0 0 16 16" {...props}>
<g fill="currentColor" fillRule="nonzero">
<path d="M.4 4.809a.4.4 0 0 1-.4-.4V.4A.4.4 0 0 1 .4 0h4.009a.4.4 0 1 1 0 .8H.8v3.609a.4.4 0 0 1-.4.4zM15.6 16h-4.01a.4.4 0 1 1 0-.8h3.61v-3.61a.4.4 0 1 1 .8 0v4.01a.4.4 0 0 1-.4.4zM15.6 4.809a.4.4 0 0 1-.4-.4V.8h-3.61a.4.4 0 1 1 0-.8h4.01a.4.4 0 0 1 .4.4v4.009a.4.4 0 0 1-.4.4zM4.409 16H.4a.4.4 0 0 1-.4-.4v-4.01a.4.4 0 1 1 .8 0v3.61h3.609a.4.4 0 1 1 0 .8zM11.588 11.98H7.6a.393.393 0 0 1-.393-.393V7.994H3.612a.393.393 0 1 1 0-.786H7.6c.217 0 .393.176.393.393v3.595h3.595a.393.393 0 1 1 0 .785z" />
<path d="M11.588 9.879a.393.393 0 0 1-.393-.393V7.993H9.879v1.493a.393.393 0 1 1-.786 0V7.6c0-.217.176-.393.393-.393h2.101c.218 0 .393.176.393.393v1.886a.393.393 0 0 1-.393.393zM5.714 6.107H3.612a.393.393 0 0 1-.392-.393V3.612c0-.217.175-.392.392-.392h2.102c.217 0 .393.175.393.392v2.102a.393.393 0 0 1-.393.393zm-1.709-.786h1.316V4.005H4.005v1.316zM11.588 6.107H9.486a.393.393 0 0 1-.393-.393V3.612c0-.217.176-.392.393-.392h2.101c.218 0 .393.175.393.392v2.102a.393.393 0 0 1-.393.393zm-1.71-.786h1.317V4.005H9.879v1.316zM5.714 11.98H3.612a.393.393 0 0 1-.392-.393V9.486c0-.217.175-.393.392-.393h2.102c.217 0 .393.176.393.393v2.101a.393.393 0 0 1-.393.393zm-1.709-.785h1.316V9.879H4.005v1.316zM7.6 6.107a.393.393 0 0 1-.393-.393V3.612a.393.393 0 1 1 .786 0v2.102a.393.393 0 0 1-.393.393z" />
</g>

6
app/components/Icon/Search.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgSearch = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-search"
width="1em"
height="1em"
className="search_svg__feather search_svg__feather-search"
{...props}
>
<circle cx={10.5} cy={10.5} r={7.5} />

3
app/components/Icon/Settings.js

@ -1,14 +1,13 @@
import React from 'react'
const SvgSettings = props => (
<svg viewBox="0 0 24 24" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 24 24" {...props}>
<g
transform="translate(1 1)"
stroke="currentColor"
fill="none"
fillRule="evenodd"
strokeLinecap="round"
opacity={0.7}
strokeLinejoin="round"
>
<circle cx={11} cy={11} r={3} />

2
app/components/Icon/SkinnyBitcoin.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgSkinnyBitcoin = props => (
<svg viewBox="0 0 25 42" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 25 42" {...props}>
<g fillRule="nonzero" fill="currentColor">
<path d="M16.667 38H.833A.842.842 0 0 1 0 37.15V4.85C0 4.38.373 4 .833 4h12.5c4.595 0 8.334 3.813 8.334 8.5 0 2.86-1.39 5.392-3.519 6.934C22.038 20.148 25 23.628 25 27.8v1.7c0 4.687-3.738 8.5-8.333 8.5zm-15-1.7h15c3.676 0 6.666-3.05 6.666-6.8v-1.7c0-3.75-2.99-6.8-6.666-6.8h-15v15.3zm0-17h11.666C17.01 19.3 20 16.25 20 12.5s-2.99-6.8-6.667-6.8H1.667v13.6z" />
<path d="M6 5c-.552 0-1-.373-1-.833V.833C5 .373 5.448 0 6 0s1 .373 1 .833v3.334C7 4.627 6.554 5 6 5zM12 5c-.552 0-1-.373-1-.833V.833c0-.46.448-.833 1-.833s1 .373 1 .833v3.334c0 .46-.446.833-1 .833zM6 42c-.552 0-1-.373-1-.833v-3.334c0-.46.448-.833 1-.833s1 .373 1 .833v3.334c0 .46-.446.833-1 .833zM12 42c-.552 0-1-.373-1-.833v-3.334c0-.46.448-.833 1-.833s1 .373 1 .833v3.334c0 .46-.446.833-1 .833z" />

12
app/components/Icon/Spinner.js

@ -1,20 +1,14 @@
import React from 'react'
const SvgSpinner = props => (
<svg
xmlnsXlink="http://www.w3.org/1999/xlink"
viewBox="0 0 14 14"
width="1em"
height="1em"
{...props}
>
<svg width="1em" height="1em" viewBox="0 0 14 14" {...props}>
<defs>
<path
id="d"
id="spinner_svg__a"
d="M0 7a.778.778 0 1 1 1.556 0c0 1.464.58 2.835 1.594 3.85a5.444 5.444 0 1 0 1.766-8.881A.778.778 0 1 1 4.32.53 7 7 0 1 1 0 7z"
/>
</defs>
<use fill="currentColor" xlinkHref="#d" />
<use fill="currentColor" xlinkHref="#spinner_svg__a" />
</svg>
)

12
app/components/Icon/Success.js

@ -1,20 +1,14 @@
import React from 'react'
const SvgSuccess = props => (
<svg
xmlnsXlink="http://www.w3.org/1999/xlink"
viewBox="0 0 17 17"
width="1em"
height="1em"
{...props}
>
<svg width="1em" height="1em" viewBox="0 0 17 17" {...props}>
<defs>
<path
id="a"
id="success_svg__a"
d="M8.333 16.667A8.333 8.333 0 1 1 8.333 0a8.333 8.333 0 0 1 0 16.667zM11.095 5.66l-4.41 4.41-1.513-1.51a.833.833 0 1 0-1.179 1.178l2.101 2.101a.833.833 0 0 0 1.179 0l5-5a.833.833 0 0 0-1.179-1.178z"
/>
</defs>
<use fill="currentColor" fillRule="evenodd" xlinkHref="#a" />
<use fill="currentColor" fillRule="evenodd" xlinkHref="#success_svg__a" />
</svg>
)

6
app/components/Icon/User.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgUser = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-user"
width="1em"
height="1em"
className="user_svg__feather user_svg__feather-user"
{...props}
>
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" />

2
app/components/Icon/Wallet.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgWallet = props => (
<svg viewBox="0 0 25 23" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 25 23" {...props}>
<g fill="currentColor" fillRule="evenodd">
<path d="M22.9 22.822H2.1c-1.158 0-2.1-.942-2.1-2.1V4.869c0-.21.129-.388.311-.463a1.755 1.755 0 0 1-.176-.343.5.5 0 0 1 .933-.36c.256.666 1.342.674 1.815.666H22.9c1.158 0 2.1.942 2.1 2.1v14.253c0 1.158-.942 2.1-2.1 2.1zM1 5.018v15.704c0 .606.494 1.1 1.1 1.1h20.8c.607 0 1.1-.494 1.1-1.1V6.469c0-.606-.493-1.1-1.1-1.1H2.901c-.402.02-1.232 0-1.901-.351z" />
<path d="M22.318 5.305a.5.5 0 0 1-.5-.5V1.829c0-.274-.099-.508-.28-.656-.181-.15-.428-.203-.695-.15L2.149 2.833C1.071 3.074 1 3.96.999 3.97l.001.75a.5.5 0 0 1-1 0v-.783c.039-.6.503-1.761 1.993-2.088L20.699.035A1.789 1.789 0 0 1 22.174.4c.409.338.644.859.644 1.429v2.976c0 .277-.223.5-.5.5M19.916 14.997a1.301 1.301 0 1 1 1.3-1.301c0 .717-.583 1.3-1.3 1.3zm0-1.6a.3.3 0 1 0-.001.598.3.3 0 0 0 .001-.598z" />

2
app/components/Icon/Wallet2.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgWallet2 = props => (
<svg viewBox="0 0 18 16" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 18 16" {...props}>
<g fill="currentColor" fillRule="evenodd">
<path d="M16.488 15.876H1.512C.678 15.876 0 15.22 0 14.415V3.387a.35.35 0 0 1 .224-.322 1.206 1.206 0 0 1-.127-.239.345.345 0 0 1 .207-.45.365.365 0 0 1 .465.2c.184.463.966.469 1.307.463h14.412c.834 0 1.512.655 1.512 1.46v9.916c0 .806-.678 1.46-1.512 1.46zM.72 3.49v10.924c0 .422.356.765.792.765h14.976a.78.78 0 0 0 .792-.765V4.5a.78.78 0 0 0-.792-.765h-14.4c-.289.014-.886 0-1.368-.244z" />
<path d="M16.069 3.69a.354.354 0 0 1-.36-.348v-2.07a.565.565 0 0 0-.202-.456.607.607 0 0 0-.5-.105l-13.46 1.26c-.776.167-.827.784-.828.79l.001.522a.354.354 0 0 1-.36.347.354.354 0 0 1-.36-.347v-.545c.028-.418.362-1.225 1.435-1.453L14.903.025c.368-.073.768.02 1.062.253.295.235.464.598.464.994v2.07c0 .193-.16.348-.36.348M14.34 10.432c-.517 0-.936-.406-.936-.905 0-.498.42-.903.936-.903s.936.405.936.903c0 .5-.42.905-.936.905zm0-1.113a.212.212 0 0 0-.216.208c0 .116.096.21.216.21a.213.213 0 0 0 .216-.21.212.212 0 0 0-.216-.208z" />

12
app/components/Icon/X.js

@ -1,16 +1,10 @@
import React from 'react'
const SvgX = props => (
<svg
xmlnsXlink="http://www.w3.org/1999/xlink"
viewBox="0 0 22 20"
width="1em"
height="1em"
{...props}
>
<svg width="1em" height="1em" viewBox="0 0 22 20" {...props}>
<defs>
<path
id="a"
id="x_svg__a"
d="M10 10L0 20l10-10L0 0l10 10L20 0l-8.394 8.394L10 10l1.606 1.606L20 20 10 10z"
/>
</defs>
@ -21,7 +15,7 @@ const SvgX = props => (
strokeLinecap="round"
strokeLinejoin="round"
transform="translate(1)"
xlinkHref="#a"
xlinkHref="#x_svg__a"
/>
</svg>
)

6
app/components/Icon/Zap.js

@ -2,15 +2,15 @@ import React from 'react'
const SvgZap = props => (
<svg
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
className="feather feather-zap"
width="1em"
height="1em"
className="zap_svg__feather zap_svg__feather-zap"
{...props}
>
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />

2
app/components/Icon/ZapLogo.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgZapLogo = props => (
<svg viewBox="0 0 60 21" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 60 21" {...props}>
<g fill="none" fillRule="evenodd">
<path
d="M29.533 15.014h6.865V16h-8.31v-.86l6.406-8.7h-6.21V5.433h7.685v.869l-6.436 8.71zM46.158 16c-.117-.332-.192-.824-.224-1.475-.41.534-.933.946-1.568 1.236a4.8 4.8 0 0 1-2.016.434c-1.016 0-1.838-.283-2.466-.85-.628-.566-.943-1.282-.943-2.148 0-1.028.428-1.842 1.285-2.441.856-.6 2.049-.899 3.579-.899h2.119v-1.2c0-.756-.233-1.35-.698-1.783-.466-.433-1.145-.65-2.037-.65-.813 0-1.487.209-2.021.626-.534.416-.8.918-.8 1.504l-1.173-.01c0-.84.39-1.568 1.172-2.183.781-.615 1.742-.923 2.881-.923 1.178 0 2.108.295 2.788.884.68.59 1.03 1.411 1.05 2.466v5c0 1.022.107 1.787.322 2.295V16h-1.25zm-3.672-.84c.782 0 1.48-.189 2.095-.566a3.333 3.333 0 0 0 1.343-1.514v-2.324h-2.09c-1.165.013-2.077.226-2.734.64-.658.413-.987.98-.987 1.704 0 .592.22 1.084.66 1.474.439.39 1.01.586 1.713.586zm17.211-4.336c0 1.647-.364 2.954-1.093 3.921-.73.967-1.706 1.45-2.93 1.45-1.445 0-2.552-.507-3.32-1.523v5.39H51.19V5.434h1.084l.059 1.494c.762-1.127 1.865-1.69 3.31-1.69 1.264 0 2.255.479 2.974 1.436.72.957 1.08 2.285 1.08 3.984v.166zm-1.172-.205c0-1.348-.276-2.412-.83-3.193-.553-.781-1.325-1.172-2.314-1.172-.716 0-1.332.172-1.846.517-.514.346-.908.847-1.181 1.504v5.069c.28.605.68 1.067 1.2 1.386.522.32 1.137.479 1.846.479.983 0 1.75-.392 2.3-1.177.55-.784.825-1.922.825-3.413z"

2
app/components/Icon/ZapLogoBlack.js

@ -1,7 +1,7 @@
import React from 'react'
const SvgZapLogoBlack = props => (
<svg viewBox="0 0 60 21" width="1em" height="1em" {...props}>
<svg width="1em" height="1em" viewBox="0 0 60 21" {...props}>
<g fill="none" fillRule="evenodd">
<path
d="M29.533 15.014h6.865V16h-8.31v-.86l6.406-8.7h-6.21V5.433h7.685v.869l-6.436 8.71zM46.158 16c-.117-.332-.192-.824-.224-1.475-.41.534-.933.946-1.568 1.236a4.8 4.8 0 0 1-2.016.434c-1.016 0-1.838-.283-2.466-.85-.628-.566-.943-1.282-.943-2.148 0-1.028.428-1.842 1.285-2.441.856-.6 2.049-.899 3.579-.899h2.119v-1.2c0-.756-.233-1.35-.698-1.783-.466-.433-1.145-.65-2.037-.65-.813 0-1.487.209-2.021.626-.534.416-.8.918-.8 1.504l-1.173-.01c0-.84.39-1.568 1.172-2.183.781-.615 1.742-.923 2.881-.923 1.178 0 2.108.295 2.788.884.68.59 1.03 1.411 1.05 2.466v5c0 1.022.107 1.787.322 2.295V16h-1.25zm-3.672-.84c.782 0 1.48-.189 2.095-.566a3.333 3.333 0 0 0 1.343-1.514v-2.324h-2.09c-1.165.013-2.077.226-2.734.64-.658.413-.987.98-.987 1.704 0 .592.22 1.084.66 1.474.439.39 1.01.586 1.713.586zm17.211-4.336c0 1.647-.364 2.954-1.093 3.921-.73.967-1.706 1.45-2.93 1.45-1.445 0-2.552-.507-3.32-1.523v5.39H51.19V5.434h1.084l.059 1.494c.762-1.127 1.865-1.69 3.31-1.69 1.264 0 2.255.479 2.974 1.436.72.957 1.08 2.285 1.08 3.984v.166zm-1.172-.205c0-1.348-.276-2.412-.83-3.193-.553-.781-1.325-1.172-2.314-1.172-.716 0-1.332.172-1.846.517-.514.346-.908.847-1.181 1.504v5.069c.28.605.68 1.067 1.2 1.386.522.32 1.137.479 1.846.479.983 0 1.75-.392 2.3-1.177.55-.784.825-1.922.825-3.413z"

10
app/components/Pay/Pay.js

@ -11,7 +11,7 @@ import {
Dropdown,
FiatAmountInput,
Form,
FormFieldMessage,
Message,
Label,
LightningInvoiceInput,
Panel,
@ -699,16 +699,16 @@ class Pay extends React.Component {
{currentStep === 'summary' &&
!isQueryingRoutes &&
!hasRoute && (
<FormFieldMessage variant="error" justifyContent="center" mb={2}>
<Message variant="error" justifyContent="center" mb={2}>
<FormattedMessage {...messages.error_no_route} />
</FormFieldMessage>
</Message>
)}
{currentStep === 'summary' &&
!hasEnoughFunds && (
<FormFieldMessage variant="error" justifyContent="center" mb={2}>
<Message variant="error" justifyContent="center" mb={2}>
<FormattedMessage {...messages.error_not_enough_funds} />
</FormFieldMessage>
</Message>
)}
<PayButtons

10
app/components/Pay/PaySummaryLightning.js

@ -5,9 +5,7 @@ import { FormattedNumber, FormattedMessage } from 'react-intl'
import { satoshisToFiat } from 'lib/utils/btc'
import { decodePayReq, getNodeAlias } from 'lib/utils/crypto'
import BigArrowRight from 'components/Icon/BigArrowRight'
import { Bar, Dropdown, Spinner, Text, Truncate } from 'components/UI'
import Value from 'components/Value'
import { PaySummaryRow } from '.'
import { Bar, DataRow, Dropdown, Spinner, Text, Truncate, Value } from 'components/UI'
import messages from './messages'
class PaySummaryLightning extends React.PureComponent {
@ -133,7 +131,7 @@ class PaySummaryLightning extends React.PureComponent {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.fee} />}
right={
isQueryingRoutes ? (
@ -152,7 +150,7 @@ class PaySummaryLightning extends React.PureComponent {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.total} />}
right={
<React.Fragment>
@ -163,7 +161,7 @@ class PaySummaryLightning extends React.PureComponent {
<Bar />
{memo && <PaySummaryRow left={<FormattedMessage {...messages.memo} />} right={memo} />}
{memo && <DataRow left={<FormattedMessage {...messages.memo} />} right={memo} />}
</Box>
)
}

8
app/components/Pay/PaySummaryOnChain.js

@ -5,9 +5,7 @@ import { FormattedNumber, FormattedMessage } from 'react-intl'
import get from 'lodash.get'
import { satoshisToFiat } from 'lib/utils/btc'
import BigArrowRight from 'components/Icon/BigArrowRight'
import { Bar, Dropdown, Spinner, Text, Truncate } from 'components/UI'
import Value from 'components/Value'
import { PaySummaryRow } from '.'
import { Bar, DataRow, Dropdown, Spinner, Text, Truncate, Value } from 'components/UI'
import messages from './messages'
class PaySummaryOnChain extends React.Component {
@ -111,7 +109,7 @@ class PaySummaryOnChain extends React.Component {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.fee} />}
right={
isQueryingFees ? (
@ -139,7 +137,7 @@ class PaySummaryOnChain extends React.Component {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.total} />}
right={
<React.Fragment>

24
app/components/Pay/PaySummaryRow.js

@ -1,24 +0,0 @@
import React from 'react'
import PropTypes from 'prop-types'
import { Box, Flex } from 'rebass'
import { Text } from 'components/UI'
const PaySummaryRow = ({ left, right }) => (
<Box py={3}>
<Flex alignItems="center">
<Box width={1 / 2}>
<Text fontWeight="normal">{left}</Text>
</Box>
<Box width={1 / 2}>
<Text textAlign="right">{right}</Text>
</Box>
</Flex>
</Box>
)
PaySummaryRow.propTypes = {
left: PropTypes.any,
right: PropTypes.any
}
export default PaySummaryRow

1
app/components/Pay/index.js

@ -3,4 +3,3 @@ export PayButtons from './PayButtons'
export PayHeader from './PayHeader'
export PaySummaryLightning from './PaySummaryLightning'
export PaySummaryOnChain from './PaySummaryOnChain'
export PaySummaryRow from './PaySummaryRow'

14
app/components/Request/RequestSummary.js

@ -5,9 +5,7 @@ import { FormattedMessage, FormattedRelative, injectIntl } from 'react-intl'
import { decodePayReq } from 'lib/utils/crypto'
import { showNotification } from 'lib/utils/notifications'
import copy from 'copy-to-clipboard'
import { Bar, Button, Dropdown, QRCode, Text, Truncate } from 'components/UI'
import Value from 'components/Value'
import { PaySummaryRow } from '../Pay'
import { Bar, DataRow, Button, Dropdown, QRCode, Text, Truncate, Value } from 'components/UI'
import messages from './messages'
class RequestSummary extends React.Component {
@ -96,11 +94,11 @@ class RequestSummary extends React.Component {
<Box {...rest}>
{memo && (
<React.Fragment>
<PaySummaryRow left={<FormattedMessage {...messages.memo} />} right={memo} /> <Bar />{' '}
<DataRow left={<FormattedMessage {...messages.memo} />} right={memo} /> <Bar />{' '}
</React.Fragment>
)}
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.amount} />}
right={
<Flex alignItems="center" justifyContent="flex-end">
@ -118,7 +116,7 @@ class RequestSummary extends React.Component {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.qrcode} />}
right={
<Text>
@ -129,7 +127,7 @@ class RequestSummary extends React.Component {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.ln_invoice} />}
right=<React.Fragment>
<Text
@ -150,7 +148,7 @@ class RequestSummary extends React.Component {
<Bar />
<PaySummaryRow
<DataRow
left={<FormattedMessage {...messages.status} />}
right={
<React.Fragment>

0
app/components/AmountInput/AmountInput.js → app/components/UI/AmountInput.js

7
app/components/UI/Button.js

@ -39,7 +39,7 @@ class Button extends React.PureComponent {
}
render() {
let { children, processing, size, ...rest } = this.props
let { children, processing, size, variant, ...rest } = this.props
const sizes = {
small: {
x: 3,
@ -52,9 +52,12 @@ class Button extends React.PureComponent {
}
size = sizes[size] || sizes['medium']
if (variant === 'secondary') {
size.x = 0
}
return (
<Wrapper px={size['x']} py={size['y']} {...rest}>
<Wrapper px={size['x']} py={size['y']} variant={variant} {...rest}>
{processing ? (
<Flex alignItems="center">
{processing && <Spinner />}

85
app/components/UI/Countdown.js

@ -0,0 +1,85 @@
import React from 'react'
import PropTypes from 'prop-types'
import { FormattedMessage, FormattedRelative } from 'react-intl'
import { Text } from 'components/UI'
import messages from './messages'
class Countdown extends React.Component {
state = {
isExpired: null,
timer: null
}
static propTypes = {
colorActive: PropTypes.string,
colorExpired: PropTypes.string,
date: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]).isRequired,
countdownStyle: PropTypes.string,
countUpAfterExpire: PropTypes.bool,
updateInterval: PropTypes.number
}
static defaultProps = {
colorActive: 'superGreen',
colorExpired: 'superRed',
countdownStyle: 'best fit',
countUpAfterExpire: true,
updateInterval: 1000
}
componentDidMount() {
let { date } = this.props
if (date instanceof Date) {
date = new Date(date)
}
const expiresIn = date - Date.now()
if (expiresIn >= 0) {
this.setState({ isExpired: false })
const timer = setInterval(() => this.setState({ isExpired: true }), expiresIn)
this.setState({ timer })
} else {
this.setState({ isExpired: true })
}
}
componentWillUnmount() {
const { timer } = this.state
clearInterval(timer)
}
render() {
const {
colorActive,
colorExpired,
countdownStyle,
countUpAfterExpire,
date,
updateInterval,
...rest
} = this.props
const { isExpired } = this.state
return (
<Text color={isExpired ? colorExpired : colorActive} {...rest}>
{isExpired ? (
<FormattedMessage {...messages.expired} />
) : (
<FormattedMessage {...messages.expires} />
)}
{(!isExpired || (isExpired && countUpAfterExpire)) && (
<React.Fragment>
{` `}
<FormattedRelative
value={new Date(date)}
updateInterval={updateInterval}
style={countdownStyle}
/>
</React.Fragment>
)}
</Text>
)
}
}
export default Countdown

22
app/components/UI/DataRow.js

@ -0,0 +1,22 @@
import React from 'react'
import PropTypes from 'prop-types'
import { Flex } from 'rebass'
import { Text } from 'components/UI'
const DataRow = ({ left, right }) => (
<Flex alignItems="center" py={3}>
<Text width={1 / 2} fontWeight="normal">
{left}
</Text>
<Text width={1 / 2} textAlign="right">
{right}
</Text>
</Flex>
)
DataRow.propTypes = {
left: PropTypes.any,
right: PropTypes.any
}
export default DataRow

6
app/components/UI/GlobalStyle.js

@ -23,6 +23,7 @@ const GlobalStyle = createGlobalStyle`
html {
box-sizing: border-box;
height: 100%;
}
*, *:before, *:after {
@ -30,6 +31,7 @@ const GlobalStyle = createGlobalStyle`
}
body {
height: 100%;
position: relative;
overflow-y: hidden;
-webkit-font-smoothing: antialiased;
@ -39,6 +41,10 @@ const GlobalStyle = createGlobalStyle`
font-size: 13px;
}
#root {
height: 100%;
}
.element-show {
display: inherit;
}

10
app/components/UI/Input.js

@ -4,7 +4,7 @@ import { withTheme } from 'styled-components'
import system from '@rebass/components'
import { styles } from 'styled-system'
import { Flex } from 'rebass'
import { FormFieldMessage } from 'components/UI'
import { Message } from 'components/UI'
// Create an html input element that accepts all style props from styled-system.
const SystemInput = system(
@ -120,13 +120,9 @@ class Input extends React.Component {
error={fieldState.error}
/>
{fieldState.error && (
<FormFieldMessage
variant={hasFocus ? 'warning' : 'error'}
justifyContent={justifyContent}
mt={2}
>
<Message variant={hasFocus ? 'warning' : 'error'} justifyContent={justifyContent} mt={2}>
{fieldState.error}
</FormFieldMessage>
</Message>
)}
</Flex>
)

6
app/components/UI/LightningInvoiceInput.js

@ -4,7 +4,7 @@ import { FormattedMessage, injectIntl } from 'react-intl'
import { asField } from 'informed'
import { isOnchain, isLn } from 'lib/utils/crypto'
import TextArea from 'components/UI/TextArea'
import FormFieldMessage from 'components/UI/FormFieldMessage'
import Message from 'components/UI/Message'
import messages from './messages'
/**
@ -76,14 +76,14 @@ const InformedTextArea = asField(({ fieldState, fieldApi, ...props }) => {
<TextArea {...rest} />
{value &&
!fieldState.error && (
<FormFieldMessage variant="success" mt={2}>
<Message variant="success" mt={2}>
<FormattedMessage
{...messages.valid_request}
values={{
chain: chainName
}}
/>
</FormFieldMessage>
</Message>
)}
</React.Fragment>
)

16
app/components/UI/FormFieldMessage.js → app/components/UI/Message.js

@ -9,16 +9,16 @@ import styled from 'styled-components'
import { variant } from 'styled-system'
const messageStyle = variant({ key: 'messages' })
const Message = styled(Flex)(messageStyle)
const StyledMessage = styled(Flex)(messageStyle)
/**
* @render react
* @name FormFieldMessage
* @name Message
* @example
* <FormFieldMessage message="Error message" />
* <Message message="Error message" />
*/
class FormFieldMessage extends React.Component {
static displayName = 'FormFieldMessage'
class Message extends React.Component {
static displayName = 'Message'
static propTypes = {
variant: PropTypes.string,
@ -28,7 +28,7 @@ class FormFieldMessage extends React.Component {
render() {
const { children, variant, ...rest } = this.props
return (
<Message {...rest} variant={variant} alignItems="center">
<StyledMessage {...rest} variant={variant} alignItems="center">
<Box mr={1}>
{variant === 'success' && <Success />}
{variant === 'warning' && <Warning />}
@ -37,9 +37,9 @@ class FormFieldMessage extends React.Component {
<Text fontSize="s" fontWeight="normal">
{children}
</Text>
</Message>
</StyledMessage>
)
}
}
export default FormFieldMessage
export default Message

2
app/components/UI/Modal.js

@ -46,7 +46,7 @@ class Modal extends React.Component {
<X width="2em" height="2em" />
</Box>
</Flex>
<Box as="section" p={2} css={{ flex: 1 }}>
<Box as="section" p={3} pt={1} css={{ flex: 1 }}>
{children}
</Box>
</Flex>

1
app/components/UI/Page.js

@ -14,6 +14,7 @@ const Page = ({ css, ...rest }) => (
as="article"
css={Object.assign(
{
height: '100%',
'min-width': '950px',
'min-height': '600px',
'overflow-y': 'hidden',

10
app/components/UI/TextArea.js

@ -4,7 +4,7 @@ import system from '@rebass/components'
import { styles } from 'styled-system'
import { withTheme } from 'styled-components'
import { Flex } from 'rebass'
import { FormFieldMessage } from 'components/UI'
import { Message } from 'components/UI'
// Create an html textarea element that accepts all style props from styled-system.
const SystemTextArea = system(
@ -122,13 +122,9 @@ class TextArea extends React.PureComponent {
error={fieldState.error}
/>
{fieldState.error && (
<FormFieldMessage
variant={hasFocus ? 'warning' : 'error'}
justifyContent={justifyContent}
mt={2}
>
<Message variant={hasFocus ? 'warning' : 'error'} justifyContent={justifyContent} mt={2}>
{fieldState.error}
</FormFieldMessage>
</Message>
)}
</Flex>
)

0
app/components/Value/Value.js → app/components/UI/Value.js

6
app/components/UI/index.js

@ -1,13 +1,16 @@
export AmountInput from './AmountInput'
export BackgroundDark from './BackgroundDark'
export BackgroundLight from './BackgroundLight'
export BackgroundLightest from './BackgroundLightest'
export Bar from './Bar'
export Button from './Button'
export Countdown from './Countdown'
export CryptoAmountInput from './CryptoAmountInput'
export DataRow from './DataRow'
export Dropdown from './Dropdown'
export FiatAmountInput from './FiatAmountInput'
export Form from './Form'
export FormFieldMessage from './FormFieldMessage'
export Message from './Message'
export GlobalStyle from './GlobalStyle'
export Header from './Header'
export Heading from './Heading'
@ -32,3 +35,4 @@ export TextArea from './TextArea'
export Titlebar from './Titlebar'
export Toggle from './Toggle'
export Truncate from './Truncate'
export Value from './Value'

2
app/components/UI/messages.js

@ -2,6 +2,8 @@ import { defineMessages } from 'react-intl'
/* eslint-disable max-len */
export default defineMessages({
expires: 'Expires',
expired: 'Expired',
required_field: 'This is a required field',
invalid_request: 'Not a valid {chain} request.',
valid_request: 'Valid {chain} request',

0
app/components/Value/Value.scss

3
app/components/Value/index.js

@ -1,3 +0,0 @@
import Value from './Value'
export default Value

3
app/components/Wallet/Wallet.js

@ -4,9 +4,8 @@ import FaAngleUp from 'react-icons/lib/fa/angle-up'
import FaAngleDown from 'react-icons/lib/fa/angle-down'
import { Box, Flex } from 'rebass'
import { btc, blockExplorer } from 'lib/utils'
import Value from 'components/Value'
import Settings from 'components/Settings'
import { Button, Dropdown, Text } from 'components/UI'
import { Button, Dropdown, Text, Value } from 'components/UI'
import CheckAnimated from 'components/Icon/CheckAnimated'
import ZapLogo from 'components/Icon/ZapLogo'
import ZapLogoBlack from 'components/Icon/ZapLogoBlack'

2
app/icons/channels.svg

@ -4,7 +4,7 @@
<title>Group</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Exploration-v2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.7">
<g id="Exploration-v2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Main-Page-Copy-14" transform="translate(-37.000000, -380.000000)" fill="#FFFFFF">
<g id="Group-3" transform="translate(37.000000, 380.000000)">
<g id="Group">

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

2
app/icons/icon-plus.svg

@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 18 18">
<g fill="none" fill-rule="evenodd" stroke="#FD9800" transform="translate(1 1)">
<g fill="none" fill-rule="evenodd" stroke="currentColor" transform="translate(1 1)">
<g stroke-linecap="round" stroke-linejoin="round">
<path d="M8.09 5v6M5 8.09h6"/>
</g>

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 342 B

2
app/icons/peers.svg

@ -4,7 +4,7 @@
<title>users</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Exploration-v2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" opacity="0.7" stroke-linejoin="round">
<g id="Exploration-v2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Main-Page-Copy-14" transform="translate(-37.000000, -332.000000)" stroke="#FFFFFF">
<g id="Group-9" transform="translate(38.000000, 332.000000)">
<g id="users" transform="translate(0.000000, 1.000000)">

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

2
app/icons/qrcode.svg

@ -4,7 +4,7 @@
<title>Group 23</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="v1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-276.000000, -96.000000)" opacity="0.5">
<g id="v1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-276.000000, -96.000000)">
<g id="Group-23" transform="translate(276.000000, 96.000000)" fill="#FFFFFF" fill-rule="nonzero">
<g id="Group-22">
<g id="Group">

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

2
app/icons/settings.svg

@ -4,7 +4,7 @@
<title>settings</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Exploration-v2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" opacity="0.7" stroke-linejoin="round">
<g id="Exploration-v2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Main-Page-Copy-14" transform="translate(-36.000000, -434.000000)" stroke="#FFFFFF">
<g id="Group-33" transform="translate(37.000000, 435.000000)">
<g id="settings">

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

185
stories/_welcome.stories.js

@ -1,5 +1,186 @@
import React from 'react'
import { storiesOf } from '@storybook/react'
import { StateDecorator, Store } from '@sambego/storybook-state'
import { Flex } from 'rebass'
import {
Button,
Dropdown,
Form,
Input,
Label,
LightningInvoiceInput,
Message,
Notification,
Range,
TextArea,
Toggle
} from 'components/UI'
import { Column, Group, Element } from './helpers'
storiesOf('Welcome', module).addWithChapters('Zap Style Guide', {
subtitle: 'Reusable components for Zap Desktop.'
const store = new Store({
crypto: 'btc',
fiat: 'usd',
cryptoCurrencies: [
{
key: 'btc',
name: 'BTC'
},
{
key: 'bits',
name: 'bits'
},
{
key: 'sats',
name: 'satoshis'
}
],
fiatCurrencies: [
{
key: 'usd',
name: 'USD'
},
{
key: 'eur',
name: 'EUR'
},
{
key: 'gbp',
name: 'GBP'
}
]
})
storiesOf('Welcome', module)
.addDecorator(StateDecorator(store))
.addWithChapters('Zap Style Guide', {
subtitle: 'Reusable components for Zap Desktop.',
info: `The Zap style guide showcases and documents our library of reusable React components. Below is a sample of
these components. You can see more examples and full documentation of each component using the navigation on the
left. Use the Theme Picker in the bottom panel to view components in one of our alternate themes.`,
chapters: [
{
sections: [
{
options: {
showSource: false,
allowSourceToggling: false,
showPropTables: false,
allowPropTablesToggling: false
},
sectionFn: () => (
<Flex>
<Column>
<Group title="Message">
<Element>
<Message variant="error">Error message</Message>
</Element>
<Element>
<Message variant="success">Success message</Message>
</Element>
<Element>
<Message variant="warning">Warning message</Message>
</Element>
</Group>
<Group title="Notification">
<Element>
<Notification variant="error">Error message</Notification>
</Element>
<Element>
<Notification variant="success">Success message</Notification>
</Element>
<Element>
<Notification variant="warning">Warning message</Notification>
</Element>
</Group>
</Column>
<Column>
<Group title="Input with Label">
<Form>
<Label htmlFor="input">Input Label</Label>
<Input field="input" />
</Form>
</Group>
<Group title="TextArea with Label">
<Form>
<Label htmlFor="input">Input Label</Label>
<TextArea field="input" />
</Form>
</Group>
<Group title="Lightning Invoice Input">
<Form>
<LightningInvoiceInput
field="input"
chain="bitcoin"
network="testnet"
rows={7}
validateOnBlur
validateOnChange
/* eslint-disable max-len */
initialValue="lntb100u1pdaxza7pp5x73t3j7xgvkzgcdvzgpdg74k4pn0uhwuxlxu9qssytjn77x7zs4qdqqcqzysxqyz5vqd20eaq5uferzgzwasu5te3pla7gv8tzk8gcdxlj7lpkygvfdwndhwtl3ezn9ltjejl3hsp36ps3z3e5pp4rzp2hgqjqql80ec3hyzucq4d9axl"
/>
</Form>
</Group>
</Column>
<Column>
<Group title="Button">
<Element>
<Button>Text</Button>
</Element>
<Element>
<Button size="small">Text</Button>
</Element>
</Group>
<Group title="Secondary Button">
<Element>
<Button variant="secondary">Text</Button>
</Element>
</Group>
<Group title="Loading Button">
<Element>
<Button>Send 0.1235 BTC</Button>
</Element>
<Element>
<Button processing disabled>
Send 0.1235 BTC
</Button>
</Element>
</Group>
</Column>
<Column>
<Group title="Dropdown">
<Element>
<Dropdown
activeKey={store.get('fiat')}
items={store.get('fiatCurrencies')}
onChange={fiat => store.set({ fiat })}
/>
</Element>
</Group>
<Group title="Toggle">
<Form>
<Toggle field="input" />
</Form>
</Group>
<Group title="Range">
<Form>
<Range field="input" />
</Form>
</Group>
</Column>
</Flex>
)
}
]
}
]
})

83
stories/color.stories.js

@ -0,0 +1,83 @@
import React from 'react'
import PropTypes from 'prop-types'
import { storiesOf } from '@storybook/react'
import { ThemeProvider, withTheme } from 'styled-components'
import { Box, Card, Flex } from 'rebass'
import { BackgroundDark, Text } from 'components/UI'
import { dark, light } from 'themes'
import { Column, Group, Element } from './helpers'
const Swatch = ({ name, color }) => (
<Element>
<Flex mb={2}>
<Card
bg={color}
width={50}
css={{ height: '50px' }}
mr={21}
borderRadius={8}
borderColor="primaryText"
border="solid 1px"
/>
<Box>
<Text fontWeight="normal">{name}</Text>
<Text>{color}</Text>
</Box>
</Flex>
</Element>
)
Swatch.propTypes = {
name: PropTypes.string,
color: PropTypes.string
}
const Palette = withTheme(({ theme, ...rest }) => (
<Box {...rest}>
{Object.keys(theme.palette).map(key => (
<Swatch key={key} name={key} color={theme.palette[key]} />
))}
</Box>
))
storiesOf('Welcome', module).addWithChapters('Color palette', {
subtitle: 'Colors that we use throughout the app.',
info: `This page shows our two primary colour palettes. These are used as "themes" that users can switch between
within the app.`,
chapters: [
{
sections: [
{
options: {
showSource: false,
allowSourceToggling: false,
showPropTables: false,
allowPropTablesToggling: false
},
sectionFn: () => (
<Flex>
<Column>
<Group title="Dark">
<ThemeProvider theme={dark}>
<BackgroundDark p={3}>
<Palette />
</BackgroundDark>
</ThemeProvider>
</Group>
</Column>
<Column>
<Group title="Light">
<ThemeProvider theme={light}>
<BackgroundDark p={3}>
<Palette />
</BackgroundDark>
</ThemeProvider>
</Group>
</Column>
</Flex>
)
}
]
}
]
})

30
stories/components/countdown.stories.js

@ -0,0 +1,30 @@
import React from 'react'
import { storiesOf } from '@storybook/react'
import { Countdown } from 'components/UI'
storiesOf('Components.Countdown', module).addWithChapters('Countdown', {
chapters: [
{
sections: [
{
title: 'Default',
sectionFn: () => <Countdown date={Date.now() + 5000} />
},
{
title: 'Stop after expire',
sectionFn: () => <Countdown date={Date.now() + 5000} countUpAfterExpire={false} />
},
{
title: 'Custom colors',
sectionFn: () => (
<Countdown
date={Date.now() + 5000}
colorActive="lightningOrange"
colorExpired="yellow"
/>
)
}
]
}
]
})

20
stories/helpers.js

@ -0,0 +1,20 @@
import React from 'react'
import PropTypes from 'prop-types'
import { Box } from 'rebass'
import { Bar, Heading } from 'components/UI'
export const Column = props => <Box width={1 / 2} mr={5} {...props} />
export const Group = ({ title, children }) => (
<Box mb={4}>
<Heading.h3 mb={2} fontWeight="normal">
{title}
</Heading.h3>
<Bar mb={3} />
{children}
</Box>
)
Group.propTypes = {
title: PropTypes.string,
children: PropTypes.node
}
export const Element = props => <Box py={1} {...props} />

6
stories/pages/pay.stories.js

@ -36,6 +36,12 @@ const store = new Store({
fiatCurrency: 'USD',
fiatCurrencies: ['USD', 'EUR', 'GBP'],
onchainFees: {
fastestFee: 100,
halfHourFee: 70,
hourFee: 30
},
nodes: [
{
pub_key: '03c856d2dbec7454c48f311031f06bb99e3ca1ab15a9b9b35de14e139aa663b463',

39
test/unit/components/CryptoIcon.spec.js

@ -1,39 +0,0 @@
import React from 'react'
import { configure, shallow } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
import CryptoIcon from 'components/CryptoIcon'
import SkinnyBitcoin from 'components/Icon/SkinnyBitcoin'
import Litecoin from 'components/Icon/Litecoin'
configure({ adapter: new Adapter() })
const defaultProps = {
currency: 'bch',
styles: {}
}
describe('component.CryptoIcon', () => {
describe('currency is "unknown"', () => {
const props = { ...defaultProps }
const el = shallow(<CryptoIcon {...props} />)
it('should show empty span', () => {
expect(el.html()).toEqual('<span></span>')
})
})
describe('currency is "btc"', () => {
const props = { ...defaultProps, currency: 'btc' }
const el = shallow(<CryptoIcon {...props} />)
it('should show btc symbol', () => {
expect(el.find(SkinnyBitcoin)).toHaveLength(1)
})
})
describe('currency is "ltc"', () => {
const props = { ...defaultProps, currency: 'ltc' }
const el = shallow(<CryptoIcon {...props} />)
it('should show ltc symbol', () => {
expect(el.find(Litecoin)).toHaveLength(1)
})
})
})

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save