Skip to content

Instantly share code, notes, and snippets.

@e1blue
Created March 21, 2018 14:07
Show Gist options
  • Select an option

  • Save e1blue/c1ddb461b6fc351b3d908511934c7da1 to your computer and use it in GitHub Desktop.

Select an option

Save e1blue/c1ddb461b6fc351b3d908511934c7da1 to your computer and use it in GitHub Desktop.
Fetch a Movie Card
.movie(id="movie-card")
.movie__data(id="movie-data")
input.movie__search(id="movie-search" type="text" placeholder="Enter a movie title")
const movieData = document.getElementById('movie-data');
const input = document.getElementById('movie-search');
const key = '2fb7569a';
const defaultTitle = 'dead+poets+society';
const url = `https://www.omdbapi.com/?apikey=${key}&t=`;
const movieDataTpl = (movie) => {
let actors = movie.Actors.split(',');
return `
<div class="movie__poster">
<span class="movie__poster--fill">
<img src="${movie.Poster}" />
</span>
<span class="movie__poster--featured">
<img src="${movie.Poster}" />
</span>
</div>
<div class="movie__details">
<h2 class="movie__title">${movie.Title}</h2>
<ul class="movie__tags list--inline">
<li class="movie__rated">${movie.Rated}</li>
<li class="movie__year">${movie.Year}</li>
<li class="movie__year">${movie.Genre}</li>
</ul>
<p class="movie__plot">${movie.Plot}</p>
<div class="movie__credits">
<p><strong>Written by:</strong> ${movie.Writer}</p>
<p><strong>Directed by:</strong> ${movie.Director}</p>
<p><strong>Starring:</strong></p>
<ul class="movie__actors list--inline">
${actors.map(actor => `<li>${actor}</li>`).join('')}
</ul>
</div>
</div>
`;
};
const noResultsTpl = () => {
return `
<div class="movie__no-results">
<h2>No results</div>
</div>
`;
};
const findMovie = (title) => {
fetch(url + title, {
method: 'get',
}).then(function(res) {
return res.json();
}).then(function(data) {
movieData.innerHTML = movieDataTpl(data);
}).catch(function(err) {
movieData.innerHTML = noResultsTpl();
});
}
findMovie(defaultTitle);
input.addEventListener('keypress', (e) => {
if (e.keyCode === 13 && input.value) findMovie(input.value);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
@import url('https://fonts.googleapis.com/css?family=Lato:400,900');
$font-body: 'Lato', sans-serif;
$font-heading: $font-body;
$base-spacing: 12px;
$base-radius: 0.8em;
$poster-width: 140px;
$poster-span: 200px;
$bp-md: 600px;
$bp-sm: 400px;
* {
box-sizing: border-box;
}
body {
display: flex;
align-items: center;
justify-content: center;
padding: $base-spacing;
min-height: 100vh;
font-family: $font-body;
background-color: whitesmoke;
}
h1, h2, p, ul {
line-height: 1.2;
&:not(:last-child) {
margin-bottom: $base-spacing;
}
}
p, li {
font-size: 0.9em;
line-height: 1.5;
}
p + ul {
margin-top: -$base-spacing + 2px;
}
h1, h2, strong {
font-weight: 900;
}
input {
padding: 6px;
font-family: $font-body;
font-size: 16px;
border: 1px solid gainsboro;
border-radius: 2px;
-webkit-appearance: none;
}
.list {
&--inline li {
display: inline-block;
&:not(:last-child) {
margin-right: $base-spacing;
}
}
}
.movie {
position: relative;
overflow: hidden;
margin: $base-spacing auto;
width: 100%;
max-width: 800px;
background-color: white;
border-radius: $base-radius;
box-shadow: rgba(black, 0.2) 0 30px 18px -24px;
&__data {
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
min-height: $poster-span * 2;
@media (min-width: $bp-md) {
flex-direction: row;
}
}
&__search {
position: absolute;
top: $base-spacing * 2;
right: $base-spacing * 2;
margin: auto;
width: calc(100% - (#{$base-spacing} * 4));
@media (min-width: $bp-sm) {
max-width: 200px;
}
}
&__tags {
font-size: 0.75em;
color: darkgray;
}
&__poster {
position: relative;
display: flex;
width: 100%;
@media (min-width: $bp-md) {
margin-right: $base-spacing;
width: $poster-span;
}
&--fill {
position: absolute;
overflow: hidden;
top: -80%;
bottom: -20%;
left: -20%;
width: 150%;
height: 150%;
transform: rotate(5deg);
@media (min-width: $bp-md) {
top: -20%;
width: 100%;
}
img {
filter: blur(6px);
object-fit: cover;
width: 100%;
height: 100%;
transform: scale(1.4);
}
}
&--featured {
position: relative;
align-self: center;
overflow: hidden;
margin-top: $base-spacing * 7;
margin-left: $base-spacing * 2;
width: $poster-width;
background-color: gainsboro;
border-radius: 2px;
box-shadow: rgba(black, 0.6) 0 6px 12px -6px;
z-index: 1;
@media (min-width: $bp-md) {
left: $poster-width / 2.5;
margin: auto;
}
img {
width: $poster-width;
vertical-align: middle;
&[src="N/A"] {
min-height: 206px;
opacity: 0;
}
}
}
}
&__details {
flex: 1;
padding: $base-spacing * 2;
@media (min-width: $bp-md) {
padding: $base-spacing * 6;
}
}
&__title {
font-family: $font-heading;
font-size: 2em;
}
&__no-results {
align-self: center;
justify-self: center;
width: 100%;
text-align: center;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment