629 lines
20 KiB
HTML
629 lines
20 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta
|
|
name="description"
|
|
content="Luxury Detailing Maine provides mobile professional car cleaning services in the Portland Area"
|
|
/>
|
|
<title>Luxury Detailing Maine</title>
|
|
<link href="css/style.css" rel="stylesheet" />
|
|
<link href="css/dropdown.css" rel="stylesheet" />
|
|
<link href="css/hamburger.css" rel="stylesheet" />
|
|
|
|
<style>
|
|
html { scroll-behavior: smooth; }
|
|
|
|
main {
|
|
gap: 12rem;
|
|
}
|
|
|
|
|
|
/** landings are used to jump slightly above categories */
|
|
.landing { top: 10rem; position: relative; }
|
|
|
|
#categoryLinks {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: space-evenly;
|
|
align-items: center;
|
|
gap: 5rem;
|
|
|
|
margin-top: 5rem;
|
|
}
|
|
|
|
.jumpLink {
|
|
display: flex;
|
|
align-items: center;;
|
|
|
|
height: 8rem;
|
|
padding: 0 5rem;
|
|
|
|
text-decoration: none;
|
|
color: var(--gold);
|
|
|
|
border: 1px solid var(--gold);
|
|
|
|
border-radius: 1rem;
|
|
|
|
transition: 0.3s ease;
|
|
}
|
|
.jumpLink:hover {
|
|
box-shadow: 0px 0px 10px var(--gold);
|
|
}
|
|
|
|
#downArrowWrapper {
|
|
display: flex;
|
|
justify-content: center;
|
|
margin-top: 2rem;
|
|
}
|
|
#downArrow {
|
|
transform: rotate(-45deg);
|
|
height: 20px;
|
|
width: 20px;
|
|
border-left: solid 2px var(--gold);
|
|
border-bottom: solid 2px var(--gold);
|
|
}
|
|
#downArrow:hover {
|
|
border-left: solid 3px var(--gold);
|
|
border-bottom: solid 3px var(--gold);
|
|
}
|
|
|
|
#categoryContainer {
|
|
width: 90%;
|
|
height: 100%;
|
|
}
|
|
|
|
.serviceHeader {
|
|
margin-top: 20rem;
|
|
}
|
|
.serviceContainer {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-evenly;
|
|
flex-wrap: wrap;
|
|
gap: 5rem;
|
|
margin: 3rem 0;
|
|
}
|
|
|
|
#tableOfContents {
|
|
width: 90%;
|
|
margin-top: 15vh;
|
|
margin-bottom: 35vh;
|
|
}
|
|
|
|
|
|
/** Services */
|
|
a.service { text-decoration: none;}
|
|
.service {
|
|
display: flex;
|
|
flex-direction: column;
|
|
|
|
height: 100%;
|
|
|
|
width: 40rem;
|
|
}
|
|
|
|
.card {
|
|
padding: 3rem;
|
|
border: 2px solid var(--gold);
|
|
border-radius: 1rem;
|
|
|
|
transition: 0.5s ease;
|
|
color: white;
|
|
width: 100%;
|
|
}
|
|
.card:hover {
|
|
border: 2px solid white;
|
|
}
|
|
|
|
/** TODO implement these classes to make consistent service card sizes */
|
|
.tall { height: 30rem; }
|
|
.medium { height: 20rem; }
|
|
.short { height: 10rem; }
|
|
|
|
.card-head {
|
|
margin-bottom: 2rem;
|
|
}
|
|
|
|
.card-body {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
gap: 2rem;
|
|
text-align: left;
|
|
width: 100%;
|
|
}
|
|
|
|
/** .card-body span {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-self: stretch;
|
|
|
|
width: 50%;
|
|
}*/
|
|
.card-body span {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-self: stretch;
|
|
|
|
width: 100%;
|
|
}
|
|
.card-body span h3 {
|
|
text-align: center;
|
|
}
|
|
|
|
|
|
|
|
/** Booking Button */
|
|
.book-button {
|
|
background-color: var(--black);
|
|
color: var(--gold);
|
|
width: 50%;
|
|
height: 4rem;
|
|
|
|
border: 1px solid white;
|
|
border-radius: 5rem;
|
|
|
|
padding: .5rem 1rem;
|
|
|
|
font-size: 1rem;
|
|
font-weight: bold;
|
|
text-decoration: none;
|
|
transition: 0.5s ease;
|
|
}
|
|
.book-button:hover {
|
|
cursor: pointer;
|
|
box-shadow: 0px 0px 15px var(--gold);
|
|
}
|
|
.book-button:active {
|
|
background-color: var(--gold);
|
|
}
|
|
|
|
.book-link {
|
|
user-select: none;
|
|
}
|
|
|
|
/** mobile rules */
|
|
/** MOBILE */
|
|
@media screen and (max-width: 850px) {
|
|
section {
|
|
width: 100%;
|
|
}
|
|
|
|
.jumpLink {
|
|
height: 10rem;
|
|
}
|
|
|
|
/* h1 {
|
|
font-size: 1.75rem;
|
|
}
|
|
h2 {
|
|
font-size: 1.5rem;
|
|
}*/
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<a href="#main-content" class="skipLink">Skip to main content</a>
|
|
|
|
<header>
|
|
<div class="banner" role="banner">
|
|
<a href="index.html" class="logo" aria-label="Company Logo">LUXURY DETAILING</a>
|
|
|
|
<button
|
|
id="hamburger"
|
|
aria-label="Toggle mobile navigation menu"
|
|
aria-expanded="false"
|
|
>
|
|
<span></span>
|
|
<span></span>
|
|
<span></span>
|
|
</button>
|
|
|
|
<nav>
|
|
<a class="navLink" role="navigation" href="ceramic-coating.html">Ceramic Coating</a>
|
|
<a class="navLink" role="navigation" href="services.html">Services</a>
|
|
<a class="navLink" role="navigation" href="reviews.html">Reviews</a>
|
|
<a class="navLink" role="navigation" href="contact.html">About</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main id="main-content">
|
|
|
|
<div id="tableOfContents">
|
|
<h1>Our Services</h1>
|
|
<div id="categoryLinks">
|
|
<a href="#packagesJump" class="jumpLink"><h2>Service Packages</h2></a>
|
|
<a href="#ceramicJump" class="jumpLink"><h2>Ceramic Coating</h2></a>
|
|
<a href="#paintJump" class="jumpLink"><h2>Polish &<br/>Paint Correction</h2></a>
|
|
<a href="#exteriorJump" class="jumpLink"><h2>Exterior Detailing</h2></a>
|
|
<a href="#interiorJump" class="jumpLink"><h2>Interior Detailing</h2></a>
|
|
</div>
|
|
|
|
<div id="downArrowWrapper">
|
|
<a id="downArrow" href="#packagesJump"></a>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="categoryContainer">
|
|
<span id="packagesJump" class="landing"></span>
|
|
<h1 class="serviceHeader">Service Packages</h1>
|
|
<a href="#main-content">back to top</a>
|
|
<div id="packages" class="serviceContainer">
|
|
</div>
|
|
|
|
<span id="ceramicJump" class="landing"></span>
|
|
<h1 class="serviceHeader">Ceramic Coating</h1>
|
|
<div id="ceramic" class="serviceContainer">
|
|
</div>
|
|
|
|
<span id="paintJump" class="landing"></span>
|
|
<h1 class="serviceHeader">Paint & Polish Correction</h1>
|
|
<div id="paint" class="serviceContainer">
|
|
</div>
|
|
|
|
<span id="exteriorJump" class="landing"></span>
|
|
<h1 class="serviceHeader">Exterior Detailing</h1>
|
|
<div id="exterior" class="serviceContainer">
|
|
</div>
|
|
|
|
<span id="interiorJump" class="landing"></span>
|
|
<h1 class="serviceHeader">Interior Detailing</h1>
|
|
<div id="interior" class="serviceContainer">
|
|
</div>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer>
|
|
<div id="footer-left">
|
|
©Luxury Detailing Maine 2025<br />
|
|
All rights reserved<br />
|
|
Portland, ME
|
|
</div>
|
|
<div id="footer-right">
|
|
207-807-6770<br />
|
|
example@email.com<br />
|
|
<a
|
|
href="https://www.instagram.com/luxurydetailingmaine/"
|
|
target="_blank"
|
|
>@luxurydetailingmaine</a
|
|
>
|
|
</div>
|
|
</footer>
|
|
|
|
<script src="js/hamburger.js"></script>
|
|
|
|
<script>
|
|
// these categories must match the IDs of the serviceContainer <div>s above
|
|
const categories = ["packages", "ceramic", "paint", "exterior", "interior"];
|
|
const serviceData = {
|
|
"packages" : [
|
|
/** SERVICE PACKAGE ONE */
|
|
{
|
|
"title" : "Service Package One",
|
|
"subtitle" : "Give your car the time, love, and care it deserves.",
|
|
"left" : {
|
|
"header" : "Interior",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Vacuum & light carpet shampooing",
|
|
"Plastics, leather, and vinyls cleaning",
|
|
"Light seat shampooing",
|
|
"Interior & exterior window cleaning",
|
|
"Crack & crevice cleaning"
|
|
]
|
|
},
|
|
"right" : {
|
|
"header" : "Exterior",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Hand wash & dry",
|
|
"Bug gut removal",
|
|
"Tire, wheel, and wheel well cleaning + tire shine",
|
|
"Window cleaning",
|
|
"Light door jam cleaning"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/XGQVAkJx15acdsEemvEr?productServiceId=sIUtLBqGS4mjAQNwHtI4&sku=rH37oV6muKqDXStXhH3k"
|
|
},
|
|
/** SERVICE PACKAGE TWO */
|
|
{
|
|
"title" : "Service Package Two",
|
|
"subtitle" : "Tell the world you're proud of your car.",
|
|
"left" : {
|
|
"header" : "Interior",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Vacuum & light carpet shampooing",
|
|
"Plastics, leather, and vinyls cleaning",
|
|
"Light seat shampooing",
|
|
"Interior & exterior window cleaning",
|
|
"Crack & crevice cleaning"
|
|
]
|
|
},
|
|
"right" : {
|
|
"header" : "Exterior",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Hand wash & dry",
|
|
"Bug gut removal",
|
|
"Tire, wheel, and wheel well cleaning + tire shine",
|
|
"Clay service to remove embedded contamination",
|
|
"3 to 6 month ceramic paint sealant: gloss, protection, hydrophobic & self-cleaning properties"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/XGQVAkJx15acdsEemvEr?productServiceId=ZUyqKhnZtS3uAT9Auo2I&sku=EsEnqIEVcVedKRDITk7e"
|
|
}
|
|
],
|
|
"ceramic" : [
|
|
/** ELITE COATING */
|
|
{
|
|
"title" : "Elite Ceramic Coating",
|
|
"subtitle" : "Bring out and protect your car's shine for years to come.",
|
|
"left" : {
|
|
"header" : "Description",
|
|
"paragraph" : "A protective layer on your vehicle's surface that repels water, dirt, and contaminants, making cleaning easier and enhancing the paint's durability and shine for 3-5 years.",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Hand wash",
|
|
"Decontamination of paint & glass",
|
|
"1 Step polish to remove light swirls and enhance gloss"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/Z2TzVLNpkirBka11huXA?productServiceId=EpBxqPABGIwdF1f3ujqS&sku=Et0iAwD3vqAQYtcNo596"
|
|
},
|
|
/** COMPLETE COATING */
|
|
{
|
|
"title" : "Complete Ceramic Coating",
|
|
"subtitle" : "Like a factory reset on your cars exterior, but 10x better.",
|
|
"left" : {
|
|
"header" : "Description",
|
|
"paragraph" : "A protective layer on your vehicle's surface that repels water, dirt, and contaminants, and UV rays, with insane gloss and shine for 3-5 years. (Paint + Glass)",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Hand wash & dry",
|
|
"Wheel cleaning",
|
|
"1 stage paint correction on all paint & glass",
|
|
"Free quarterly washes",
|
|
"Free annual decontamination and topper"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/Z2TzVLNpkirBka11huXA?productServiceId=EpBxqPABGIwdF1f3ujqS&sku=Et0iAwD3vqAQYtcNo596"
|
|
},
|
|
/** WHEEL WASH */
|
|
{
|
|
"title" : "Wheel Wash",
|
|
"subtitle" : "Make your wheels glow and shine.",
|
|
"left" : {
|
|
"header" : "Disclaimer",
|
|
"paragraph" : "Only available if the entire car receives a ceramic coating.",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "",
|
|
"paragraph" : "",
|
|
"bullets" : []
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/Z2TzVLNpkirBka11huXA?productServiceId=jFgdX1fB0AoMVmIhSSmP&sku=lCUwUjNUHf4NYqqKYRNS"
|
|
}
|
|
],
|
|
"paint" : [
|
|
/** PAINT ENHANCEMENT */
|
|
{
|
|
"title" : "Paint Enhancement",
|
|
"subtitle" : "Bring back that gloss you know and love.",
|
|
"left" : {
|
|
"header" : "Disclaimer",
|
|
"paragraph" : "Must include an exterior wash & decontamination (price included).",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"1-step polish to enhance gloss & reduce minor defects",
|
|
"Ceramic coating, sealant, or wax required after"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/W7MYzeflJr6yEAlpgreQ?productServiceId=CvJ0v88LfLS9De7I04qu&sku=EyZfDYm9fPEgr3FRl24h"
|
|
},
|
|
/** PAINT CORRECTION */
|
|
{
|
|
"title" : "Paint Correction",
|
|
"subtitle" : "Give your paint a breath of fresh air.",
|
|
"left" : {
|
|
"header" : "Disclaimer",
|
|
"paragraph" : "Ceramic coating, sealant, or wax required after",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Exterior wash and decontaminaion",
|
|
"2-step polish to eliminate 80-85% of defects",
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/W7MYzeflJr6yEAlpgreQ?productServiceId=EDLsm6ynRPi4sKV0ajh1&sku=s1VcPPUMz3Y5n9B99e2F"
|
|
}
|
|
],
|
|
"exterior" : [
|
|
/** LEVEL ONE EXTERIOR */
|
|
{
|
|
"title" : "Level One Exterior",
|
|
"subtitle" : "Refresh your shine!",
|
|
"left" : {
|
|
"header" : "Description",
|
|
"paragraph" : "A safe and meticulous hand wash to reveal the true shine of your car.",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Hand wash & dry",
|
|
"Bug gut removal",
|
|
"Tire, wheel, wheel well cleaning, and tire shine",
|
|
"Window cleaning",
|
|
"Light door jam cleaning"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/yT4vtoWKB5qGaQMaxOdd?productServiceId=TFqzf6t8BKh7vTGxfNBy&sku=Czg1xQxpwwf5ninBF6xq"
|
|
},
|
|
/** LEVEL TWO INTERIOR */
|
|
{
|
|
"title" : "Level Two Exterior",
|
|
"subtitle" : "Most Popular.",
|
|
"left" : {
|
|
"header" : "Description",
|
|
"paragraph" : "For those who want their car to shine, be safe and protected from harsh elements, self clean, and be a breeze to wash. (Previously 'Wash, Clay, Seal')",
|
|
"bullets" : []
|
|
},
|
|
"right" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Hand wash & dry",
|
|
"Bug gut removal",
|
|
"Tire, wheel, wheel well cleaning, and tire shine",
|
|
"Clay mitt to remove embedded contamination",
|
|
"3 to 6 month ceramic paint sealant: gloss, protection, hydrophobic & self-cleaning properties"
|
|
]
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/yT4vtoWKB5qGaQMaxOdd?productServiceId=bc8YSJd6fl0CprnAY43r&sku=iUA7y7dwM4Kz51pBpQNI"
|
|
}
|
|
],
|
|
"interior" : [
|
|
/** LEVEL ONE INTERIOR */
|
|
{
|
|
"title" : "Level One Interior",
|
|
"subtitle" : "A deep clean of your car's interior.",
|
|
"left" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Vacuum & light carpet shampooing",
|
|
"Plastics, leather, and vinyls cleaning",
|
|
"Light seat shampooing",
|
|
"Interior & exterior window cleaning",
|
|
"Crack & crevice cleaning"
|
|
]
|
|
},
|
|
"right" : {
|
|
"header" : "",
|
|
"paragraph" : "",
|
|
"bullets" : []
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/iy5yKtAhm0O0w0P05acA?productServiceId=3LCNMgeB58hjFwhg58BU&sku=MuCpgSMV0hU4sUdjAPBi"
|
|
},
|
|
/** LEVEL TWO INTERIOR */
|
|
{
|
|
"title" : "Level Two Interior",
|
|
"subtitle" : "Bring back the interior you love & protect it for months.",
|
|
"left" : {
|
|
"header" : "Includes",
|
|
"paragraph" : "",
|
|
"bullets" : [
|
|
"Upholstery shampooing",
|
|
"Crack & crevice cleaning",
|
|
"6 month interior protection (Spills, UV, less dust, less cleaning, and plastic rejuvenation)",
|
|
"Vacuum & carpet shampooing",
|
|
"Plastics, leather, and vinyls scrubbed",
|
|
"Leather conditioning for protection and suppleness"
|
|
]
|
|
},
|
|
"right" : {
|
|
"header" : "",
|
|
"paragraph" : "",
|
|
"bullets" : []
|
|
},
|
|
"url" : "https://app.urable.com/virtual-shop/IQlYjZyF1i2XilEiEKB5/yT4vtoWKB5qGaQMaxOdd?productServiceId=bc8YSJd6fl0CprnAY43r&sku=iUA7y7dwM4Kz51pBpQNI"
|
|
}
|
|
]
|
|
};
|
|
|
|
// renders service data as cards when page loads
|
|
function insertServices(serviceData) {
|
|
for (const category of categories) {
|
|
let categoryData = serviceData[category];
|
|
console.log(category);
|
|
console.log(categoryData);
|
|
|
|
let target = document.getElementById(category);
|
|
|
|
for (const service of categoryData) {
|
|
let leftSide = buildCardColumn(service.left);
|
|
let rightSide = buildCardColumn(service.right);
|
|
target.insertAdjacentHTML(
|
|
"beforeend",
|
|
`
|
|
<a class="service" href=${service.url} target="_blank">
|
|
<div class="card">
|
|
<div class="card-head">
|
|
<h2>${service.title}</h2>
|
|
<p>${service.subtitle}</p>
|
|
</div>
|
|
<div class="card-body">
|
|
${leftSide ? leftSide : ""}
|
|
${rightSide ? rightSide : ""}
|
|
</div>
|
|
</div>
|
|
</a>
|
|
`);
|
|
}
|
|
}
|
|
}
|
|
|
|
// helper for constructing service cards
|
|
function buildCardColumn(data) {
|
|
let html = "<span>";
|
|
if (data.header) {
|
|
html += "<h3 style='text-align:left;'>" + data.header + "</h3>";
|
|
}
|
|
if (data.paragraph) {
|
|
html += "<p>" + data.paragraph + "</p>";
|
|
}
|
|
if (data.bullets.length > 0) {
|
|
html += "<ul>";
|
|
for (point of data.bullets) {
|
|
html += "<li>" + point + "</li>";
|
|
}
|
|
html += "</ul>";
|
|
}
|
|
html += "</span>";
|
|
if (html == "<span></span>") return null;
|
|
return html;
|
|
}
|
|
|
|
window.onload = (event) => {
|
|
insertServices(serviceData);
|
|
|
|
// jump to category if coming from index/home page
|
|
let params = new URLSearchParams(document.location.search);
|
|
handleJump(params.get("jumpTarget"));
|
|
}
|
|
|
|
function handleJump(target) {
|
|
if (!target || !categories.includes(target)) return;
|
|
let destination = document.getElementById(target).getBoundingClientRect().top - 250;
|
|
window.scrollTo({ top: destination, left: 0, behavior: "smooth"});
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|
|
|