diff --git a/src/renderer/component/common/credit-amount.jsx b/src/renderer/component/common/credit-amount.jsx index b948018a3..ac6538b0e 100644 --- a/src/renderer/component/common/credit-amount.jsx +++ b/src/renderer/component/common/credit-amount.jsx @@ -23,6 +23,7 @@ class CreditAmount extends React.PureComponent { showFullPrice: false, showPlus: false, showLBC: true, + badge: true, }; render() { @@ -77,7 +78,7 @@ class CreditAmount extends React.PureComponent { title={fullPrice} className={classnames('badge', { badge, - 'badge--cost': (badge && !isFree) || amount > 0, + 'badge--cost': badge && amount > 0, 'badge--free': badge && isFree, 'badge--large': large, })} diff --git a/src/renderer/component/common/file-selector.jsx b/src/renderer/component/common/file-selector.jsx index 1aea29fd2..dc75fd33a 100644 --- a/src/renderer/component/common/file-selector.jsx +++ b/src/renderer/component/common/file-selector.jsx @@ -63,7 +63,7 @@ class FileSelector extends React.PureComponent { type === 'file' ? fileLabel || __('Choose File') : directoryLabel || __('Choose Directory'); return ( - + - )} + {name && + claimId && ( + + )} diff --git a/src/renderer/component/transactionList/view.jsx b/src/renderer/component/transactionList/view.jsx index a2f80a884..8b2bb45e1 100644 --- a/src/renderer/component/transactionList/view.jsx +++ b/src/renderer/component/transactionList/view.jsx @@ -1,4 +1,5 @@ // @flow +import type { Transaction } from 'types/transaction'; import * as icons from 'constants/icons'; import * as MODALS from 'constants/modal_types'; import * as React from 'react'; @@ -8,17 +9,6 @@ import FileExporter from 'component/common/file-exporter'; import { TRANSACTIONS } from 'lbry-redux'; import TransactionListItem from './internal/transaction-list-item'; -export type Transaction = { - amount: number, - claim_id: string, - claim_name: string, - fee: number, - nout: number, - txid: string, - type: string, - date: Date, -}; - type Props = { emptyMessage: ?string, slim?: boolean, diff --git a/src/renderer/component/transactionListRecent/view.jsx b/src/renderer/component/transactionListRecent/view.jsx index 41312823b..4925b342e 100644 --- a/src/renderer/component/transactionListRecent/view.jsx +++ b/src/renderer/component/transactionListRecent/view.jsx @@ -1,5 +1,5 @@ // @flow -import type { Transaction } from 'component/transactionList/view'; +import type { Transaction } from 'types/transaction'; import * as icons from 'constants/icons'; import React, { Fragment } from 'react'; import BusyIndicator from 'component/common/busy-indicator'; @@ -28,7 +28,7 @@ class TransactionListRecent extends React.PureComponent { return (
-

+

{__('Recent Transactions')}

@@ -39,11 +39,12 @@ class TransactionListRecent extends React.PureComponent {

- {fetchingTransactions && !hasTransactions && ( -
- -
- )} + {fetchingTransactions && + !hasTransactions && ( +
+ +
+ )} {hasTransactions && ( diff --git a/src/renderer/component/userEmailNew/view.jsx b/src/renderer/component/userEmailNew/view.jsx index c0ea2b5e5..5ad63fe8e 100644 --- a/src/renderer/component/userEmailNew/view.jsx +++ b/src/renderer/component/userEmailNew/view.jsx @@ -41,7 +41,7 @@ class UserEmailNew extends React.PureComponent { const { cancelButton, errorMessage, isPending } = this.props; return ( - +

{__("We'll let you know about LBRY updates, security issues, and great new content.")}

@@ -71,7 +71,7 @@ class UserEmailNew extends React.PureComponent { {cancelButton} -
+ ); } } diff --git a/src/renderer/component/userPhoneNew/view.jsx b/src/renderer/component/userPhoneNew/view.jsx index dff273299..000210607 100644 --- a/src/renderer/component/userPhoneNew/view.jsx +++ b/src/renderer/component/userPhoneNew/view.jsx @@ -1,6 +1,5 @@ -// I'll come back to this -/* eslint-disable */ -import React from 'react'; +// @flow +import * as React from 'react'; import { Form, FormRow, FormField, Submit } from 'component/common/form'; const os = require('os').type(); @@ -20,67 +19,86 @@ const countryCodes = require('country-data') return 0; }); -class UserPhoneNew extends React.PureComponent { - constructor(props) { +type Props = { + addUserPhone: (string, string) => void, + cancelButton: React.Node, + phoneErrorMessage: ?string, + isPending: boolean, +}; + +type State = { + phone: string, + countryCode: string, +}; + +class UserPhoneNew extends React.PureComponent { + constructor(props: Props) { super(props); this.state = { phone: '', - country_code: '+1', + countryCode: '+1', }; - this.formatPhone = this.formatPhone.bind(this); + (this: any).formatPhone = this.formatPhone.bind(this); + (this: any).handleSubmit = this.handleSubmit.bind(this); + (this: any).handleSelect = this.handleSelect.bind(this); } - formatPhone(value) { - const { country_code } = this.state; - value = value.replace(/\D/g, ''); - if (country_code === '+1') { - if (!value) { + formatPhone(value: string) { + const { countryCode } = this.state; + const formattedNumber = value.replace(/\D/g, ''); + + if (countryCode === '+1') { + if (!formattedNumber) { return ''; - } else if (value.length < 4) { - return value; - } else if (value.length < 7) { - return `(${value.substring(0, 3)}) ${value.substring(3)}`; + } else if (formattedNumber.length < 4) { + return formattedNumber; + } else if (formattedNumber.length < 7) { + return `(${formattedNumber.substring(0, 3)}) ${formattedNumber.substring(3)}`; } - const fullNumber = `(${value.substring(0, 3)}) ${value.substring(3, 6)}-${value.substring( + const fullNumber = `(${formattedNumber.substring(0, 3)}) ${formattedNumber.substring( + 3, 6 - )}`; + )}-${formattedNumber.substring(6)}`; return fullNumber.length <= 14 ? fullNumber : fullNumber.substring(0, 14); } - return value; + return formattedNumber; } - handleChanged(event) { + handleChanged(event: SyntheticInputEvent<*>) { this.setState({ phone: this.formatPhone(event.target.value), }); } - handleSelect(event) { - this.setState({ country_code: event.target.value }); + handleSelect(event: SyntheticInputEvent<*>) { + this.setState({ countryCode: event.target.value }); } handleSubmit() { - const { phone, country_code } = this.state; - this.props.addUserPhone(phone.replace(/\D/g, ''), country_code.substring(1)); + const { phone, countryCode } = this.state; + this.props.addUserPhone(phone.replace(/\D/g, ''), countryCode.substring(1)); } render() { const { cancelButton, phoneErrorMessage, isPending } = this.props; return ( -
-

- {__( - 'Enter your phone number and we will send you a verification code. We will not share your phone number with third parties.' - )} -

-
- - - {countryCodes.map((country, index) => ( -
+ ); } } export default UserPhoneNew; -/* eslint-enable */ diff --git a/src/renderer/component/userPhoneVerify/view.jsx b/src/renderer/component/userPhoneVerify/view.jsx index 9d507e710..349cea98c 100644 --- a/src/renderer/component/userPhoneVerify/view.jsx +++ b/src/renderer/component/userPhoneVerify/view.jsx @@ -2,7 +2,7 @@ /* eslint-disable */ import React from 'react'; import Button from 'component/button'; -import { Form, FormField, Submit } from 'component/common/form'; +import { Form, FormField, Submit, FormRow } from 'component/common/form'; class UserPhoneVerify extends React.PureComponent { constructor(props) { @@ -32,35 +32,44 @@ class UserPhoneVerify extends React.PureComponent { render() { const { cancelButton, phoneErrorMessage, phone, countryCode } = this.props; return ( -
-

- {__( - `Please enter the verification code sent to +${countryCode}${phone}. Didn't receive it? ` - )} -

); } @@ -100,17 +100,14 @@ class RewardsPage extends PureComponent {

{__('Disabled')}

-
- -
-

+

{__( 'Rewards are currently disabled for your account. Turn on diagnostic data sharing, in' )}{' '}

+
); } else if (fetching) { @@ -121,16 +118,16 @@ class RewardsPage extends PureComponent { ); } else if (user === null) { return ( -
+

{__('This application is unable to earn rewards due to an authentication failure.')}

-
+ ); } else if (!rewards || rewards.length <= 0) { return ( -
+

{__('No Rewards Available')}

{claimed && claimed.length @@ -139,9 +136,9 @@ class RewardsPage extends PureComponent { ) : __('There are no rewards available at this time, please check back later.')}

-
+ -
{this.renderCustomRewardCode()}
+
{this.renderCustomRewardCode()}
); } @@ -155,9 +152,7 @@ class RewardsPage extends PureComponent { 'card--disabled': isNotEligible, })} > - {rewards.map(reward => ( - - ))} + {rewards.map(reward => )} {this.renderCustomRewardCode()} ); diff --git a/src/renderer/page/settings/view.jsx b/src/renderer/page/settings/view.jsx index 3da62ce3c..69868acac 100644 --- a/src/renderer/page/settings/view.jsx +++ b/src/renderer/page/settings/view.jsx @@ -2,7 +2,7 @@ import * as ICONS from 'constants/icons'; import * as SETTINGS from 'constants/settings'; import * as React from 'react'; -import { FormField, FormFieldPrice } from 'component/common/form'; +import { FormField, FormFieldPrice, FormRow } from 'component/common/form'; import Button from 'component/button'; import Page from 'component/page'; import FileSelector from 'component/common/file-selector'; @@ -287,32 +287,38 @@ class SettingsPage extends React.PureComponent {
- + + + - + + + - + + +
@@ -359,19 +365,21 @@ class SettingsPage extends React.PureComponent {
- - {themes.map(theme => ( - - ))} - + + + {themes.map(theme => ( + + ))} + + {
+ + +
- - + )} {!hasSubscriptions && ( @@ -91,7 +96,7 @@ export default (props: Props) => {
{viewMode === VIEW_ALL && ( -
+
{__('Your subscriptions')} {unreadSubscriptions.length > 0 && }
@@ -118,9 +123,7 @@ export default (props: Props) => {
    - {uris.map(uri => ( - - ))} + {uris.map(uri => )}
diff --git a/src/renderer/page/transactionHistory/view.jsx b/src/renderer/page/transactionHistory/view.jsx index ef83422d9..06ed0fe83 100644 --- a/src/renderer/page/transactionHistory/view.jsx +++ b/src/renderer/page/transactionHistory/view.jsx @@ -27,7 +27,7 @@ class TransactionHistoryPage extends React.PureComponent {
-

+

{__('Transaction History')}

diff --git a/src/renderer/scss/component/_button.scss b/src/renderer/scss/component/_button.scss index 094784cef..11530a16f 100644 --- a/src/renderer/scss/component/_button.scss +++ b/src/renderer/scss/component/_button.scss @@ -1,9 +1,21 @@ .btn { fill: currentColor; position: relative; - - & svg { - stroke-width: 1; + + svg { + stroke-width: 2; + width: 1.2rem; + height: 1.2rem; + position: relative; + top: 0.2rem; + } + + .btn__label { + margin: 0; + } + + svg + .btn__label { + margin-left: var(--spacing-vertical-small); } } @@ -47,6 +59,7 @@ text-align: left; } +// Large icons used for play/view on the file page .btn--icon { width: 5rem; height: 5rem; @@ -61,20 +74,23 @@ background-color: rgba($lbry-black, 0.7); } - &:hover { - background-color: $lbry-green-3; - } - - &.btn--play { + // The play icon looks a little weird without this + .btn--play { padding-left: 0.25rem; } - &.btn--view { - } - .btn__label { display: none; } + + svg { + width: 3rem; + height: 3rem; + + margin-right: 0; + position: relative; + top: 0.1rem; + } } .btn--inverse { @@ -95,42 +111,18 @@ &:hover { background-color: $lbry-gray-1; + color: $lbry-black; html[data-theme='dark'] & { background-color: rgba($lbry-white, 0.1); } } - // TODO: Refactor to remove need for `!important` - - .btn__label { - margin: 0 !important; + .btn__content { + svg { + color: $lbry-gray-4; + } } - - svg { - width: 1rem !important; - height: 1rem !important; - - margin-right: var(--spacing-vertical-small); - position: relative; - top: 0.1rem; - } - - // .btn__content { - // display: flex; - - // svg { - // width: 1rem; - // height: 1rem; - - // color: $lbry-gray-4; - // margin-right: var(--spacing-vertical-small); - // } - - // .btn__label { - // line-height: 1rem; - // } - // } } .btn--load-screen { @@ -161,21 +153,6 @@ background-color: $lbry-teal-4; } } - - // TODO: Refactor to remove need for `!important` - - .btn__label { - margin: 0 !important; - } - - svg { - width: 1rem !important; - height: 1rem !important; - - margin-right: var(--spacing-vertical-small); - position: relative; - top: 0.1rem; - } } .btn--uppercase { diff --git a/src/renderer/scss/component/_card.scss b/src/renderer/scss/component/_card.scss index a0efb94be..2bf20f9e8 100644 --- a/src/renderer/scss/component/_card.scss +++ b/src/renderer/scss/component/_card.scss @@ -93,7 +93,7 @@ position: relative; + .card__content { - padding-top: var(--spacing-vertical-medium); + margin-top: var(--spacing-vertical-medium); } &:not(.card__header--flat) { @@ -118,6 +118,18 @@ grid-gap: var(--spacing-vertical-medium); } +.card__list--rewards { + column-count: 2; + column-gap: var(--spacing-vertical-medium); + margin-bottom: var(--spacing-vertical-large); + + .card { + display: inline-block; + margin: 0 0 var(--spacing-vertical-medium); + width: 100%; + } +} + // C A R D // M E T A @@ -167,12 +179,6 @@ bottom: -0.12rem; position: relative; } - - &.card-row__scrollhouse--sub-component { - .card:first-of-type { - margin-left: 0; - } - } } // C A R D @@ -181,21 +187,19 @@ .card__title { font-size: 2rem; font-weight: 600; - - &:not(.card__title--flex) { - .btn { - bottom: -0.5rem; - float: right; - font-size: 1rem; - } - } - - .btn { - position: relative; - } } .card__title--flex { - @include between; display: flex; + align-items: center; + + .btn:not(:first-of-type) { + margin-left: var(--spacing-vertical-medium); + } +} + +.card__title--flex-between { + display: flex; + @include between; + align-items: center; } diff --git a/src/renderer/scss/component/_content.scss b/src/renderer/scss/component/_content.scss index 13ff4af0a..d378a9b89 100644 --- a/src/renderer/scss/component/_content.scss +++ b/src/renderer/scss/component/_content.scss @@ -12,16 +12,15 @@ bottom: 0; right: 0; - align-items: center; - background-position: center; - background-repeat: no-repeat; - background-size: cover; display: flex; + align-items: center; justify-content: center; position: absolute; background-position: 50% 50%; background-repeat: no-repeat; - background-size: contain; + background-size: cover; + max-width: calc(var(--file-max-width) * (16 / 9)); + margin: auto; &:not(.card__media--nsfw) { background-color: #000; // solid black to blend nicely when the video starts (if it doesn't take the full width) @@ -29,19 +28,24 @@ &:hover { cursor: pointer; + + .btn--view, + .btn--play { + background-color: $lbry-green-3; + } } } .content__embedded { @include thumbnail; - align-items: center; - background-color: $lbry-black; + background-color: #000; display: flex; justify-content: center; + align-items: center; margin-bottom: var(--spacing-vertical-large); - max-height: 60vh; position: relative; width: 100%; + max-height: var(--file-max-width); video { width: 100%; @@ -79,6 +83,7 @@ flex-direction: column; justify-content: center; padding: 0 var(--spacing-vertical-large); + background-color: rgba($lbry-black, 0.7); } .content__loading-text { diff --git a/src/renderer/scss/component/_expandable.scss b/src/renderer/scss/component/_expandable.scss index 212669531..9e41699f9 100644 --- a/src/renderer/scss/component/_expandable.scss +++ b/src/renderer/scss/component/_expandable.scss @@ -24,9 +24,10 @@ &::after { width: 100%; - height: 100%; + height: 40%; bottom: 0; left: 0; + pointer-events: none; background-image: linear-gradient( to bottom, diff --git a/src/renderer/scss/component/_form-field.scss b/src/renderer/scss/component/_form-field.scss index fd0491b2d..092c4e347 100644 --- a/src/renderer/scss/component/_form-field.scss +++ b/src/renderer/scss/component/_form-field.scss @@ -1,8 +1,4 @@ .form-field { - &:not(:last-of-type) { - margin-bottom: var(--spacing-vertical-small); - } - &.form-field--disabled { opacity: 0.4; pointer-events: none; @@ -91,6 +87,12 @@ padding-left: var(--spacing-vertical-small); } +// Keeps radio buttons aligned with the labels +// This can probably be done in a better way, but after setting align-items: center on the parent, the label is still off a bit. +input[type='radio'] + .form-field__postfix { + padding-top: 3px; +} + .form-field__select-wrapper { position: relative; width: 20rem; diff --git a/src/renderer/scss/component/_form-row.scss b/src/renderer/scss/component/_form-row.scss index 426375e12..ddac864aa 100644 --- a/src/renderer/scss/component/_form-row.scss +++ b/src/renderer/scss/component/_form-row.scss @@ -1,9 +1,10 @@ .form-row { display: flex; flex-direction: row; + align-items: flex-end; - &:not(&--vertically-centered) { - align-items: flex-end; + &:not(.form-row--padded):not(:last-of-type) { + margin-bottom: var(--spacing-vertical-medium); } .form-field { @@ -32,8 +33,9 @@ } .form-row--padded { - padding-top: var(--spacing-vertical-medium); - padding-bottom: var(--spacing-vertical-medium); + // Ignore the class name, margin allows these to collapse with other items + margin-top: var(--spacing-vertical-large); + margin-bottom: var(--spacing-vertical-large); } .form-row--right { diff --git a/src/renderer/scss/component/_item-list.scss b/src/renderer/scss/component/_item-list.scss index acd3cb03a..7720e08c3 100644 --- a/src/renderer/scss/component/_item-list.scss +++ b/src/renderer/scss/component/_item-list.scss @@ -28,4 +28,8 @@ .item-list__item--selected { background-color: $lbry-gray-1; + + html[data-theme='dark'] & { + background-color: rgba($lbry-black, 0.5); + } } diff --git a/src/renderer/scss/component/_main.scss b/src/renderer/scss/component/_main.scss index 09274b390..d13e921ef 100644 --- a/src/renderer/scss/component/_main.scss +++ b/src/renderer/scss/component/_main.scss @@ -12,3 +12,29 @@ padding: var(--spacing-vertical-large); } } + +.main--file-page { + display: grid; + grid-template-areas: + 'content content' + 'info related' + 'info related'; + + @media (min-width: 1470px) { + grid-template-areas: + 'content related' + 'info related' + 'info related'; + grid-template-rows: 0fr 1fr; + } + + .grid-area--content { + grid-area: content; + } + .grid-area--info { + grid-area: info; + } + .grid-area--related { + grid-area: related; + } +} diff --git a/src/renderer/scss/component/_media.scss b/src/renderer/scss/component/_media.scss index b7ab582a7..721114a6a 100644 --- a/src/renderer/scss/component/_media.scss +++ b/src/renderer/scss/component/_media.scss @@ -5,13 +5,6 @@ display: flex; font-size: 1.5rem; - .media__actions .btn__content { - svg { - width: 1.5rem; - height: 100%; - } - } - .media__info { margin-left: var(--spacing-vertical-large); width: calc(100% - 20rem); @@ -76,6 +69,17 @@ } } +// M E D I A +// P E N D I N G + +.media--pending { + opacity: 0.5; + + &:hover { + cursor: default; + } +} + // M E D I A // S E A R C H R E S U L T @@ -86,14 +90,6 @@ margin-bottom: var(--spacing-vertical-large); } - .media__actions .btn__content { - display: inline-flex; - - .btn__label { - margin-left: var(--spacing-vertical-small); - } - } - .media__info { margin-left: var(--spacing-vertical-medium); width: calc(100% - 20rem); @@ -150,6 +146,16 @@ } } +.media--search-result, +.media--small { + .media__properties { + padding: 0 var(--spacing-vertical-small); + border-radius: 5px; + background-color: $lbry-white; + color: $lbry-black; + } +} + // M E D I A // A C T I O N S @@ -179,27 +185,6 @@ &:not(:last-child) { margin-right: var(--spacing-vertical-large); } - - .btn__content { - display: inline-flex; - } - - .btn__label { - margin-left: var(--spacing-vertical-small); - } - - svg { - width: 1.5rem; - height: 1.5rem; - } - } - - .btn--alt { - padding-top: 2px; - - .btn__label { - padding-top: 1px; - } } } @@ -214,9 +199,7 @@ // C O N T E N T .media__content--large { - float: left; padding-right: var(--spacing-vertical-large); - width: calc(100% - 30rem); } // M E D I A @@ -316,7 +299,6 @@ .badge { align-items: center; position: relative; - top: 0.15rem; > *:not(:last-child) { margin-right: var(--spacing-vertical-small); @@ -326,7 +308,7 @@ &:not(:empty) { height: 2.55rem; margin-bottom: var(--spacing-vertical-small); - padding-top: var(--spacing-vertical-miniscule); + padding-top: var(--spacing-vertical-small); padding-left: var(--spacing-vertical-small); } } @@ -374,10 +356,14 @@ @include thumbnail; &:not(.media__thumb--nsfw):not(.media__thumb--placeholder) { - background-color: $lbry-black; + background-color: $lbry-gray-2; background-position: center; background-repeat: no-repeat; background-size: cover; + + html[data-theme='dark'] & { + background-color: rgba($lbry-white, 0.1); + } } } @@ -450,7 +436,6 @@ } .media-card { - cursor: pointer; display: inline-block; margin-bottom: var(--spacing-vertical-large); vertical-align: top; @@ -668,11 +653,12 @@ @media (min-width: 601px) { width: calc((100% / 6) - 2.25rem); margin-left: var(--spacing-vertical-large); + } - &:last-of-type { - // For some reason margin doesn't work here. - padding-right: var(--spacing-vertical-large); - } + &:last-of-type { + // We can't use margin or padding because overlfow: hidden ignores those + // border-right ensures the last item in the scrollable list has some space to the right + border-right: var(--spacing-vertical-large) solid transparent; } // May be needed for mobile design diff --git a/src/renderer/scss/component/_pagination.scss b/src/renderer/scss/component/_pagination.scss index e9c9b51ff..db9131a4c 100644 --- a/src/renderer/scss/component/_pagination.scss +++ b/src/renderer/scss/component/_pagination.scss @@ -14,6 +14,10 @@ border-radius: 50%; text-align: center; + &:not(.pagination__item--selected):hover { + color: $lbry-black; + } + &:not(.pagination__item--selected):not(.pagination__item--break):not(.disabled):hover { background-color: $lbry-gray-1; } diff --git a/src/renderer/scss/component/_table.scss b/src/renderer/scss/component/_table.scss index 9bb2a2318..3f9ea45b4 100644 --- a/src/renderer/scss/component/_table.scss +++ b/src/renderer/scss/component/_table.scss @@ -109,8 +109,4 @@ td:nth-of-type(5) { width: 15%; } - - .badge { - background-color: transparent !important; - } } diff --git a/src/renderer/scss/init/_mixins.scss b/src/renderer/scss/init/_mixins.scss index e4b86df1f..c7867501f 100644 --- a/src/renderer/scss/init/_mixins.scss +++ b/src/renderer/scss/init/_mixins.scss @@ -33,23 +33,11 @@ } @mixin placeholder { - animation-duration: 4s; - animation-fill-mode: forwards; - animation-iteration-count: infinite; - animation-name: loading-animation; - animation-timing-function: linear; - background-color: transparent; - background-image: linear-gradient(to right, $lbry-gray-3 10%, transparent 80%, $lbry-gray-3 100%); - background-repeat: repeat; - background-size: 500px; + animation: pulse 2s infinite ease-in-out; + background-color: $lbry-gray-2; html[data-theme='dark'] & { - background-image: linear-gradient( - to right, - rgba($lbry-white, 0.1) 10%, - transparent 80%, - rgba($lbry-white, 0.1) 100% - ); + background-color: rgba($lbry-white, 0.1); } } diff --git a/src/renderer/scss/init/_vars.scss b/src/renderer/scss/init/_vars.scss index 71935a922..8a914d8b7 100644 --- a/src/renderer/scss/init/_vars.scss +++ b/src/renderer/scss/init/_vars.scss @@ -18,6 +18,7 @@ $large-breakpoint: 1921px; --spacing-vertical-medium: calc(2rem / 2); --spacing-vertical-large: 2rem; + --file-max-width: 700px; --video-aspect-ratio: 56.25%; // 9 x 16 // Text diff --git a/src/renderer/types/transaction.js b/src/renderer/types/transaction.js new file mode 100644 index 000000000..37cd5f4b2 --- /dev/null +++ b/src/renderer/types/transaction.js @@ -0,0 +1,11 @@ +// @flow +export type Transaction = { + amount: number, + claim_id: string, + claim_name: string, + fee: number, + nout: number, + txid: string, + type: string, + date: Date, +};