JSFiddle - React, Tailwind, and code Playground
by ryanwfiorini
HTML
<!DOCTYPE html>
<html>
<head>
<title>Address Selection</title>
<meta charset="utf-8">
<link rel="stylesheet" href="./style.css"/>
<script src="./app.js"></script>
</head>
<body>
<div class="card-container">
<div class="panel">
<div>
<img class="sb-title-icon" src="https://fonts.gstatic.com/s/i/googlematerialicons/location_pin/v5/24px.svg" alt="">
<span class="sb-title">Address Selection</span>
</div>
<input type="text" placeholder="Address" id="location"/>
<input type="text" placeholder="Apt, Suite, etc (optional)"/>
<input type="text" placeholder="City" id="locality"/>
<div class="half-input-container">
<input type="text" class="half-input" placeholder="State/Province" id="administrative_area_level_1"/>
<input type="text" class="half-input" placeholder="Zip/Postal code" id="postal_code"/>
</div>
<input type="text" placeholder="Country" id="country"/>
<button class="button-cta">Checkout</button>
</div>
<div class="map" id="map"></div>
</div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBb_wWjaQxgVYyWWBtHcJuMAlI251xk6tk&libraries=places&callback=initMap&solution_channel=GMP_QB_addressselection_v1_cABC" async defer></script>
</body>
</html>
CSS
body {
margin: 0;
}
.sb-title {
position: relative;
top: -12px;
font-family: Roboto, sans-serif;
font-weight: 500;
}
.sb-title-icon {
position: relative;
top: -5px;
}
.card-container {
display: flex;
height: 500px;
width: 600px;
}
.panel {
background: white;
width: 300px;
padding: 20px;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.half-input-container {
display: flex;
justify-content: space-between;
}
.half-input {
max-width: 120px;
}
.map {
width: 300px;
}
h2 {
margin: 0;
font-family: Roboto, sans-serif;
}
input {
height: 30px;
}
input {
border: 0;
border-bottom: 1px solid black;
font-size: 14px;
font-family: Roboto, sans-serif;
font-style: normal;
font-weight: normal;
}
input:focus::placeholder {
color: white;
}
.button-cta {
height: 40px;
width: 40%;
background: #3367d6;
color: white;
font-size: 15px;
text-transform: uppercase;
font-family: Roboto, sans-serif;
border: 0;
border-radius: 3px;
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.48);
cursor: pointer;
}
JavaScript
"use strict";
function initMap() {
const CONFIGURATION = {
"ctaTitle": "Checkout",
"mapOptions": {"center":{"lat":37.4221,"lng":-122.0841},"fullscreenControl":true,"mapTypeControl":false,"streetViewControl":true,"zoom":11,"zoomControl":true,"maxZoom":22},
"mapsApiKey": "AIzaSyBb_wWjaQxgVYyWWBtHcJuMAlI251xk6tk",
"capabilities": {"addressAutocompleteControl":true,"mapDisplayControl":true,"ctaControl":true}
};
const componentForm = [
'location',
'locality',
'administrative_area_level_1',
'country',
'postal_code',
];
const map = new google.maps.Map(document.getElementById("map"), {
zoom: CONFIGURATION.mapOptions.zoom,
center: { lat: 37.4221, lng: -122.0841 },
mapTypeControl: false,
fullscreenControl: CONFIGURATION.mapOptions.fullscreenControl,
zoomControl: CONFIGURATION.mapOptions.zoomControl,
streetViewControl: CONFIGURATION.mapOptions.streetViewControl
});
const marker = new google.maps.Marker({map: map, draggable: false});
const autocompleteInput = document.getElementById('location');
const autocomplete = new google.maps.places.Autocomplete(autocompleteInput, {
fields: ["address_components", "geometry", "name"],
types: ["address"],
});
autocomplete.addListener('place_changed', function () {
marker.setVisible(false);
const place = autocomplete.getPlace();
if (!place.geometry) {
// User entered the name of a Place that was not suggested and
// pressed the Enter key, or the Place Details request failed.
window.alert('No details available for input: \'' + place.name + '\'');
return;
}
renderAddress(place);
fillInAddress(place);
});
function fillInAddress(place) { // optional parameter
const addressNameFormat = {
'street_number': 'short_name',
'route': 'long_name',
'locality': 'long_name',
'administrative_area_level_1': 'short_name',
'country': 'long_name',
'postal_code': 'short_name',
...