Glam Up My Markup – The Coolest Camp

Glam Up My Markup – The Coolest Camp

This is a submission for DEV Challenge v24.03.20, Glam Up My Markup: Camp Activities

What I Built

Demo

Link: Demo

Journey

First, I looked at some layouts on Dribbble related to the challenge theme. After that, I thought about a layout and made a small drawing on paper, then after that I went looking for an image that would be used as the top of the page and that would be part of the rest of the page below.

Then I found the perfect image to the challenge:

So with the image already chosen, I went to Google Fonts to look for 2 types of fonts, one for the title and one for the rest, and I managed to find some really cool ones:

Title Font:

Font: Rubik Scribble

Content Font:

Font: Indie Flower

So now I thought about the theme of the project. Taking my image as inspiration, I tried to leave the project theme in accordance with elements present in the image, in the same style.

So, I did my project root vars:

:root {
–space-sm: 0.5rem;
–spacer: 1rem;
–spacer-lg: 2rem;
–border-radius: 8px;
–border-radius-lg: 25px;
–primary: #f7c525;
–secondary: #130f41;
–white: #ffffff;
–dark: #000000;
–secondary-yellow: #d1a513;
–tertiary-yellow: #aa8a1f;
–animation-to-up: all 850ms cubic-bezier(0.13, 0.77, 0.23, 1.19);
}

After that, I implemented all the CSS according to the planned layout, and I also implemented some animations that I already had in mind and a quick confirmation of submitting the form.

Soo, the CSS and JavaScript structure will be like below:

CSS:

@import url(‘https://fonts.googleapis.com/css2?family=Indie+Flower&family=Montserrat:ital,wght@0,100..900;1,100..900&family=Rubik+Scribble&display=swap’);
@import url(‘https://fonts.googleapis.com/css2?family=Rubik+Scribble&display=swap’);

* {
box-sizing: border-box;
font-family: ‘Indie Flower’, cursive;
font-weight: 400;
margin: 0;
padding: 0;
}

:root {
–space-sm: 0.5rem;
–spacer: 1rem;
–spacer-lg: 2rem;
–border-radius: 8px;
–border-radius-lg: 25px;
–primary: #f7c525;
–secondary: #130f41;
–white: #ffffff;
–dark: #000000;
–secondary-yellow: #d1a513;
–tertiary-yellow: #aa8a1f;
–animation-to-up: all 850ms cubic-bezier(0.13, 0.77, 0.23, 1.19);
}

html,
body {
height: 100%;
overflow: hidden;
}

body {
display: flex;
justify-content: center;
align-items: center;
background-size: contain;
background-repeat: no-repeat;
background-color: var(–secondary);
position: relative;

&:after {
content: ;
background: url(https://weather-app-renanferro.vercel.app/assets/images/4358862.jpg);
width: 100%;
height: 50%;
position: absolute;
top: 0;
z-index: -1;
background-size: cover;
background-position: center;
}
}

#camp-activities-inquiry {
background: rgba(19, 15, 65, 0.56);
border-radius: 16px;
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.5);
backdrop-filter: blur(8.7px);
-webkit-backdrop-filter: blur(8.7px);
border: 1px solid rgba(19, 15, 65, 0.17);
padding: var(–spacer);
position: absolute;
top: 100%;
width: 90%;

&.active {
top: 50%;
transform: translateY(-50%);
transition: var(–animation-to-up);
}

button,
label {
font-family: ‘Indie Flower’, cursive;
font-weight: 400;
font-style: normal;
font-size: 1rem;
color: var(–white);
}

h1 {
transition: 0.25s;
font-size: 2.5rem;
line-height: 40px;
text-align: center;
font-family: ‘Rubik Scribble’, system-ui;
font-weight: 400;
color: var(–primary);
margin-bottom: 2rem;
}

form {
display: grid;

label {
font-size: 18px;
}

button {
border: unset;
margin-block-start: 8px;
font-size: 1.25rem;
width: 100%;
border-radius: 25px;
background-color: var(–primary);
padding: 0.5rem 1rem;
color: var(–dark);
cursor: pointer;
position: relative;
overflow: hidden;

&:before,
&:after {
content: ;
position: absolute;
height: 1px;
width: 1px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
border-radius: 50%;
z-index: 0;
}

&:before {
background: var(–secondary-yellow);
transition: 0.6s ease-in;
transition-delay: 0.1s;
}

&:after {
background: var(–tertiary-yellow);
transition: 0.8s ease;
transition-delay: 0.4s;
}

&:hover {
&:before,
&:after {
transform: translate(-50%, -50%) scale(510);
opacity: 0;
}
}
}

select,
textarea {
border-radius: var(–border-radius);
margin-block-end: var(–spacer);
padding: var(–space-sm);

&:focus-visible {
outline: unset;
-webkit-box-shadow: -1px 2px 25px -8px rgba(247, 197, 37, 1);
-moz-box-shadow: -1px 2px 25px -8px rgba(247, 197, 37, 1);
box-shadow: -1px 2px 25px -8px rgba(247, 197, 37, 1);
}
}

textarea {
resize: none;
}
}
}

.confirmation-box {
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(9.5px);
position: absolute;
width: 100%;
height: 100dvh;
font-size: 1.5rem;
font-family: ‘Indie Flower’, cursive;
font-weight: 400;
display: flex;
justify-content: center;
align-items: center;
color: white;
opacity: 0;
transition: all 300ms ease-in;

&.active {
opacity: 1;
transition: all 300ms ease-in-out;
}
}

@media (min-width: 1279px) {
body {
&:after {
content: ;
height: 96%;
background-position: center bottom;
}
}

#camp-activities-inquiry {
width: 70%;
}

#camp-activities-inquiry {
padding: var(–spacer-lg);
}
}

JavaScript:

const section = document.querySelector(#camp-activities-inquiry);
const body = document.querySelector(body);
const form = document.querySelector(form);
const textareas = form.querySelectorAll(textarea);
const select = form.querySelector(select);
const button = form.querySelector(button);

function disableFormFields(actualState) {
button.disabled = actualState;
select.disabled = actualState;
textareas.forEach((input) => {
input.disabled = actualState;
});
form.reset();
}

function showConfirmationRegister() {
const confirmationBoxContent = document.createElement(div);

confirmationBoxContent.innerHTML = Well done, see you soon 🙂;
confirmationBoxContent.classList.add(confirmation-box);

body.appendChild(confirmationBoxContent);

setTimeout(() => {
disableFormFields(false);
confirmationBoxContent.classList.add(active);
}, 10);

setTimeout(() => {
confirmationBoxContent.classList.remove(active);
}, 2000);

setTimeout(() => {
body.removeChild(confirmationBoxContent);
}, 2300);
}

function animateHoverSectionFormulary() {
section.addEventListener(mouseover, (event) => {
let cursorPositionX = event.clientX;
let cursorPositionY = event.clientY;
section.style.transform = `translateY(-50%) rotateX(-${Math.round(
cursorPositionX / 80
)}deg) rotateY(-${Math.round(cursorPositionY / 80)}deg)`;
});
}

function showFormularyContent() {
setTimeout(() => {
section.classList.add(active);
}, 100);

animateHoverSectionFormulary();
}

function submitFormulary() {
form.addEventListener(submit, (event) => {
event.preventDefault();
showConfirmationRegister();
});
}

window.addEventListener(load, () => {
showFormularyContent();
submitFormulary();
});

That’s it, I hope you liked the final result. I loved the result and even more so participating in this challenge, which is certainly the first of many!

See you soon guys!!!

Leave a Reply

Your email address will not be published. Required fields are marked *