Merge branch 'ref/design' of https://github.com/bitpay/bitpay-wallet into feature/external_link_open_system_browser

# Conflicts:
#	www/views/glidera.html
This commit is contained in:
Jamal Jackson 2016-10-12 08:59:04 -04:00
commit 7becb504f4
59 changed files with 500 additions and 28777 deletions

View File

@ -13,12 +13,12 @@
"gitHubRepoName": "bitpay-wallet",
"disclaimerUrl": "",
"url": "https://bitpay.com",
"appDescription": "Secure Bitcoin Storage",
"appDescription": "Secure Bitcoin Wallet",
"winAppName": "BitPayWallet",
"wpPublisherId": "{}",
"wpProductId": "{}",
"pushSenderId": "1036948132229",
"description": "Secure Bitcoin Storage",
"description": "Secure Bitcoin Wallet",
"version": "0.14.0",
"androidVersion": "1",
"_extraCSS": null,

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 556 KiB

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 590 KiB

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

View File

@ -116,7 +116,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
};
popupService.showPrompt(null, message, opts, function(res) {
if (res) $scope.description = res;
if (typeof res != 'undefined') $scope.description = res;
$timeout(function() {
$scope.$apply();
}, 100);

View File

@ -18,10 +18,20 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi
$scope.color = $scope.wallet.color;
$scope.data = {};
$scope.hasClick = platformInfo.hasClick;
$scope.displayAmount = getDisplayAmount(tx.amountStr);
$scope.displayUnit = getDisplayUnit(tx.amountStr);
initActionList();
checkPaypro();
}
function getDisplayAmount(amountStr) {
return amountStr.split(' ')[0];
}
function getDisplayUnit(amountStr) {
return amountStr.split(' ')[1];
}
function initActionList() {
$scope.actionList = [];

View File

@ -3,8 +3,8 @@
angular.module('copayApp.controllers').controller('backupWarningController', function($scope, $state, $timeout, $stateParams, $ionicModal) {
$scope.walletId = $stateParams.walletId;
$scope.fromState = $stateParams.from;
$scope.toState = $scope.fromState + ".backup";
$scope.fromState = $stateParams.from == 'onboarding' ? $stateParams.from + '.backupRequest' : $stateParams.from;
$scope.toState = $stateParams.from + '.backup';
$scope.openPopup = function() {
$ionicModal.fromTemplateUrl('views/includes/screenshotWarningModal.html', {

View File

@ -173,6 +173,9 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.hideHomeTip = function() {
storageService.setHomeTipAccepted(false, function(error, value) {
$scope.homeTip = false;
$timeout(function() {
$scope.$apply();
})
});
};

View File

@ -6,6 +6,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
var CONTACTS_SHOW_LIMIT;
var currentContactsPage;
var updateList = function() {
CONTACTS_SHOW_LIMIT = 10;
currentContactsPage = 0;
@ -103,11 +104,56 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
});
};
var updateHasFunds = function() {
$scope.hasFunds = null;
var wallets = profileService.getWallets({
onlyComplete: true,
});
if (!wallets || !wallets.length) {
$scope.hasFunds = false;
}
var index = 0;
lodash.each(wallets, function(w) {
walletService.getStatus(w, {}, function(err, status) {
++index;
if (err || !status) {
$log.error(err);
return;
}
if (status.availableBalanceSat) {
$scope.hasFunds = true;
}
if (index == wallets.length) {
$scope.hasFunds = $scope.hasFunds || false;
}
});
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.formData = {
search: null
};
updateList();
updateHasFunds();
});
// This could probably be enhanced refactoring the routes abstract states
$scope.createWallet = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.add.create-personal');
});
};
$scope.buyBitcoin = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.buyandsell.glidera');
});
};
});

View File

@ -38,6 +38,9 @@ $button-secondary-active-border: transparent;
&.button-secondary {
&.button-standard {
@extend %button-standard;
& + .button-standard {
margin-top: 1rem;
}
}
}
}

View File

@ -14,6 +14,19 @@
padding-left: 74px;
}
.icon-svg {
display: flex;
justify-content: center;
align-items: center;
> img {
background-repeat:no-repeat;
background-clip: padding-box;
background-size: contain;
height: 18px;
}
}
.big-icon-svg {
padding: 0 7px;
> .bg {

View File

@ -27,3 +27,14 @@ ion-tabs.ion-tabs-transparent {
}
}
}
// .placeholder-icon padding cannot be modified by a variable
$placeholder-icon-padding: 10px;
.placeholder-icon {
&:first-child {
padding-right: $placeholder-icon-padding;
}
&:last-child {
padding-left: $placeholder-icon-padding;
}
}

View File

@ -1,3 +0,0 @@
#backup-confirm-modal{
}

View File

@ -0,0 +1,12 @@
#backup-needed-modal{
.button.button-secondary {
font-size: 14px;
margin-top: 0;
}
.button {
display: block;
margin-right: auto;
margin-left: auto;
margin-top: 1rem;
}
}

View File

@ -73,5 +73,5 @@
background: rgba(0, 0, 0, .8);
}
@import "backup-confirm-modal";
@import "backup-needed-modal";
@import "screenshot-warning-model";

View File

@ -1,42 +1,97 @@
#txp-details{
#txp-details {
$item-lateral-padding: 20px;
$item-vertical-padding: 10px;
$item-border-color: #EFEFEF;
$item-label-color: #6C6C6E;
.list {
background: #f5f5f5;
}
.slide-to-pay {
bottom: 100px;
}
.head {
padding-bottom: 30px;
.sending-label{
line-height: 70px;
font-size: 25px;
i {
margin-left: 20px;
}
span {
margin-left: 15px;
padding: 30px $item-lateral-padding 4rem;
border-top: 0;
.sending-label {
display: flex;
font-size: 18px;
align-items: center;
margin-bottom: 1.5rem;
img {
margin-right: 1rem;
}
}
.amount-label{
margin-left: 20px;
line-height: 30px;
.amount{
font-size: 36px;
font-size: 38px;
margin-bottom: .5rem;
> .unit {
font-family: "Roboto-Light";
}
}
.alternative{
font-size: 18px;
font-weight: 200;
color: grey;
.alternative {
font-size: 16px;
font-family: "Roboto-Light";
color: #9B9B9B;
}
}
}
.info{
.item {
border-color: $item-border-color;
}
.info {
span {
display: block;
}
.item {
color: #4A4A4A;
padding: $item-vertical-padding $item-lateral-padding;
.label {
font-size: 14px;
color: $item-label-color;
margin-bottom: 8px;
}
&.single-line {
display: flex;
align-items: center;
padding: 17px $item-lateral-padding;
.label {
margin: 0;
flex-grow: 1;
}
}
}
.item-divider {
padding-top: 1.2rem;
color: $item-label-color;
font-size: 15px;
}
.payment-proposal-to {
width: 100%;
display: inline-block;
padding: 5px 15px;
background-color: #f5f5f5;
padding: 8px 13px;
background-color: rgba(203, 203, 203, .13);
margin-top: 10px;
margin-bottom: 5px;
display: flex;
align-items: center;
border-radius: 4px;
img {
padding: .2rem;
padding-left: 0;
border-right: 1px solid #e4e4e4;
padding-right: 12px;
}
i {
color: grey;
position: inherit;
@ -49,18 +104,115 @@
}
contact {
margin-left: 15px;
margin-bottom: 3px;
margin-top: 5px;
font-size: 14px;
display: inline-block;
}
}
.wallet {
display: flex;
align-items: center;
padding: .2rem 0;
i {
padding: 0;
}
img {
height: 24px;
width: 24px;
padding: 2px;
margin-right: .7rem;
box-shadow: none;
}
}
.timeline-item {
border: 0;
&:nth-child(2) {
border-top: 1px solid $item-border-color;
}
&:last-child {
border-bottom: 1px solid $item-border-color;
}
padding: 17px $item-lateral-padding;
> * {
padding-right: 0;
}
}
.timeline-content {
display: flex;
align-items: center;
&__icon {
display: flex;
align-items: center;
min-width: 40px;
padding-right: 1rem;
padding-left: 1rem;
margin-right: .5rem;
position: relative;
&::before {
content: '';
background: #e8e8e8;
height: 100px;
width: 1px;
position: absolute;
left: 50%;
transform: translateX(-50%) translateY(-100%);
top: 0;
}
&::after {
content: '';
background: #e8e8e8;
height: 100px;
width: 1px;
position: absolute;
left: 50%;
transform: translateX(-50%) translateY(100%);
bottom: 0;
}
> div {
border: 3px solid #09C286;
border-radius: 50%;
display: flex;
height: 26px;
width: 26px;
font-size: 13px;
align-items: center;
justify-content: center;
font-weight: 600;
vertical-align: middle;
color: #09C286;
&.rejected {
background: #E15061;
border-color: #E15061;
color: #FFFFFF;
font-family: "Roboto-Bold";
font-size: 19px;
}
}
}
&__label {
flex-grow: 1;
> .action {
font-size: 16px;
}
> .name {
color: #aaa;
font-size: 14px;
}
}
}
}
.accept-slide {
position: fixed;
bottom: 0;
width: 100%;
height: 100px;
background-color: #f5f5f5;
.proposal-deletion-help {
color: $item-label-color;
padding: 1rem 2rem;
}
}

View File

@ -32,9 +32,6 @@
font-size: .8rem;
i {
font-size: 1.3rem;
&.ion-social-bitcoin-outline {
border-right: 1px solid rgb(228, 228, 228);
}
}
}
.bit-address {
@ -111,6 +108,10 @@
margin-bottom:1rem;
}
}
.receive-tab-bitcoin-icon {
border-right: 1px solid rgb(228, 228, 228);
padding-right: 10px;
}
}
@keyframes fadeIn {

View File

@ -7,51 +7,13 @@ $scannerBackgroundColor: #060d2d;
.bar-header {
opacity: .9;
}
.zero-state-cta {
padding-bottom: 6vh;
}
&-has-problems,
&-loading-camera {
background-color: $scannerBackgroundColor;
}
&-has-problems {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.zero-state {
&-icon {
display: inline-block;
width: 50px;
height: 50px;
border-radius: 50%;
padding: 13px;
box-shadow: $subtle-box-shadow;
background-color: #fff;
}
&-heading {
font-size: 20px;
margin: 1rem;
}
&-description {
margin: 0 2rem 120px;
opacity: .6;
max-width: 300px;
}
&-tldr {
margin: 1rem auto;
}
&-description,
&-tldr {
max-width: 300px;
}
&-cta {
position: absolute;
bottom: 0;
width: 100%;
padding-bottom: 6vh;
}
}
}
&-loading-camera {
height: 100%;
width: 100%

View File

@ -1,5 +1,15 @@
#tab-send {
.zero-state-cta {
padding-bottom: 3vh;
}
.send-heading {
font-size: 14px;
font-weight: bold;
padding-bottom: 0;
}
.bitcoin-address {
border-top: none;
padding-bottom: .5rem;
@media(max-width: 480px) {
input {
font-size: 12px;

View File

@ -15,6 +15,7 @@
@import "address-book";
@import "wallet-backup-phrase";
@import "address-book";
@import "zero-state";
@import "onboarding/onboarding";
@import "includes/walletActivity";
@import "includes/wallets";

View File

@ -0,0 +1,45 @@
.zero-state {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
&-icon {
display: inline-block;
width: 50px;
height: 50px;
border-radius: 50%;
padding: 13px;
box-shadow: $subtle-box-shadow;
background-color: #fff;
img {
height: 100%;
width: 100%;
}
}
&-heading {
font-size: 20px;
margin: 1rem;
}
&-description {
margin-top: 0;
margin-left: 2rem;
margin-right: 2rem;
margin-bottom: 120px;
opacity: .6;
max-width: 300px;
}
&-tldr {
margin: 1rem auto;
}
&-description,
&-tldr {
max-width: 300px;
}
&-cta {
position: absolute;
bottom: 0;
width: 100%;
}
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
<title>Bitcoin_Symbol</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.8">
<g id="Address-(Bitcoin)" transform="translate(-11.000000, -12.000000)" fill="#5D5D5D">
<g id="Items/Bitcoin-Address">
<g id="Items/Bitcoin-Address-Copy">
<path d="M19.6342548,15.1610219 L20.1628282,12.9767055 L18.8173687,12.6561808 L18.3048127,14.7930121 C17.9484261,14.7099131 17.5880351,14.6268141 17.2316485,14.5555864 L17.7442045,12.4187551 L16.3827276,12.0982304 L15.8541542,14.2825468 C15.5658415,14.2152762 15.2735244,14.163834 14.9852116,14.0965634 L13.1312004,13.6573258 L12.7908312,15.0700087 C12.7908312,15.0700087 13.7959215,15.2876489 13.7598824,15.3074344 C14.3044732,15.4419756 14.4085861,15.7941571 14.3885644,16.0632396 L13.7919172,18.5522523 C13.8279562,18.5680807 13.8760084,18.5680807 13.9280648,18.6036945 C13.8760084,18.5878661 13.8439736,18.5878661 13.7919172,18.5720378 L12.975031,22.0542813 C12.9069572,22.2204793 12.7347704,22.457905 12.3623664,22.374806 C12.3783838,22.3906344 11.3732935,22.1373803 11.3732935,22.1373803 L10.7366028,23.6687761 L12.4905054,24.0723998 C12.8148572,24.1554988 13.1392091,24.2227694 13.4435392,24.3098255 L12.9149658,26.5139274 L14.2604254,26.8344521 L14.7889988,24.6501356 C15.1654071,24.749063 15.5217937,24.8361191 15.8621629,24.9192181 L15.3335895,27.0877061 L16.6790491,27.4082308 L17.2076225,25.2041289 C19.5061158,25.6077526 21.2239794,25.4217691 21.9207352,23.3522085 C22.4813433,21.7020999 21.8686787,20.7603113 20.6433495,20.1390474 C21.5403225,19.9372355 22.1890262,19.3634568 22.3572087,18.1881996 C22.5774476,16.5737048 21.336101,15.7308436 19.6342548,15.1610219 Z M19.3299247,22.4737334 C18.937499,24.123842 16.1144366,23.2651524 15.2094549,23.0475122 L15.9062107,20.1192619 C16.8272098,20.3408592 19.7383678,20.7444829 19.3299247,22.4737334 L19.3299247,22.4737334 Z M19.7023287,18.1881996 C19.3459421,19.6839814 16.9953922,18.9637902 16.2305626,18.7778067 L16.8792663,16.122596 C17.6280786,16.3046223 20.078737,16.625147 19.7023287,18.1881996 L19.7023287,18.1881996 Z" id="Bitcoin_Symbol" transform="translate(16.559574, 19.753231) rotate(-13.000000) translate(-16.559574, -19.753231) "></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Bitcoin_Symbol" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 12 16" style="enable-background:new 0 0 12 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:#5D5D5D;}
</style>
<path class="st0" d="M7.4,2.5l0-2.4L6,0.2l0,2.3c-0.4,0-0.8,0-1.2,0l0-2.3l-1.5,0l0,2.4c-0.3,0-0.6,0-0.9,0l-2,0l0,1.5
c0,0,1.1,0,1,0c0.6,0,0.8,0.3,0.8,0.6l0,6.5c0,0.2-0.2,0.5-0.6,0.5c0,0-1.1,0-1.1,0l-0.3,1.7l1.9,0c0.4,0,0.7,0,1,0l0,2.4l1.5,0
l0-2.4c0.4,0,0.8,0,1.2,0l0,2.3l1.5,0l0-2.4c2.5-0.1,4.2-0.7,4.4-3c0.2-1.8-0.7-2.6-2.1-3C10.5,7,11,6.2,10.9,5
C10.7,3.3,9.3,2.7,7.4,2.5z M8.8,10.1c0,1.8-3.1,1.6-4.1,1.6l0-3.2C5.7,8.5,8.8,8.2,8.8,10.1L8.8,10.1z M8.2,5.6
c0,1.6-2.6,1.4-3.4,1.4l0-2.9C5.6,4.2,8.2,3.9,8.2,5.6L8.2,5.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 939 B

19
www/img/sending-icon.svg Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="34px" height="34px" viewBox="0 0 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
<title>Received</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Icons/Transaction/Send" transform="translate(-7.000000, -8.000000)">
<g id="Icons/Send">
<g id="icons/received">
<g id="Received" transform="translate(24.244258, 24.883990) scale(-1, 1) rotate(-45.000000) translate(-24.244258, -24.883990) translate(7.244258, 7.883990)">
<path d="M17.3272285,33.991292 C26.4399269,33.991292 33.8272285,26.6039904 33.8272285,17.491292 C33.8272285,8.37859367 26.4399269,0.991292046 17.3272285,0.991292046 C8.21453012,0.991292046 0.82722849,8.37859367 0.82722849,17.491292 C0.82722849,26.6039904 8.21453012,33.991292 17.3272285,33.991292 Z" id="Oval-204" fill="#F2F2F2" opacity="0.8"></path>
<path d="M9.08046771,17.7310374 L25.550467,17.7310374 M15.140197,25.2788677 L7.74513693,17.8384337 L14.8830819,10.5152146" id="Line" stroke="#BEBEBE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" transform="translate(16.647802, 17.897041) scale(1, -1) rotate(-135.000000) translate(-16.647802, -17.897041) "></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -29,7 +29,7 @@
<span class="input-label" translate>Email</span>
<input type="text"
id="email"
placeholder="name@example.com"
placeholder="name@example.com"
name="email"
ng-model="addressbookEntry.email">
</label>
@ -54,7 +54,7 @@
<div class="padding">
<button type="submit"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-click="add(addressbookEntry)"
ng-disabled="!addressbookForm.$valid" translate>
Save

View File

@ -52,9 +52,7 @@
You havent added any contacts to your address book yet. Get started by adding your first one.
</p>
</div>
<div class="row">
<button class="button button-block button-positive col" ui-sref="tabs.addressbook.add" translate>Add Contact</button>
</div>
<button class="button button-standard button-primary" ui-sref="tabs.addressbook.add" translate>Add Contact</button>
</div>
</div>
</ion-content>

View File

@ -28,7 +28,7 @@
</div>
</div>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
ng-click="sendTo()" translate>
Send Money
</button>

View File

@ -18,7 +18,7 @@
<div ng-if="!giftCards" class="m20t padding text-center">
<button class="button button-block button-positive" ui-sref="tabs.giftcards.amazon.buy">
<button class="button button-standard button-primary" ui-sref="tabs.giftcards.amazon.buy">
Buy now
</button>

View File

@ -64,7 +64,7 @@
<div class="input-label" translate>In order to verify your wallet backup, please type your password.</div>
<input type="text" id="passphrase" ng-model="data.passphrase" autocapitalize="off" spellcheck="false" autofocus/>
</label>
<button ng-disabled="!data.passphrase" class="button button-block button-positive" ng-click="goToStep(4);" translate>Confirm
<button ng-disabled="!data.passphrase" class="button button-standard button-primary" ng-click="goToStep(4);" translate>Confirm
</button>
</div>
</div>

View File

@ -53,7 +53,7 @@
<wallets ng-if="wallets[0]" wallets="wallets"></wallets>
<div class="padding">
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
ng-disabled="!formData.fiat"
type="submit">
Buy now
@ -79,7 +79,7 @@
<span ng-show="buy.giftCard.status == 'FAILURE'">
This failure could not be recoverable. Request your refund from your list of cards
</span>
<button class="button button-block button-positive" ng-click="$root.go('amazon')">
<button class="button button-standard button-primary" ng-click="$root.go('amazon')">
Back
</button>
</div>

View File

@ -80,7 +80,7 @@
...
</div>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
type="submit"
ng-disabled="limits.transactDisabledPendingFirstTransaction || !buy.buyPrice.qty || buy.loading">
Continue
@ -101,7 +101,7 @@
<input type="number" ng-model="twoFaCode" placeholder="2FA Code" required ignore-mouse-wheel>
</label>
</div>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
type="submit" ng-disabled="buyForm.$invalid || buy.loading">
Buy
</button>
@ -117,7 +117,7 @@
A transfer has been initiated from your bank account. Your bitcoins should arrive to your wallet in 2-4 business days.
</p>
<button class="button button-block button-positive" ui-sref="tabs.buyandsell.glidera">OK</button>
<button class="button button-standard button-primary" ui-sref="tabs.buyandsell.glidera">OK</button>
</div>
</ion-content>
</ion-view>

View File

@ -29,7 +29,7 @@
<div ng-show="secret">
<div class="text-center m10t" ng-if="isCordova">
<button class="button button-outline button-positive"
<button class="button button-outline button-primary"
ng-click="shareSecret()">
<i class="icon ion-ios-upload-outline"></i>
<span translate>Share invitation</span>

View File

@ -35,7 +35,6 @@
</p>
<p class="m20t text-gray size-12">Connect your Glidera account to get started</p>
<button class="button button-block button-positive"
ng-click="openExternalLink(glidera.getAuthenticateUrl(), 'Glidera authentication'); showOauthForm = true">
Connect to Glidera
@ -65,7 +64,7 @@
</div>
<div class="col">
<input
class="button button-block button-positive"
class="button button-standard button-primary"
type="submit"
value="Get started"
ng-disabled="oauthCodeForm.$invalid">

View File

@ -3,25 +3,11 @@
<div class="popup-modal-header-img-warning popup-modal-header-img"></div>
</div>
<div class="popup-modal-content popup-modal-content-warning">
<div class="text-center">
<h5 translate>Backup Needed</h5>
<p translate>Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup.</p>
<div class="row">
<div class="col">
<button
class="button button-clear expand"
ng-click="close()"
translate>Not now
</button>
</div>
<div class="col">
<button
class="button button-clear expand"
ng-click="doBackup()"
translate>Backup wallet now
</button>
</div>
</div>
<div>
<div class="popup-modal-heading" translate>Backup Needed</div>
<div class="popup-modal-message" translate>Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup.</div>
<button class="button button-clear" ng-click="doBackup()" translate>Backup now</button>
<button class="button button-secondary button-clear" ng-click="close()" translate>Remind me later</button>
</div>
</div>
</div>

View File

@ -1,4 +1,4 @@
<button class="button button-block button-positive" ng-disabled="sendStatus">
<button class="button button-standard button-primary" ng-disabled="sendStatus">
<span ng-if="!sendStatus">
<ng-transclude></ng-transclude>
</span>

View File

@ -122,7 +122,7 @@
</div> <!-- advanced -->
</div> <!-- list -->
<button type="submit" class="button button-block button-positive"
<button type="submit" class="button button-standard button-primary"
ng-disabled="joinForm.$invalid || ((encrypt && !passwordSaved) || encrypt && ((join.seedSourceId == 'new' && !createPassphrase) || (join.seedSourceId == 'set' && !passphrase)))"
translate>Join
</button>

View File

@ -56,7 +56,7 @@
<div class="list">
<div class="item item-icon-left" ng-show="btx.action == 'sent'">
<i class="icon ion-social-bitcoin-outline"></i>
<i class="icon icon-svg"><img src="img/icon-bitcoin-symbol.svg"></i>
<div ng-if="!btx.hasMultiplesOutputs && btx.addressTo && btx.addressTo != 'N/A'" copy-to-clipboard="btx.addressTo">
<span ng-if="btx.merchant">
<span ng-show="btx.merchant.pr.ca"><i class="fi-lock color-greeni"></i> {{btx.merchant.domain}}</span>
@ -90,7 +90,7 @@
</div>
</div>
<div class="item" ng-if="btx.action != 'received' && btx.feeLevel" copy-to-clipboard="btx.feeStr">
<div class="item" ng-if="btx.action != 'received' && btx.feeStr" copy-to-clipboard="btx.feeStr">
{{'Fee'|translate}}: {{btx.feeStr}}
<span class="item-note">
<span class="text-warning" ng-show="!btx.confirmations || btx.confirmations == 0" translate>
@ -102,7 +102,7 @@
<span class="label gray radius" ng-show="btx.safeConfirmed">
{{btx.safeConfirmed}}
</span>
<span translate>Confirmations</span>
<span ng-show="btx.confirmations && btx.confirmations > 0" translate>Confirmations</span>
</span>
</div>

View File

@ -1,5 +1,5 @@
<ion-modal-view id="txp-details" ng-controller="txpDetailsController" ng-init="init()">
<ion-header-bar align-title="center" class="bar-royal" ng-style="{'background-color': wallet.color}">
<ion-header-bar align-title="center" class="bar-royal">
<button class="button button-clear" ng-click="close()">
Close
</button>
@ -11,15 +11,15 @@
</button>
</ion-header-bar>
<ion-content ng-init="updateCopayerList()" ng-class="{'slide-to-pay': tx.pendingForUs && canSign && isCordova}">
<ion-content ng-init="updateCopayerList()" ng-class="{'slide-to-pay': tx.pendingForUs && canSign && !hasClick}">
<div class="list">
<div class="item head">
<div class="sending-label">
<i class="icon ion-arrow-up-c"></i>
<img src="img/sending-icon.svg">
<span translate>Sending</span>
</div>
<div class="amount-label">
<div class="amount">{{tx.amountStr}}</div>
<div class="amount">{{displayAmount}} <span class="unit">{{displayUnit}}</span></div>
<div class="alternative" ng-show="tx.alternativeAmountStr">{{tx.alternativeAmountStr}}</div>
</div>
@ -50,9 +50,9 @@
<div class="info">
<div class="item">
<span translate>To</span>
<span class="label" translate>To</span>
<span class="payment-proposal-to" copy-to-clipboard="tx.toAddress">
<i class="icon ion-social-bitcoin"></i>
<img src="img/icon-bitcoin-small.svg">
<contact ng-if="!tx.hasMultiplesOutputs" class="ellipsis" address="{{tx.toAddress}}"></contact>
<span ng-if="tx.hasMultiplesOutputs" translate>Multiple recipients</span>
</span>
@ -71,18 +71,18 @@
</div>
<div class="item">
{{'From'|translate}}
<span class="item-note">
<i class="icon big-icon-svg right">
<span class="label" translate>From</span>
<div class="wallet">
<i class="icon big-icon-svg">
<img src="img/icon-wallet.svg" ng-style="{'background-color': wallet.color}" class="bg"/>
</i>
<div class="m10t m55r">{{wallet.name}}</div>
</span>
<div>{{wallet.name}}</div>
</div>
</div>
<div class="item">
{{'Created by'|translate}}
<div class="item single-line">
<span class="label" translate>Created by</span>
<span class="item-note">
{{tx.creatorName}} <time>{{ (tx.ts || tx.createdOn ) * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}}</time>
{{tx.creatorName}} <time>{{ (tx.ts || tx.createdOn ) * 1000 | amDateFormat:'MM/DD/YYYY hh:mm a'}}</time>
</span>
</div>
<div class="item" ng-show="tx.message">
@ -91,8 +91,8 @@
{{tx.message}}
</span>
</div>
<div class="item">
{{'Fee'|translate}}
<div class="item single-line">
<span class="label" translate>Fee</span>
<span class="item-note">
{{tx.feeStr}}
</span>
@ -129,20 +129,20 @@
</div>
<div ng-if="actionList[0]">
<div class="item item-divider" translate>Timeline</div>
<div class="item" ng-class="{'action-created' : a.type == 'created' || a.type == 'accept', 'action-rejected' : a.type == 'reject'}" ng-repeat="a in actionList track by $index">
<div class="row">
<div class="col col-10">
<span id="timeline-icon">{{$index + 1}}</span>
<div class="item timeline-item" ng-class="{'action-created' : a.type == 'created' || a.type == 'accept', 'action-rejected' : a.type == 'reject'}" ng-repeat="a in actionList | orderBy: 'time' track by $index">
<div class="timeline-content">
<div class="timeline-content__icon">
<div class="rejected" ng-if="a.type === 'reject'">!</div>
<div ng-if="a.type !== 'reject'">{{$index + 1}}</div>
</div>
<div class="col">
<div>{{a.description}}</div>
<div>
<span>{{a.by}}</span>
<span class="item-note">
<time>{{ a.time * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}}</time>
</span>
</div>
<div class="timeline-content__label">
<div class="action">{{a.description}}</div>
<div class="name">{{a.by}}</div>
</div>
<div>
<span class="item-note">
<time>{{ a.time * 1000 | amDateFormat:'hh:mm a'}}</time>
</span>
</div>
</div>
</div>
@ -157,7 +157,7 @@
Click to accept
</click-to-accept>
<div class="m30t text-center" ng-if="tx.canBeRemoved || (tx.status == 'accepted' && !tx.broadcastedOn)">
<div class="size-12 padding" ng-show="!tx.isGlidera && isShared" translate>
<div class="size-12 padding proposal-deletion-help" ng-show="!tx.isGlidera && isShared" translate>
* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created.
</div>
<button class="button button-assertive button-clear" ng-click="remove()" ng-disabled="loading">

View File

@ -58,7 +58,7 @@
<button type="submit"
ng-disabled="scanning || !scannedKey"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-style="{'background-color': wallet.color}"
translate>Scan Wallet Funds
</button>
@ -74,7 +74,7 @@
<button
ng-show="balanceSat > 0"
ng-disabled="sending"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-style="{'background-color': wallet.color}"
ng-click="sweepWallet()"
translate>Sweep Wallet
@ -82,7 +82,7 @@
<button
ng-show="balanceSat <= 0 && scanned"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-style="{'background-color': wallet.color}"
ng-click="init()"
translate>Scan Again

View File

@ -15,7 +15,7 @@
</label>
</div>
<button type="submit"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-disabled="aliasForm.$invalid" translate>
Save
</button>

View File

@ -15,6 +15,6 @@
</a>
</label>
</div>
<button class="button button-block button-positive" ng-click="save()" translate>Save</button>
<button class="button button-standard button-primary" ng-click="save()" translate>Save</button>
</ion-content>
</ion-view>

View File

@ -15,7 +15,7 @@
</label>
</div>
<button type="submit"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-disabled="emailForm.$invalid" translate>
Save
</button>

View File

@ -98,10 +98,10 @@
<div class="padding text-center" translate>
Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time.
</div>
<button class="button button-block button-positive" ng-click="scan()" translate>
<button class="button button-standard button-primary" ng-click="scan()" translate>
Scan addresses for funds
</button>
<button class="button button-block button-positive" ng-show="isCordova" ng-click="sendAddrs()" translate>
<button class="button button-standard button-primary" ng-show="isCordova" ng-click="sendAddrs()" translate>
Send addresses by email
</button>
</div>

View File

@ -5,11 +5,11 @@
</ion-nav-back-button>
</ion-nav-bar>
<ion-content>
<button class="button button-block button-positive" copy-to-clipboard="prepare()">
<button class="button button-standard button-primary" style="margin-top: 1rem" copy-to-clipboard="prepare()">
<i class="icon ion-clipboard"></i>
<span translate>Copy to clipboard</span>
</button>
<button class="button button-block button-positive" ng-show="isCordova" ng-click="sendLogs()">
<button class="button button-standard button-secondary" ng-show="isCordova" ng-click="sendLogs()">
<i class="icon ion-ios-email-outline"></i>
<span translate>Send by email</span>
</button>

View File

@ -80,7 +80,7 @@
...
</div>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
type="submit"
ng-disabled="limits.transactDisabledPendingFirstTransaction || !sell.sellPrice.qty">
Continue
@ -101,7 +101,7 @@
<input type="number" ng-model="twoFaCode" placeholder="2FA Code" required ignore-mouse-wheel>
</label>
</div>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
type="submit"
ng-disabled="sellForm.$invalid ">
Sell
@ -118,7 +118,7 @@
A transfer has been initiated to your bank account and should arrive in 4-6 business days.
</p>
<button class="button button-block button-positive" ui-sref="tabs.buyandsell.glidera">OK</button>
<button class="button button-standard button-primary" ui-sref="tabs.buyandsell.glidera">OK</button>
</div>
</ion-content>
</ion-view>

View File

@ -98,11 +98,10 @@
</div> <!-- advanced -->
</div> <!-- list -->
<button type="submit" class="button button-block button-positive"
<button type="submit" class="button button-standard button-primary"
ng-disabled="setupForm.$invalid || ((encrypt && !formData.passwordSaved) || encrypt && ((seedSource.id == 'new' && !formData.createPassphrase) || (seedSource.id == 'set' && !formData.passphrase)))">
<span translate>Create new wallet</span>
</button>
</form>
</ion-content>
</ion-view>

View File

@ -128,12 +128,10 @@
</div> <!-- advanced -->
</div> <!-- list -->
<button type="submit" class="button button-block button-positive"
<button type="submit" class="button button-standard button-primary"
ng-disabled="setupForm.$invalid || ((encrypt && !formData.passwordSaved) || encrypt && ((seedSource.id == 'new' && !formData.createPassphrase) || (seedSource.id == 'set' && !formData.passphrase)))">
<span translate>Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet</span>
</button>
</form>
</ion-content>
</ion-view>

View File

@ -49,7 +49,7 @@
<button
ng-click="downloadWalletBackup()"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-show="!isSafari && !isCordova">
@ -59,7 +59,7 @@
<button
ng-click="viewWalletBackup()"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-show="isSafari && !isCordova">
@ -69,13 +69,13 @@
<div ng-show="isCordova">
<h4 translate>Export options</h4>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-click="copyWalletBackup()">
<i class="fi-clipboard-pencil"></i>
<span translate>Copy to clipboard</span></button>
<button class="button button-block button-positive" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
<button class="button button-standard button-primary" ng-disabled="(!formData.password || formData.password != formData.repeatpassword)"
ng-style="{'background-color':wallet.color}"
ng-click="sendWalletBackup()"><i class="fi-mail"></i>
<span translate>Send by email</span></button>

View File

@ -34,7 +34,7 @@
</div>
</div>
<button type="submit" class="button button-block button-positive" ng-disabled="importForm.$invalid || !formData.password" translate>
<button type="submit" class="button button-standard button-primary" ng-disabled="importForm.$invalid || !formData.password" translate>
Import backup
</button>
</form>

View File

@ -37,7 +37,7 @@
</div>
</div>
<button translate type="submit" class="button button-block button-positive">
<button translate type="submit" class="button button-standard button-primary">
Import
</button>
</div> <!-- seedoptions show -->

View File

@ -60,7 +60,7 @@
</div>
<button type="submit"
class="button button-block button-positive"
class="button button-standard button-primary"
ng-disabled="importForm12.$invalid" translate>Import
</button>
</form>

View File

@ -1,11 +1,6 @@
<ion-view id="tab-receive">
<ion-nav-bar class="bar-royal">
<ion-nav-title>{{'Receive' | translate}}</ion-nav-title>
<ion-nav-buttons side="secondary">
<button class="button button-clear" ng-click="checkTips(true)">
<i class="ion-help-circled"></i>
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content>
<div class="list card padding text-center" ng-if="!wallets[0]">
@ -23,7 +18,7 @@
<div class="row border-top">
<div class="col col-90 center-block bit-address text-center">
<div class="item item-icon-left">
<i class="icon ion-social-bitcoin-outline"></i>
<i class="icon icon-svg receive-tab-bitcoin-icon"><img src="img/icon-bitcoin-symbol.svg"></i>
<span class="bit-address-gen-address">...</span>
</div>
</div>
@ -38,13 +33,13 @@
<span translate>All signing devices must be added to this multisig wallet before bitcoin addresses can be created.</span>
</div>
<div>
<button class="button button-block button-positive" ng-click="goCopayers()" translate>Open wallet</button>
<button class="button button-standard button-primary" ng-click="goCopayers()" translate>Open wallet</button>
</div>
</div>
<div class="row border-top">
<div class="col col-90 center-block bit-address text-center">
<div class="item item-icon-left">
<i class="icon ion-social-bitcoin-outline"></i>
<i class="icon icon-svg receive-tab-bitcoin-icon"><img src="img/icon-bitcoin-symbol.svg"></i>
<span class="bit-address-gen-address" ng-if="!generatingAddress" translate>address not yet available</span>
</div>
</div>
@ -81,7 +76,7 @@
<div class="row border-top">
<div class="col col-90 center-block bit-address text-center">
<div class="item item-icon-left">
<i class="icon ion-social-bitcoin-outline"></i>
<i class="icon icon-svg receive-tab-bitcoin-icon"><img src="img/icon-bitcoin-symbol.svg"></i>
<span class="bit-address-gen-address" ng-if="generatingAddress">...</span>
<span class="bit-address-gen-address" ng-if="!generatingAddress" copy-to-clipboard="addr">{{addr}}</span>
</div>

View File

@ -8,7 +8,7 @@
</ion-nav-buttons>
</ion-nav-bar>
<ion-content scroll="false">
<div class="ng-hide" id="tab-scan-has-problems" ng-show="currentState === scannerStates.unauthorized || currentState === scannerStates.denied || currentState === scannerStates.unavailable">
<div class="ng-hide zero-state" id="tab-scan-has-problems" ng-show="currentState === scannerStates.unauthorized || currentState === scannerStates.denied || currentState === scannerStates.unavailable">
<i class="icon zero-state-icon">
<img src="img/tab-icons/ico-receive.svg"/>
</i>

View File

@ -2,25 +2,38 @@
<ion-nav-bar class="bar-royal">
<ion-nav-title>{{'Send' | translate}}</ion-nav-title>
</ion-nav-bar>
<ion-content>
<div class="item item-heading" translate>Recipient</div>
<ion-content scroll="false">
<div class="ng-hide zero-state" ng-show="!hasFunds">
<i class="icon zero-state-icon">
<img src="img/tab-icons/ico-send-selected.svg"/>
</i>
<div class="zero-state-heading" translate>Start sending bitcoin</div>
<div class="zero-state-description" ng-show="hasWallets" translate>To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service.</div>
<div class="zero-state-description" ng-show="!hasWallets" translate>To get started, you'll need to create a bitcoin wallet and get some bitcoin.</div>
<div class="zero-state-cta">
<button class="button button-standard button-primary" ng-click="buyBitcoin()" ng-show="hasWallets">Buy Bitcoin</button>
<button class="button button-standard button-primary" ng-click="createWallet()" ng-show="!hasWallets">Create bitcoin wallet</button>
<button class="button button-standard button-secondary" ui-sref="tabs.receive" ng-show="hasWallets">Show bitcoin address</button>
</div>
</div>
</ion-content>
<ion-content class="ng-hide has-funds" ng-show="hasFunds">
<div class="item item-heading send-heading" translate>Recipient</div>
<label class="item item-input bitcoin-address">
<i class="icon ion-social-bitcoin placeholder-icon"></i>
<i class="icon icon-svg placeholder-icon"><img src="img/icon-bitcoin-symbol.svg"></i>
<div class="qr-scan-icon" ng-style="{'width': '100%'}">
<a ui-sref="tabs.scan" ng-style="{'top': '6px'}"><i class="icon ion-qr-scanner"></i></a>
<input type="text"
placeholder="{{'Search or enter bitcoin address' | translate}}"
ng-model="formData.search"
ng-change="findContact(formData.search)"
ng-model-onblur>
<a ui-sref="tabs.scan" ng-style="{'top': '6px'}">
<i class="icon ion-qr-scanner"></i>
</a>
<input type="text" placeholder="{{'Search or enter bitcoin address' | translate}}" ng-model="formData.search" ng-change="findContact(formData.search)" ng-model-onblur>
</div>
</label>
<div class="card">
<div class="item item-icon-right item-heading">
<span translate>Contacts</span>
<a ng-if="hasContacts" ui-sref="tabs.send.addressbook"><i class="icon ion-ios-plus-empty list-add-button"></i></a>
<a ng-if="hasContacts" ui-sref="tabs.send.addressbook">
<i class="icon ion-ios-plus-empty list-add-button"></i>
</a>
</div>
<div class="list">
<a class="item item-icon-left item-icon-right" ng-if="!hasContacts" ui-sref="tabs.send.addressbook">

View File

@ -9,7 +9,7 @@
<div class="card">
<div class="item item-text-wrap" ng-include="'views/includes/terms.html'"></div>
</div>
<button class="button button-block button-positive"
<button class="button button-standard button-primary"
ng-show="lang != 'en'"
ng-click="openExternalLink(disclaimerUrl, 'Bitpay disclaimer')" translate>
Official English Disclaimer