Skip to content

Instantly share code, notes, and snippets.

@francistaberdo
Created January 16, 2017 01:53
Show Gist options
  • Save francistaberdo/9f2a51b32441ddad81d96d86ee04ae6f to your computer and use it in GitHub Desktop.
Save francistaberdo/9f2a51b32441ddad81d96d86ee04ae6f to your computer and use it in GitHub Desktop.
PayPal Card React UI
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<script src="https://use.fontawesome.com/f5ea91e308.js"></script>
<div class="container">
<a href="https://dribbble.com/shots/2336027-Email-Receipt-Day-017-dailyui" target="_blank" class="view-design">View design on <i class="fa fa-dribbble"></i></a>
<div id="app"></div>
<div class="circle"></div>
</div>
//Data
const BreakDownContent = [
{
"text" : "Amount:",
"main" : "$20.00 USD",
"icon" : "fa fa-money"
},
{
"text" : "Date:",
"main" : "Nov 5",
"icon" : "fa fa-calendar"
},
{
"text" : "Issuer:",
"main" : "Dribbble",
"icon" : "fa fa-star-o"
},
{
"text" : "Confirmation No:",
"main" : "878NJDBW8Y9",
"icon" : "fa fa-list-alt"
}
]
// App
class Card extends React.Component {
constructor() {
super();
this.state = {
breakdown : {}
}
}
componentWillMount() {
this.setState({
breakdown: BreakDownContent
});
}
render() {
return <div className="card">
<div className="card-breakdown">
<div className="card-breakdown--header">
<p>Reciept for</p>
<h2>Dribbble</h2>
</div>
<ul className="card-breakdown--list">
{
Object
.keys(this.state.breakdown)
.map(key => <BreakDownEntry key={key} index={key} details={this.state.breakdown[key]}/>)
}
</ul>
</div>
<Overview product="Dribbble Pro Account (1 year)" merchant={'Dribbble'} merchantEmail={'paypal@dribbble.com'} name={'Jamie'} value={'$20.00 USD'} invoiceId={'108165'}/>
</div>
}
}
//@TODO Get state into here
class Breakdown extends React.Component {
render() {
return <div className="card-breakdown">
<div className="card-breakdown--header">
<p>Reciept for</p>
<h2>Dribbble</h2>
</div>
<ul>
{
Object
.keys(this.state.breakdown)
.map(key => <BreakDownEntry key={key} index={key} details={this.state.breakdown[key]}/>)
}
</ul>
</div>
}
}
class BreakDownEntry extends React.Component {
render() {
const { details } = this.props;
return <li>
<span className={details.icon}>
</span>
<div className="list-content">
<p>{details.text}
<span className="list-bold">{details.main}</span>
</p>
</div>
</li>
}
}
class Overview extends React.Component {
render() {
return <div className="card-overview">
<OverviewHeader logo={'https://s3-us-west-2.amazonaws.com/s.cdpn.io/553128/PayPal.svg'}/>
<OverviewBody {...this.props} />
<OverviewFooter {...this.props} />
</div>
}
}
class OverviewHeader extends React.Component {
render() {
return <div className="overview-header">
<img className="logo" src={this.props.logo}/>
<div className="timestamp">
<span>Oct 18, 2015</span>
<span>08:30:57 PDT</span>
</div>
<hr />
</div>
}
}
class PurchaseOverview extends React.Component {
render() {
return <div className="purchase-overview">
<h3>{this.props.product}</h3>
<p>Total: {this.props.value}</p>
</div>
}
}
class OverviewBody extends React.Component {
render() {
return <div className="overview-body">
<PurchaseOverview {...this.props} />
<div className="user-info">
<p className="user-info-name"> Hello {this.props.name},</p>
<p className="user-info-text"> You sent a payment of <span>{this.props.value}</span> to {this.props.merchant}. (<a href="mailto: jamie@halvorson.digital">{this.props.merchantEmail}</a>)</p>
</div>
<div className="descriptor">
<p>It may take a few moments for this transaction to appear in your account</p>
</div>
</div>
}
}
class OverviewFooter extends React.Component {
render() {
return <footer className="overview-footer">
<span className="site">
<a href="https://halvorson.digital/blog" target="_blank">www.paypal.com/help</a>
</span>
<span className="invoice-id">
Invoice ID: {this.props.invoiceId}
</span>
</footer>
}
}
ReactDOM.render(<Card/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.min.js"></script>
/* Design Inspiration: https://dribbble.com/shots/2336027-Email-Receipt-Day-017-dailyui */
$blue : #228af5;
$grey : #6e7882;
@mixin reset-list() {
text-indent: 0;
list-style: none;
padding: 0;
margin: 0;
&:before {
display: none;
content: "";
}
}
body, html {
font-family: 'Roboto', sans-serif;
-webkit-font-smoothing: antialiased;
margin: 0;
}
a {
color: $blue;
text-decoration: none;
}
.view-design {
position:absolute;
top:30px;
left: 30px;
}
.container {
height: 760px;
overflow: hidden;
position:relative;
}
.circle {
display: none;
@media(min-width:768px){
height: 1600px;
width: 1100px;
background-color: $blue;
position: absolute;
top: -400px;
right: -300px;
z-index: -1;
border-radius: 50%;
display:block;
}
}
.app {
}
.card {
display: flex;
flex-wrap: wrap;
margin: 100px auto;
width:830px;
box-shadow: 0px 0px 50px 10px rgba(0,0,0,.1);
vertical-align:top;
}
.card-breakdown {
background-color:$blue;
color:#fff;
width: 220px;
display:inline-block;
position:relative;
float:left;
padding: 40px 30px;
border-radius: 5px 0 0 5px;
.card-breakdown--list {
@include reset-list;
li {
padding: 25px 0;
border-bottom:1px solid rgba(255,255,255,.4);
&:last-of-type {
border-bottom: none;
}
}
.fa {
display: inline-block;
width:15%;
float:left;
}
.list-content {
width: 75%;
display:inline-block;
}
p {
font-weight:300;
font-size: 13px;
margin: 0;
.list-bold {
font-weight:600;
display:block;
font-size: 15px;
padding-top:5px;
}
}
}
}
.card-breakdown--header {
border-bottom:1px solid rgba(255,255,255,.4);
padding: 10px 0;
h2 {
margin: 0;
font-size: 22px;
padding-bottom: 15px;
}
p {
padding: 0 0 7px 0;
margin: 0;
}
}
.card-overview {
width: 490px;
display: inline-block;
border-radius: 0 5px 5px 0;
padding: 0 30px;
background-color: #fff;
hr {
border-top: 1px solid lighten($grey, 30%);
box-shadow: none;
}
.user-info {
padding-top: 15px;
}
}
.overview-header {
padding: 68px 0 20px 0;
}
.logo {
display: inline-block;
padding-bottom: 15px;
width:100px;
}
.timestamp {
display: inline-block;
float:right;
padding-top:5px;
span {
color: lighten($grey, 25%);
font-size: 15px;
font-family:inherit;
font-weight: 600;
&:first-of-type {
padding: 15px;
}
}
}
.descriptor {
width: 60%;
padding-top:20px;
p {
font-size: 13px;
color: $grey;
line-height: 1.5;
}
}
.overview-body {
color: $grey;
span {
color: #000;
}
}
.user-info-name {
font-weight:600;
font-size: 18px;
}
.user-info-text {
line-height:1.5;
font-weight: 500;
a {
color: $blue;
text-decoration: none;
}
}
.purchase-overview {
color: darken($grey, 12%);
}
.overview-footer {
padding: 30px 0;
margin-top: 30px;
border-top: 1px solid lighten($grey, 30%);
a {
font-size: 13px;
font-weight: 600;
}
.invoice-id {
float:right;
font-size: 13px;
color: $grey;
font-weight: 600;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment