HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by esm.sh, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ESM usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
<!-- Add animations on Braintree Hosted Fields events -->
<!-- Some test Card numbers
4111 1111 1111 1111: Visa
5555 5555 5555 4444: MasterCard
3714 496353 98431: American Express
-->
<!--[if IE 9]>
<style>
header {
margin-top: 1em;
text-align: center;
}
#my-sample-form {
margin: 0 auto;
padding-top: 2em;
}
.bg-illustration {
z-index: -1;
}
#button-pay {
margin: 1em auto 0;
display: block;
}
.cardinfo-exp-date, .cardinfo-cvv {
width: 45%;
float: left;
}
.cardinfo-wrapper {
overflow: hidden;
}
</style>
<![endif]-->
<div class="form-container">
<div class="bg-illustration">
<svg width="801" height="570" viewBox="0 0 801 570" xmlns="http://www.w3.org/2000/svg"><path d="M695.15 540.43c-20.954 6.55-43.243 8.226-64.932 4.89 26.065-11.507 55.1-15.426 83.328-12.16-6.065 2.907-12.257 5.35-18.397 7.27m-74.984-158.957c-21.38 10.4-43.668 18.945-66.534 25.507-10.876 3.124-21.884 5.796-32.982 8.01-9.54 1.897-19.777 4.24-29.407 1.474-3.74-1.074-7.995-3.277-9.628-7.045-1.683-3.892 5.25-9.335 7.905-12.03 7.204-7.305 15.39-13.605 24.186-18.898 17.312-10.42 36.777-16.946 56.58-20.74 29.96-5.74 61.745-5.98 91.927.11-13.534 8.686-27.587 16.578-42.047 23.61M500.756 239.7c-33.755 25.25-73.15 43.654-114.53 52.324-3.04.637-17.404 1.327-11.22-4.79 4.484-4.435 9.366-8.456 14.522-12.093 8.946-6.313 18.65-11.5 28.616-16.02 22.272-10.1 45.856-17.684 69.6-23.497 8.246-2.02 16.557-3.784 24.91-5.325-3.887 3.23-7.85 6.372-11.9 9.402M342.55 48.914c-6.185 9.275-13.586 17.906-21.198 26.05-29.246 31.28-66.41 55.228-107.156 68.748-9.036 2.998-18.98 6.006-28.552 3.737-3.216-.762-9.808-3.368-10.36-7.234-.303-2.117 2.287-5.23 3.342-6.96 1.356-2.23 2.805-4.4 4.337-6.514 12.736-17.588 30.818-30.666 49.696-41.077 34.208-18.862 71.874-31.495 110.664-37.96-.256.404-.51.81-.774 1.21m457.74 519.678c-22.864-19.48-51.17-31.804-80.733-36.312 9.67-5.095 18.695-11.365 26.732-18.812 14.05-13.024 24.878-30.252 26.41-49.644 1.64-20.754-7.21-41.398-19.804-57.542-20.985-26.902-53.498-42.06-86.39-49.197 2.876-1.887 5.738-3.798 8.565-5.757 17.06-11.824 34.41-25.288 44.125-44.053 8.667-16.737 10.507-38.63-.855-54.614-10.888-15.32-30.21-21.3-47.887-24.643-46.346-8.764-94.712-8.922-141.317-2.16-3.577.522-7.144 1.098-10.71 1.703 10.422-9.04 20.23-18.78 29.26-29.202 16.158-18.658 32.707-40.726 35.14-66.04 4.776-49.667-50.926-71.248-90.198-80.87-47.635-11.67-97.6-13.463-146.025-5.768 3.113-5.434 5.273-11.288 4.97-17.58-.47-9.854-7.347-18.123-15.74-22.784-11.377-6.32-25.098-5.845-37.625-4.418-23.028 2.626-45.735 8-67.582 15.672-43.49 15.276-83.362 39.604-118.428 69.25-36.16 30.574-67.404 66.832-93.41 106.278-6.348 9.625-12.37 19.457-18.1 29.46-.54.945.923 1.796 1.463.85 40.29-70.35 96.604-133.587 166.986-175.18C203.47 26.94 241.14 12.15 280.516 5.18c20.895-3.7 51.86-9.495 65.6 11.7 6.22 9.6 3.576 20.047-1.766 29.143-3.298.545-6.592 1.134-9.876 1.768-26.202 5.052-51.843 12.94-76.305 23.567-22.525 9.788-44.832 21.706-62.735 38.713-8.42 8-15.773 17.185-21.18 27.47-3.763 7.16 9.64 11.647 14.766 12.153 10.566 1.042 20.932-2.625 30.718-6.102 11.48-4.08 22.666-8.986 33.446-14.64 21.505-11.28 41.417-25.57 58.974-42.3 9.075-8.65 17.512-17.96 25.207-27.844 2.79-3.58 5.756-7.41 8.263-11.483 52.33-8.38 106.617-5.535 157.177 8.53 36.682 10.207 84.046 32.95 78.09 78.475-3.09 23.603-18.427 44.218-33.538 61.828-9.847 11.478-20.625 22.164-32.15 31.976-19.287 3.427-38.35 8.103-57.007 14.06-21.474 6.853-43.19 14.898-62.414 26.797-8.93 5.53-17.205 12.008-24.462 19.596-.195.202-.327.543-.22.82 3.423 8.837 16.933 4.033 23.404 2.455 11.922-2.908 23.653-6.584 35.105-10.975 22.774-8.73 44.46-20.26 64.415-34.24 7.58-5.31 14.908-10.972 21.96-16.955 39.06-6.903 79.05-8.58 118.555-4.88 21.537 2.018 45.684 4.04 65.153 14.28 9.745 5.127 18.006 12.924 21.967 23.337 3.86 10.146 3.67 21.456.824 31.83-6.102 22.25-24.29 38.393-42.392 51.46-5.212 3.767-10.53 7.39-15.925 10.896-1.224-.252-2.445-.517-3.667-.746-37.45-7.026-77.88-5.438-114.235 6.232-18.002 5.78-35.216 14.388-49.737 26.545-3.65 3.057-7.115 6.33-10.362 9.806-1.567 1.678-3.082 3.4-4.54 5.17-.875 1.064-2.49 2.35-2.57 3.775-.143 2.517 2.89 5.763 4.637 7.185 2.58 2.103 5.815 3.312 9.048 3.995 8.508 1.8 17.07.216 25.46-1.39 11.114-2.13 22.14-4.725 33.04-7.77 21.866-6.106 43.222-14.027 63.787-23.626 17.12-7.99 33.678-17.172 49.527-27.44 7.98 1.705 15.85 3.83 23.528 6.446 36.767 12.53 71.948 39.044 81.216 78.46 9.36 39.803-19.35 71.52-53.047 88.572-16.7-2.21-33.75-1.943-50.4.943-13.49 2.337-26.584 6.463-38.99 12.215-.637.294-.498 1.417.203 1.54 30.05 5.212 62.45.816 89.935-12.918 16.66 2.28 32.98 7.053 48.18 14.26 12.224 5.798 23.625 13.16 33.912 21.924.824.7 2.028-.486 1.197-1.193" fill="#FFF" fill-rule="evenodd"/></svg>
</div>
<header>
<h1>Payment Method</h1>
</header>
<form id="my-sample-form" class="scale-down">
<div class="cardinfo-card-number">
<label class="cardinfo-label" for="card-number">Card Number</label>
<div class='input-wrapper' id="card-number"></div>
<div id="card-image"></div>
</div>
<div class="cardinfo-wrapper">
<div class="cardinfo-exp-date">
<label class="cardinfo-label" for="expiration-date">Valid Thru</label>
<div class='input-wrapper' id="expiration-date"></div>
</div>
<div class="cardinfo-cvv">
<label class="cardinfo-label" for="cvv">CVV</label>
<div class='input-wrapper' id="cvv"></div>
</div>
</div>
</form>
<input id="button-pay" type="submit" value="Continue" />
</div>
/*--------------------
Shared Variables
--------------------*/
$small-screen: 476px;
$grey: #111;
$blue: #5db6e8;
$darkBlue: #282c37;
$red: #E53A40;
$green: #8CD790;
$white: #fff;
$radius: 4px;
$bouncy: cubic-bezier(.20, 1.3, .7, 1);
/*--------------------
General
--------------------*/
// Position form at the center of the page
html,
body {
font-size: 100%;
height: 100%;
color: $darkBlue;
font-family: sans-serif;
padding: 0;
margin: 0;
}
header {
z-index: 2;
transform: translate(0, 5.5em);
transition: all .5s ease;
&.header-slide {
transform: translate(0, 0);
}
}
h1 {
font-weight: 100;
font-size: 1.4em;
display: block;
}
.form-container {
display: flex;
background-color: #EEE;
justify-content: center;
align-items: center;
height: 100%;
flex-direction: column;
border: 1em solid #fff;
box-sizing: border-box;
position: relative;
@media (max-width: $small-screen) {
border: none;
}
}
.cardinfo-wrapper {
display: flex;
justify-content: space-around;
}
.bg-illustration {
position: absolute;
bottom: 0;
left: 0;
z-index: 0;
svg {
width: 100%;
}
}
.card-shape {
border-radius: 6px;
padding: 2em 2em 1em;
@media (max-width: $small-screen) {
padding: 2em 1.5em 1em;
}
}
// Form wrapper styling
#my-sample-form {
background-color: #FFF;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
padding: 8em 3em 2em;
width: 20em;
margin-bottom: 2em;
transition: all 600ms $bouncy;
animation: cardIntro 500ms $bouncy;
z-index: 1;
&:hover {
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.06);
}
@media (max-width: $small-screen) {
box-sizing: border-box;
padding: 7em 2em 2em;
width: 100%;
}
// Change background color based on the card type
&.visa {
@extend .card-shape;
color: $white;
background-color: #0D4AA2;
}
&.master-card {
@extend .card-shape;
color: $white;
background-color: #363636;
background: linear-gradient(115deg,#d82332, #d82332 50%, #f1ad3d 50%, #f1ad3d);
}
&.maestro {
@extend .card-shape;
color: $white;
background-color: #363636;
background: linear-gradient(115deg,#009ddd, #009ddd 50%, #ed1c2e 50%, #ed1c2e);
}
&.american-express {
@extend .card-shape;
color: $white;
background-color: #007CC3;
}
&.discover {
@extend .card-shape;
color: $white;
background-color: #ff6000;
background: linear-gradient(#d14310, #f7961e);
}
&.unionpay, &.jcb, &.diners-club {
@extend .card-shape;
color: $white;
background-color: #363636;
}
}
.cardinfo-label {
display: block;
font-size: 11px;
margin-bottom: 0.5em;
text-transform: uppercase;
}
.cardinfo-exp-date {
margin-right: 1em;
width: 100%;
}
.cardinfo-cvv {
width: 100%;
}
#button-pay {
cursor: pointer;
width: 16em;
font-size: 15px;
border: 0;
padding: 1.2em 1em;
color: #fff;
background: #282c37;
border-radius: $radius;
z-index: 0;
transform: translateY(-100px);
transition: all 500ms $bouncy;
opacity: 0;
-webkit-appearance: none;
&:hover {
background: lighten(#282c37, 20%);
}
&:active {
animation: cardIntro 200ms $bouncy;
}
&.show-button {
transform: translateY(0);
opacity: 1;
}
}
// Card type image styles
.cardinfo-card-number {
position: relative;
}
#card-image {
position: absolute;
top: 2em;
right: 1em;
width: 44px;
height: 28px;
background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/346994/card_sprite.png);
background-size: 86px 458px;
border-radius: $radius;
background-position: -100px 0;
background-repeat: no-repeat;
margin-bottom: 1em;
&.visa {
background-position: 0 -398px;
}
&.master-card {
background-position: 0 -281px;
}
&.american-express {
background-position: 0 -370px;
}
&.discover {
background-position: 0 -163px;
}
&.maestro {
background-position: 0 -251px;
}
&.jcb {
background-position: 0 -221px;
}
&.diners-club {
background-position: 0 -133px;
}
}
/*--------------------
Inputs
--------------------*/
// Styling for input wrappers, internal font styles are handled in javascript
.input-wrapper {
border-radius: 2px;
background: rgba(255, 255, 255, 0.86);
height: 2.75em;
border: 1px solid #eee;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.06);
padding: 5px 10px;
margin-bottom: 1em;
}
.cardinfo-card-number,
.cardinfo-exp-date,
.cardinfo-cvv {
transition: transform 0.3s;
}
// Change styles of the input wrappers using Braintree's provided classes.
// Styles the wrapper of the focused input
.braintree-hosted-fields-focused {
border-color: $blue;
}
// Styles the wrapper of the invalid input
.braintree-hosted-fields-invalid {
border-color: $red;
animation: shake 500ms $bouncy both;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
perspective: 1000px;
}
/*--------------------
Animations
--------------------*/
@keyframes cardIntro {
0% {
transform: scale(0.8) translate(0, 0);
opacity: 0;
}
100% {
transform: scale(1) translate(0, 0);
opacity: 1;
}
}
@keyframes shake {
10%,
90% {
transform: translate3d(-1px, 0, 0);
}
20%,
80% {
transform: translate3d(1px, 0, 0);
}
30%,
50%,
70% {
transform: translate3d(-3px, 0, 0);
}
40%,
60% {
transform: translate3d(3px, 0, 0);
}
}
var form = document.querySelector('#my-sample-form');
var submit = document.querySelector('input[type="submit"]');
braintree.client.create({
authorization: 'sandbox_g42y39zw_348pk9cgf3bgyw2b'
}, function (err, clientInstance) {
if (err) {
console.error(err);
return;
}
// Create input fields and add text styles
braintree.hostedFields.create({
client: clientInstance,
styles: {
'input': {
'color': '#282c37',
'font-size': '16px',
'transition': 'color 0.1s',
'line-height': '3'
},
// Style the text of an invalid input
'input.invalid': {
'color': '#E53A40'
},
// placeholder styles need to be individually adjusted
'::-webkit-input-placeholder': {
'color': 'rgba(0,0,0,0.6)'
},
':-moz-placeholder': {
'color': 'rgba(0,0,0,0.6)'
},
'::-moz-placeholder': {
'color': 'rgba(0,0,0,0.6)'
},
':-ms-input-placeholder': {
'color': 'rgba(0,0,0,0.6)'
},
// prevent IE 11 and Edge from
// displaying the clear button
// over the card brand icon
'input::-ms-clear': {
opacity: '0'
}
},
// Add information for individual fields
fields: {
number: {
selector: '#card-number',
placeholder: '1111 1111 1111 1111'
},
cvv: {
selector: '#cvv',
placeholder: '123'
},
expirationDate: {
selector: '#expiration-date',
placeholder: '10 / 2019'
}
}
}, function (err, hostedFieldsInstance) {
if (err) {
console.error(err);
return;
}
hostedFieldsInstance.on('validityChange', function (event) {
// Check if all fields are valid, then show submit button
var formValid = Object.keys(event.fields).every(function (key) {
return event.fields[key].isValid;
});
if (formValid) {
$('#button-pay').addClass('show-button');
} else {
$('#button-pay').removeClass('show-button');
}
});
hostedFieldsInstance.on('empty', function (event) {
$('header').removeClass('header-slide');
$('#card-image').removeClass();
$(form).removeClass();
});
hostedFieldsInstance.on('cardTypeChange', function (event) {
// Change card bg depending on card type
if (event.cards.length === 1) {
$(form).removeClass().addClass(event.cards[0].type);
$('#card-image').removeClass().addClass(event.cards[0].type);
$('header').addClass('header-slide');
// Change the CVV length for AmericanExpress cards
if (event.cards[0].code.size === 4) {
hostedFieldsInstance.setAttribute({
field: 'cvv',
attribute: 'placeholder',
value: '1234'
});
}
} else {
hostedFieldsInstance.setAttribute({
field: 'cvv',
attribute: 'placeholder',
value: '123'
});
}
});
submit.addEventListener('click', function (event) {
event.preventDefault();
hostedFieldsInstance.tokenize(function (err, payload) {
if (err) {
console.error(err);
return;
}
// This is where you would submit payload.nonce to your server
alert('Submit your nonce to your server here!');
});
}, false);
});
});
Also see: Tab Triggers