Commit Graph

194 Commits

Author SHA1 Message Date
HenryNguyen5 f999272769 Get web3 working + cleanup sagas 2018-02-02 17:34:38 -05:00
HenryNguyen5 6157208557 Inline auth for custom nodes 2018-02-02 17:21:14 -05:00
HenryNguyen5 74e3cce1d8 Get non web3 node switching working 2018-02-01 22:49:37 -05:00
HenryNguyen5 46cbade177 Provide consistency in naming, fix more sagas 2018-01-30 20:04:36 -05:00
HenryNguyen5 7fbe1966de Fix up components to use selectors, work on fixing sagas 2018-01-29 22:52:19 -05:00
HenryNguyen5 139cf405e7 re-type repo 2018-01-29 20:41:59 -05:00
James Prado c631f45ab7 Improve Gas Price UX (Part 2) (#850)
* Remove gas dropdown & Add gas sliders

* Update styles

* Revert changes made to requestpayment.tsx

* Update style & add custom labels to GasLimitField

* Update styles

* Update confirm transaction modal

* Revert "Update confirm transaction modal"

This reverts commit 743c9a505fe070feb55f7af550ad918a3d8899d1.

* Add transaction fee to tx confirmation modal

* Update styles

* Remove old gasPriceDropdown files & use network units in tx fee

* Add option to lock gaslimit data

* fix tslint errors

* Rename lockData to readOnly

* Add option to check if validAmount before generating transaction

* Add nonce field if gas slider is readonly

* Automatically set nonce in  <Send/>

* Update snapshot

* Move getNonceRequested to GasSlider component

* Add optional to check value for isValidAmount selector

* Add selector for transaction fee

* Update GasSlider component & Rename to Gas

* update snapshots

* Fix subtabs className

* Update styles

* Remove dataField on contract interact

* rename <Gas/> to <TXMetaDataPanel/>
2018-01-24 21:43:27 -06:00
HenryNguyen5 22c107fe4c Fix misc send issues (#916) 2018-01-24 20:41:39 -06:00
William O'Beirne 4fb342a757 Discourage private keys (pt. 1) (#780)
* Insecure wallet blocker warning before unlocking insecure wallet.

* Wrap in quotes to avoid prettier error.

* Make account the homepage. Add a link to generate on the wallet unlock component.

* Fix send routing weirdness.
2018-01-24 16:23:20 -06:00
Oli Oskarsson adc2bec161 Fix nonce field alignment (#894) 2018-01-23 11:05:39 -06:00
HenryNguyen5 75d1be6961 Minimize re-renders due to gas price changes (#886) 2018-01-22 18:12:03 -06:00
William O'Beirne 182eaa4329 Electron App (#854)
* Basic webpack build started.

* Get build working with electron-packager. Not fully satisfied, might investigate electron-builder.

* Custom title bar

* Rewrite all webpack configs to use common function. Organize webpack utils. Split into multiple dist folders.

* Replace electron build with electron-builder. Leave around packager for a bit.

* Check in progress on updater.

* Update modal flow.

* Fix tscheck.

* Adjust publish info.

* Arbitrary version bump.

* Bump version again.

* 5.0.2 bump fix autodownload.

* 5.0.2 bump again, readd dmg

* 5.0.3 bump

* Turn auto update back off. Log errors. Revert versions.

* Add os-specific builds. Improve update failure.

* Open external links in browser in electron.

* Remove custom title bar temporarily.

* Add info about the update download to the modal.

* Turn off development changes.

* Take the postBuild sorting script and move it into a webpack config.

* Initial conversion to typescript and electron-webpack.

* Switch from electron-webpack back to custom config, clean up unused code, typify electron bridge.

* Better typing for bridge.

* Remove unnecessary file.

* Reminify.

* Add shared folder resolving to jest config.

* Add enum to electron events
2018-01-22 17:38:06 -06:00
William O'Beirne 81beab8bc0 Handle Ledger Error with Non-U2F Browsers (#882) 2018-01-22 14:59:02 -06:00
William O'Beirne a58097eeaa Various Browser Quirk Fixes (#881)
* Fix large images in onboarding in safari.

* Fix shapeshift banner centering, adjusted spacing and logo.

* Fix jagged rates.

* Fix small password input on Firefox.

* Remove top and bottom padding on form inputs that would cause cut off text.

* Dont remove top and bottom padding on textareas.

* Prevent flickering from rerender of promos.
2018-01-22 14:44:13 -06:00
James Prado b7ba8ac22d Routing Improvements (#859)
* Nest Routes

* Update routing for subtabs

* Revert 'remove subtabs component'

* Update contract routes

* Update subtabs component

* Remove typo

* Update routing to handle disabled subroutes

* add disable prop to request payment tab

* Update request payment disabled condition

* Add CaptureRouteNotFound & RouteNotFound components

* Update ENS routing

* Remove any type

* Display 404 before unlocking wallet
2018-01-22 06:24:05 -06:00
James Prado f9c1134a16 Equivalent Values Bugfixes (#870)
Update <EquivalentValues /> component
Now works on non-ethereum networks
Update dropdown with new <Select /> from react-select
Calculates total value for all coins & tokens
2018-01-21 22:21:48 -06:00
Danny Skubak e0c4599b64 Advanced Settings Input Validation (#872)
* add gas limit/price constants

* add gas limit/price validators & selectors

* apply new gas limit/price validation to components and sagas

* create/apply function to sanitize advanced fields input

* add types, update tests

* fix unrelated failing test
2018-01-21 12:41:20 -06:00
Daniel Ternyak ab5fa1a799
Support Non-Ethereum Networks (#849)
* Make UnlockHeader a PureComponent

* MVP

* actually disable wallet format if not determined to be valid format for wallet

* default to correct derivation in mnemonic modal

* cleanup

* fix tslint

* use enums for HD wallet getPath

* Add stricter typing

* Fix labels not updating on selector

* Ban hardware wallet support for custom network unsupported chainIds

* Fix type error

* Fix custom node dPath not being saved

* Fix mnemonic modal

* default path bugfixes

* add react-select

* misc fixes; rabbit holing hard.

* fix tslint

* revert identicon changes

* reload on network change :/

* actually reload on network change

* really really reload on network change

* tslint fixes

* Update styles

* set table width

* fix package versioning

* push broken sagas

* Fix saga test

* fix tslint

* address round of review

* move non-selectors out to utilty; adjust reload timer

* cleanup network util comments

* manage wallet disable at WalletDecrypt instead of in both WalletDecrypt and WalletButton

* Separate WalletDecrypt props into ownProps / StateProps

* disable payment requests on non-eth networks

* specialize connect; separate props

* remove unused state prop

* remove bad import

* create tests for networks

* Clarify Lite-Send error on non-ethereum networkS

* remove string option for network config name

* Create concept of always-on 'EXTRA_PATHS'; include SINGULAR_DTV legacy dPath in 'EXTRA_PATHS'

* fix multiple imports

* address PR comments
2018-01-20 14:06:28 -06:00
James Prado f06d814e24 Rotate promos (#858)
* Rotate promos

* Animate promo rotation

* Update promo rotate funct
2018-01-18 23:40:31 -06:00
Danny Skubak f13d490f1c Fix Offline Send (#857)
* add offline check to isValidAmount selector

* add z-index fix to AdvancedGas components

* remove z-index mod, use bootstrap class instead
2018-01-18 20:55:02 -06:00
William O'Beirne 1713e3fa29 Update trezor-connect.js to v4 (#856)
* Update trezor connect.

* Re-ignore trezor connect, fix typings.
2018-01-17 23:16:47 -06:00
James Prado 6108d08693 Improved Gas Estimate UX (#830) 2018-01-15 03:59:59 -06:00
HenryNguyen5 67b2e6491c ENS Resolution for AddressField Component (#807)
* Refactor BaseNode to be an interface INode

* Initial contract commit

* Remove redundant fallback ABI function

* First working iteration of Contract generator to be used in ENS branch

* Hide abi to clean up logging output

* Strip 0x prefix from output decode

* Handle unnamed output params

* Implement ability to supply output mappings to ABI functions

* Fix null case in outputMapping

* Add flow typing

* Add .call method to functions

* Partial commit for type refactor

* Temp contract type fix -- waiting for NPM modularization

* Remove empty files

* Cleanup contract

* Add call request to node interface

* Fix output mapping types

* Revert destructuring overboard

* Add sendCallRequest to rpcNode class and add typing

* Use enum for selecting ABI methods

* Add transaction capability to contracts

* Cleanup privaite/public members

* Remove broadcasting step from a contract transaction

* Cleanup uneeded types

* Refactor ens-base to typescript and add typings for ENS smart contracts

* Migrate ens-name-search to TS

* Add IResolveDomainRequest

* Fix rest of TSC errors

* Add definition file for bn.js

* Remove types-bn

* Fix some typings

* make isBN a static property

* progress commit -- swap out bignumber.js for bn.js

* Swap out bignumber for bn in vendor

* Change modn to number return

* Start to strip out units lib for a string manipulation based lib

* Convert codebase to only base units

* Get rid of useless component

* Handle only wei in values

* Use unit conversion in sidebar

* Automatically strip hex prefix, and  handle decimal edge case

* Handle base 16 wei in transactions

* Make a render callback component for dealing with unit conversion

* Switch contracts to use bn.js, and get transaction values from signedTx instead of state

* Get send transaction  working with bn.js

* Remove redundant hex stripping,  return base value of tokens

* Cleanup unit file

* Re-implement toFixed for strings

* Use formatNumber in codebase

* Cleanup code

* Undo package test changes

* Update snapshot and remove console logs

* Use TokenValue / Wei more consistently where applicable

* Add typing to deterministicWallets, fix confirmation modal, make UnitDisplay more flexible

* Split different ENS modes into their own components

* Fix Abi typedef

* Remove redundant moment type package

* Add Aux helper component

* Split out resolve components

* Make 'to' parameter optional

* Change import type

* Change typing to be base domain request

* Split handling of resolving into object handler

* Fix countdown component

* Adjust element spacing

* Implement reveal search functionality

* Add unit display for highest bidder

* Fill out forbidden/NYA modes

* ENS wallet component skeleton

* Clean up prop handling in UnitDisplay

* Change instanceof to typeof check, change boolean of displayBalance

* Add ENS wallet component

* Cleanup spacing

* Convert ConfModal for bidding in ENS

* Make ui component for placing bids

* Fix destructure in placeBid

* Pass through entire wallet

* Remove text center

* Display inline notification ENS isValid & add some ENS tests

* Add export of Aux

* Reformat with prettier

* progress...

* Add ENSUnlockLayout

* Add RevealBid component

* organize NameResolve components

* Merge ENS with transaction-refactor changes

* Fix address resolution

* Update styles

* convert ens name to lowercase before checking

* Add overflow-y:scroll to table

* update ens snapshots & tests

* cast 'undefined' state argument as any for testing

* clean up components

* Connect unitconverter to redux state

* remove unnecessary type assertion

* fix spinner size

* remove old bidmodal

* validate bidmask before opening modal

* progress...

* Update styles

* Add saga / actions for placing a bid

* Update types & clean up dead code

* Delete old test

* Dispatch PlaceBidRequested acitons

* Progress commit -- get ENS bidding ready for tx generation via sagas

* Seperate ENS action creators and types

* Add reducer & actions for ENS fields

* Add preliminary sagas for bid mask and bid value

* Initial commit

* Add loading indicator

* Remove some bidding components

* Revert bidding files

* Remove more bidding code

* Remove rest of bidding code

* Fix ENS error message

* Revert value saga changes

* Remove error param from setting 'To' field

* Fix existing ENS test

* Cleanup address resolution, remove dead code

* Remove error messages from unimplemented ENS

* Fix last character being not set bug

* Remove error state from Meta

* Rename isGenesisAddress to isCreationAddress
2018-01-15 03:57:09 -06:00
Eddie Wang eb4fd1cce8 Stricter balance checks during swap (#793)
* check currentBalance before showing Amount Field and GenerateTx button

* add token balance check

* check wallet balance

* comments

* simplify wallet balance check
2018-01-15 00:51:35 -06:00
Daniel Ternyak b8b0cdece3
Change network without window refresh (#825)
* remove RSK as support network

* completely remove RSK

* change network without window refresh

* fix saga tests

* fix import
2018-01-15 00:27:26 -06:00
Daniel Ternyak fa8fbe531f
Replace <Aux> with React Fragements (#816)
* replace <Aux> with React Fragements

* Remove Aux imports
2018-01-14 20:07:02 -06:00
William O'Beirne dfb93c16ab Onboarding Style Improvements (#805)
* Increases Modal's width to better fit in the content.
* Restore the image side behavior so that images are sometimes on the left, not always on the right
* Allows modal to dynamically size its height.
    * This reduces some awkward whitespace, and makes it so you can't just jam on the "Next" button since it moves a bit, should slow some people down to at least catch the headlines.
* Restore the alert style on the opening modal
* Provide a mobile-friendly progress stepper.
    * This module's markup kind of sucks, so the restyling code is heinous. Sorry.
* Scrolls the user to the top after hitting "Next" or "Previous"
    * On mobile, you would stay scrolled at the bottom. Much nicer feeling now.
* Tons of text and content spacing / color / size adjustments.
2018-01-13 02:26:08 -06:00
Daniel Ternyak 75871abf5c
Remove Digital Bitbox from account view (#804)
* remove unsupported digital bitbox from account view

* Fix sizing.
2018-01-13 01:50:37 -06:00
James Prado 31e22af904 Remove extra fonts (#790)
* Remove extra font-files

* Add woff font files

* Add woff format for social-media icon font
2018-01-12 11:50:51 -06:00
James Prado 0fa0004e3b Display Address on Hardware Wallets (#772)
* Add 'Display Address' button

* Remove unnecessary css

* Pass full dPath when getting addr

* Add typings for ledger vendor files

* Replace ledger vendor files w/ ledgerco module

* Remove u2f-api file

* Update TrezorConnect api & types

* Add displayAddress method to hardware wallets

* install libusb-1.0 on ci

* Change address, dpath, and index to protected attributes

* Use CommonJS export syntax

* Pin package version

* Prompt user to confirm address on hardware wallet

* Pass full path when getting trezor addr
2018-01-11 20:57:19 -06:00
Olajide Ogundipe Jr 303e44abb3 Onboarding Modal (#611)
* [WIP] Start port of V3 Modal

* allow lambda functions in React Components

* lint code

* add null case for modalRef

* fix action test

* reduce onboard slide boilerplate

* delete images and componentize OnboardSlide

* comment out info onboarding message

* fix merge conflict

* fix prettier error

* revert tslint file

* fix type in modal

* add translations to onboard modal

* add in images, fix stlyes
2018-01-11 12:13:14 -06:00
William O'Beirne 4f6e83acf4 Better Offline UX (#785)
* Check offline status immediately.

* If they start the page offline, show a less severe error message.

* Get rid of offline aware header. Disable wallet options when offline.

* Add online indicator to the header.

* Prevent some components from render, some requests from firing when offline.

* Allow for array of elements with typing.

* Dont show dollars in fee summary when offline.

* Fix up saga tests.

* Fix sidebar component offline styles.

* Remove force offline.

* Dont request rates if offline.

* Nonce in advanced, show even of online.

* Show invalid advanced props.

* Fix up offline poll tests.
2018-01-11 12:04:11 -06:00
Eddie Wang 3a7a0822e2 Hide Equivalent Values on Testnet (#763)
* Hide eqv values when not on testnet

* use isTestnet and variabalize rateExistsOrAll
2018-01-11 11:27:00 -06:00
aitrean af2e0b69e1 Web Worker Decrypt (#680)
1. Attempt an empty password every time a keystore is uploaded.
2. Delegate scrypt decryption (ie ethereumjs-wallet.fromV3) to its own web worker and interface with it through an async typescript function that gets handled in the wallet saga. This keeps the UI unblocked when scrypt takes a long time to decrypt.
3. Add logic to show a spinner x number of milliseconds after file upload so the user will understand when a wallet is being decrypted.
2018-01-11 00:44:13 -06:00
William O'Beirne fb0cce1d68 Rename Aux to AuxComponent for Windows (#771)
* Rename reseved filename 'Aux' to 'AuxComponent'

* fix prettier
2018-01-09 23:29:24 -06:00
Jack Clancy 26619e28cc Enforce HTTPS / Prevent Reverse Tabnabbing (#773)
* working version of test custom rule config

* setting no imports to false so tests will pass

* adding anchor blank noopener rule, rule currently off to allow tests to pass

* removing copied code from tslint-microsoft-contrib

* adding tslint-microsoft-contrib to dev deps

* extending tslint for external http rule

* locking tslint-microsoft-contrib version and turning on target blank noopener rule

* final fixes for pull #663

* add noopener noreferrer as needed

* fixing false positives for a tags without href

* really fix linting errors

* fix imports

* remove accidently(?) added LedgerNano duplicate file
2018-01-09 23:17:52 -06:00
William O'Beirne 6e2b74c79a Use network unit everywhere, fix network redux state (#765)
* Use network unit in confirmation modal. Make sure network is set at init.

* Fix token display

* Ensure that when the node changes, the network also changes. Show network unit in unit dropdown.

* Type saga, fix tests.
2018-01-09 14:13:14 -06:00
William O'Beirne 6ec04f6731 Fix ENS Address Field (#724)
* Fixed borked tag.

* Fix saga tests.

* fix tscheck error
2018-01-08 01:12:16 -06:00
William O'Beirne 62381427e4 Slider prop error fix (#743)
* Cast to float.

* Force gas price and limit inputs to be numbers.
2018-01-07 23:30:56 -06:00
Daniel Ternyak 92d8ecf353
Web3 Improvements (#740)
* increase timeout for web3 auto-login; don't attempt login when web3 is unavailable

* only auto-login when metamask available

* combine multiple imports
2018-01-07 19:21:11 -06:00
William O'Beirne edda9f71ea Improved Gas UX (Pt. 1 - Gas Slider on Send) (#728)
* Initial crack at simple only gas slider component.

* Work on advanced component. Refactor redux and components to specify gas limit vs price.

* Convert fee summary to a render cbesque thing.

* Rework responsive columns.

* Remove force offline button.

* Tweak styles.

* Fix tscheck issues, remove unneeded prop.

* Fix references to GasField

* Gas slider in lite send.

* Make gas slider network-aware for symbol and price calculation.
2018-01-07 10:43:06 -06:00
William O'Beirne 498aeec92c Fix Logout Prompt (#725) 2018-01-04 10:31:22 -06:00
William O'Beirne bcd85ee3a2 Fix Custom Token Delete (#717) 2018-01-02 21:48:17 -06:00
Danny Skubak b939e8ceda Request Payment SubTab - EIP 681 (#671)
* progress

* Normalize bity api response

* Filter api response

* Track swap information in component state

* Update dropdown onchange

* remove dead code

* Update Min Max Validation

* Update minmax err msg && fix onChangeOriginKind

* Add origin & destination to redux state

* Update types & Update tests

* Update types

* Update swap.spec.ts test

* Remove commented out code

* Remove hardcoded coin array

* Create types.ts for swap reducer

* Update swapinput type

* Update bityRates in localStorage & Replace all instances of ...Kind / ...Amount props

* Add shapeshift banner

* initial work for sagas

* Update Types

* Update swap reducer initial state

* Update Types & Store empty obj for bityRates / options

* Update more types

* added shapeshift file and rates comments

* action reducers and prop mapping to components

* add typings and swap icon

* more actions reducers and sagas

* debugging shapeshift service

* add Headers

* Fix content type

* add order reset saga and ui fixes

* remove console log and swap b/w Bity and Shapeshift

* working state for Shapeshift and Bity - tested with mainnet

* add icon component

* UI improvements and fix select bug

* fix timer bug

* add bity fallback options and toFixed floats

* tslint errors

* add arrow to dropdown and add support footer

* Add service provider

* fix minor $ bug and stop timer on order complete

* better load UX and dropdown UX

* fixed single test

* currRate prop bugs and reduce LS bloat

* takeEvery on timer saga and don't clear state.options to restartSwap reducer

* export tx sagas and fix minor type

* Add ShapeShift Rates functionality when selecting a ShapeShift pair.

* type fixes

* BugFix: Don't change displayed ShapeShift Rate Inputs on every dropdown change
Also contains some caching / performance improvements

* BugFix: Don't remote rate inputs when falsy amount

* fix type error

* Progress commit

* Implement saga logic

* Make address field factory component

* Shorten debounce time

* Make new actions / sagas  for handling single token lookup

* Implement working version of litesend

* make unit dropdown searchable, add props for all tokens, custom validation

* add string generators for EIP 681 token & ether transactions

* add new selectors

* add request payment tab

* Change saga into selector

* Add failing spec

* fix broken test

* add debounce to error message

* fix tests

* update snapshots

* test coverage

* move setState disabled property from debounce so we instantly can go to next step on valid amounts

* reset amount value (useful for switching between tabs)

* much deeper test coverage, fix debounce ux, and fix bity flashing at swap page load

* fix minor failing test

* seperate shapeshift erc20 token whitelist

* fix saveState store bug

* break orderTimeRemaining saga up and rewrite tests

* fix tslint error

* add isReadOnly prop to address field

* use AddressField component, add additional validation

* make prop optional

* correct validation

* allow for request tab to be used with view only wallet

* account for undefined activeTab

* add types
2018-01-02 21:18:10 -06:00
William O'Beirne b4f2934878 Show warning when no tokens are found after scan (#711)
* Show warning when no tokens are found.

* Rework no tokens message so users can still add customs or scan for new ones.
2018-01-02 21:04:12 -06:00
Eddie Wang 88532cdc3c Shapeshift Integration (#564)
* progress

* Normalize bity api response

* Filter api response

* Track swap information in component state

* Update dropdown onchange

* remove dead code

* Update Min Max Validation

* Update minmax err msg && fix onChangeOriginKind

* Add origin & destination to redux state

* Update types & Update tests

* Update types

* Update swap.spec.ts test

* Remove commented out code

* Remove hardcoded coin array

* Create types.ts for swap reducer

* Update swapinput type

* Update bityRates in localStorage & Replace all instances of ...Kind / ...Amount props

* Add shapeshift banner

* initial work for sagas

* Update Types

* Update swap reducer initial state

* Update Types & Store empty obj for bityRates / options

* Update more types

* added shapeshift file and rates comments

* action reducers and prop mapping to components

* add typings and swap icon

* more actions reducers and sagas

* debugging shapeshift service

* add Headers

* Fix content type

* add order reset saga and ui fixes

* remove console log and swap b/w Bity and Shapeshift

* working state for Shapeshift and Bity - tested with mainnet

* add icon component

* UI improvements and fix select bug

* fix timer bug

* add bity fallback options and toFixed floats

* tslint errors

* add arrow to dropdown and add support footer

* Add service provider

* fix minor $ bug and stop timer on order complete

* better load UX and dropdown UX

* fixed single test

* currRate prop bugs and reduce LS bloat

* takeEvery on timer saga and don't clear state.options to restartSwap reducer

* export tx sagas and fix minor type

* Add ShapeShift Rates functionality when selecting a ShapeShift pair.

* type fixes

* BugFix: Don't change displayed ShapeShift Rate Inputs on every dropdown change
Also contains some caching / performance improvements

* BugFix: Don't remote rate inputs when falsy amount

* fix type error

* Progress commit

* Implement saga logic

* Make address field factory component

* Shorten debounce time

* Make new actions / sagas  for handling single token lookup

* Implement working version of litesend

* Change saga into selector

* Add failing spec

* fix broken test

* add debounce to error message

* fix tests

* update snapshots

* test coverage

* move setState disabled property from debounce so we instantly can go to next step on valid amounts

* much deeper test coverage, fix debounce ux, and fix bity flashing at swap page load

* fix minor failing test

* seperate shapeshift erc20 token whitelist

* fix saveState store bug

* break orderTimeRemaining saga up and rewrite tests

* add new swap icon

* remove unused allowReadOnly prop

* change offlineaware to walletdecrypt for litesend

* fix LiteSend changewallet bug

* fix error message UX

* fix button styling to match develop

* fix liteSend test

* Fix LiteSend UX on unavl tokens, dropdown null value, and don't show decrypt in litesend after successful wallet decrypt.

* add litesend network check
2018-01-02 12:04:50 -06:00
William O'Beirne 2f98555b00 Fix deterministic modal token values (#708)
* Fix borked deterministic wallet saga for token values.

* Fix test.
2018-01-02 11:49:18 -06:00
William O'Beirne d1b8f4b65a Ledger warning (#709)
* Ledger HTTPS warning.

* Missed colon.
2018-01-02 00:45:21 -06:00
Eddie Wang 3733adfd84 Add "404" Page (#705)
* add error page

* address PR comments
2018-01-01 18:37:41 -06:00
James Prado 8452e231d8 Fix Help Nav isActive Condition (#694)
* Update tab isActive Condition

Add condition to fix help tab appearing as active at `localhost:3000/`

* Shorten long variables

* Type nav tab links, clarify conditions.
2018-01-01 14:43:27 -06:00