```html/* =========================
FORM VARIABLES
========================= */
.sc-form-wrap{
--sc-navy:#14263f;
--sc-blue:#2e4c78;
--sc-gold:#f5b719;
--sc-gold-light:#ffd700;
--sc-green:#25d366;
--sc-border:#d7dce3;
--sc-text:#172033;
--sc-muted:#6b7280;width:100%;
max-width:760px;
margin:0 auto;
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
}/* =========================
MAIN BOX
========================= */
.sc-quote-box{
background:rgba(15,23,42,.94);
border:1.5px solid var(--sc-gold);
padding:28px;
border-radius:6px;
box-shadow:0 18px 45px rgba(0,0,0,.35);
}/* =========================
FORM
========================= */
.sc-form{
display:flex;
flex-direction:column;
gap:14px;
}.sc-row{
display:grid;
grid-template-columns:1fr 1fr;
gap:14px;
}.sc-group{
position:relative;
display:flex;
flex-direction:column;
gap:6px;
min-width:0;
}.sc-group label{
color:#fff;
font-size:14px;
font-weight:700;
}.sc-group input,
.sc-group select,
.sc-group textarea{
width:100%;
max-width:100%;
min-width:0;
box-sizing:border-box;
background:#fff;
color:#222;
border:1px solid #fff;
border-radius:3px;
padding:11px 12px;
font-family:inherit;
font-size:14px;
outline:none;
transition:.2s ease;
}.sc-group input{
min-height:43px;
}.sc-group select{
min-height:43px;
cursor:pointer;
}.sc-group textarea{
resize:vertical;
min-height:85px;
}.sc-group input::placeholder,
.sc-group textarea::placeholder{
color:#777;
}.sc-group input:focus,
.sc-group select:focus,
.sc-group textarea:focus{
border-color:var(--sc-gold);
box-shadow:0 0 0 2px rgba(245,183,25,.35);
}/* =========================
ADDRESS
========================= */
.sc-address-wrap{
display:flex;
gap:6px;
}.sc-address-wrap input{
flex:1;
}.sc-map-btn{
width:48px;
min-width:48px;
background:#fff;
border:1px solid #d1d5db;
color:#14263f;
display:flex;
align-items:center;
justify-content:center;
text-decoration:none;
border-radius:3px;
font-size:20px;
}.sc-map-btn:hover{
background:#f3f4f6;
}.sc-callout-info{
color:#fde047;
font-size:12px;
margin-top:1px;
}/* =========================
AUTOCOMPLETE
========================= */
.sc-suggestions{
position:absolute;
top:100%;
left:0;
right:0;
margin-top:2px;
background:#fff;
border:1.5px solid var(--sc-gold);
border-radius:4px;
box-shadow:0 12px 28px rgba(0,0,0,.3);
max-height:230px;
overflow-y:auto;
z-index:999999;
display:none;
}.sc-suggestion{
padding:10px 12px;
color:#1f2937;
font-size:13px;
cursor:pointer;
border-bottom:1px solid #edf0f3;
display:flex;
align-items:center;
justify-content:space-between;
gap:10px;
}.sc-suggestion:last-child{
border-bottom:0;
}.sc-suggestion:hover,
.sc-suggestion:focus{
background:#f5f7fa;
color:#14263f;
}.sc-distance{
white-space:nowrap;
font-size:11px;
background:#eef2f7;
color:#64748b;
border-radius:20px;
padding:3px 7px;
}/* =========================
DISCOUNT
========================= */
.sc-discount{
display:flex;
align-items:center;
gap:10px;
padding:11px 13px;
border:1px dashed rgba(245,183,25,.7);
background:rgba(255,255,255,.07);
border-radius:4px;
cursor:pointer;
}.sc-discount input{
width:18px;
height:18px;
margin:0;
accent-color:var(--sc-gold);
cursor:pointer;
}.sc-discount label{
color:#fff;
font-size:13px;
font-weight:700;
cursor:pointer;
}/* =========================
PRICE BOX
========================= */
.sc-price-box{
padding:14px 16px;
border:1px dashed var(--sc-gold);
background:rgba(255,215,0,.07);
border-radius:4px;
color:#fff;
display:flex;
flex-direction:column;
gap:7px;
font-size:13px;
}.sc-price-line{
display:flex;
justify-content:space-between;
align-items:center;
gap:12px;
}.sc-price-line strong{
text-align:right;
}.sc-discount-line{
display:none;
color:#4ade80;
font-weight:700;
}.sc-total{
border-top:1px solid rgba(245,183,25,.4);
margin-top:4px;
padding-top:8px;
font-size:14px;
}.sc-total strong{
color:var(--sc-gold-light);
font-size:19px;
font-weight:900;
}/* =========================
SUBMIT
========================= */
.sc-submit{
width:100%;
border:0;
border-radius:3px;
background:var(--sc-gold);
color:#fff;
padding:14px;
font-size:14px;
font-weight:800;
letter-spacing:1px;
text-transform:uppercase;
cursor:pointer;
transition:.25s ease;
}.sc-submit:hover{
background:#dfa40b;
transform:translateY(-1px);
}.sc-submit.ready{
background:var(--sc-green);
box-shadow:0 7px 22px rgba(37,211,102,.4);
animation:scPulse 2s infinite;
}.sc-submit.ready:hover{
background:#1eb956;
}@keyframes scPulse{
0%{box-shadow:0 0 0 0 rgba(37,211,102,.45)}
70%{box-shadow:0 0 0 10px rgba(37,211,102,0)}
100%{box-shadow:0 0 0 0 rgba(37,211,102,0)}
}/* =========================
VALIDATION
========================= */
.sc-error{
color:#fca5a5;
font-size:11px;
display:none;
}.sc-invalid{
border-color:#ef4444 !important;
}/* =========================
MOBILE
========================= */
@media(max-width:600px){.sc-quote-box{
padding:20px 15px;
}.sc-row{
grid-template-columns:1fr;
gap:14px;
}}/* =========================================================
END CSS
========================================================= */
(function(){"use strict";/* =====================================================
SHINECRAFT SETTINGS
===================================================== */const WHATSAPP_NUMBER = "61400889093";const BASE_LOCATION = "Pakenham VIC 3810";const CALLOUT_RATE = 0.75;/* =====================================================
SUBURBS + DISTANCE FROM PAKENHAM
===================================================== */const suburbs = [{name:"Pakenham VIC 3810",km:0},
{name:"Pakenham South VIC 3810",km:6},
{name:"Officer VIC 3809",km:7},
{name:"Rythdale VIC 3810",km:8},
{name:"Officer South VIC 3809",km:9},
{name:"Nar Nar Goon VIC 3812",km:9},
{name:"Pakenham Upper VIC 3810",km:10},
{name:"Beaconsfield VIC 3807",km:12},
{name:"Cora Lynn VIC 3814",km:14},
{name:"Beaconsfield Upper VIC 3808",km:15},
{name:"Berwick VIC 3806",km:16},
{name:"Tynong VIC 3813",km:16},
{name:"Tynong North VIC 3813",km:18},
{name:"Clyde North VIC 3978",km:18},
{name:"Garfield VIC 3814",km:20},
{name:"Garfield North VIC 3814",km:22},
{name:"Koo Wee Rup VIC 3981",km:21},
{name:"Koo Wee Rup North VIC 3981",km:19},
{name:"Narre Warren VIC 3805",km:21},
{name:"Clyde VIC 3978",km:22},
{name:"Cranbourne East VIC 3977",km:22},
{name:"Narre Warren South VIC 3805",km:23},
{name:"Narre Warren North VIC 3804",km:23},
{name:"Cranbourne North VIC 3977",km:24},
{name:"Harkaway VIC 3806",km:22},
{name:"Hallam VIC 3803",km:25},
{name:"Bayles VIC 3981",km:24},
{name:"Bunyip VIC 3815",km:26},
{name:"Cranbourne VIC 3977",km:26},
{name:"Cranbourne West VIC 3977",km:27},
{name:"Cranbourne South VIC 3977",km:27},
{name:"Hampton Park VIC 3976",km:27},
{name:"Endeavour Hills VIC 3802",km:28},
{name:"Lynbrook VIC 3975",km:28},
{name:"Lyndhurst VIC 3975",km:30},
{name:"Devon Meadows VIC 3977",km:28},
{name:"Pearcedale VIC 3912",km:34},
{name:"Tooradin VIC 3980",km:28},
{name:"Lang Lang VIC 3984",km:33},{name:"Doveton VIC 3177",km:29},
{name:"Eumemmerring VIC 3177",km:29},
{name:"Dandenong South VIC 3175",km:32},
{name:"Dandenong VIC 3175",km:33},
{name:"Dandenong North VIC 3175",km:33},
{name:"Noble Park VIC 3174",km:37},
{name:"Keysborough VIC 3173",km:36},
{name:"Rowville VIC 3178",km:36},
{name:"Lysterfield VIC 3156",km:32},
{name:"Scoresby VIC 3179",km:39},
{name:"Knoxfield VIC 3180",km:41},
{name:"Ferntree Gully VIC 3156",km:38},
{name:"Boronia VIC 3155",km:42},
{name:"Bayswater VIC 3153",km:45},
{name:"Wantirna VIC 3152",km:44},
{name:"Springvale VIC 3171",km:40},
{name:"Clayton VIC 3168",km:44},
{name:"Mulgrave VIC 3170",km:41},
{name:"Wheelers Hill VIC 3150",km:42},
{name:"Glen Waverley VIC 3150",km:46},
{name:"Mount Waverley VIC 3149",km:48},
{name:"Oakleigh VIC 3166",km:47},
{name:"Chadstone VIC 3148",km:49},{name:"Carrum Downs VIC 3201",km:39},
{name:"Patterson Lakes VIC 3197",km:41},
{name:"Carrum VIC 3197",km:43},
{name:"Bonbeach VIC 3196",km:44},
{name:"Chelsea VIC 3196",km:45},
{name:"Chelsea Heights VIC 3196",km:42},
{name:"Edithvale VIC 3196",km:46},
{name:"Aspendale VIC 3195",km:47},
{name:"Mordialloc VIC 3195",km:48},
{name:"Mentone VIC 3194",km:51},
{name:"Moorabbin VIC 3189",km:50},
{name:"Cheltenham VIC 3192",km:51},
{name:"Highett VIC 3190",km:53},
{name:"Beaumaris VIC 3193",km:54},
{name:"Black Rock VIC 3193",km:55},
{name:"Sandringham VIC 3191",km:56},
{name:"Hampton VIC 3188",km:56},
{name:"Brighton VIC 3186",km:58},{name:"Seaford VIC 3198",km:41},
{name:"Frankston North VIC 3200",km:40},
{name:"Frankston VIC 3199",km:44},
{name:"Frankston South VIC 3199",km:47},
{name:"Karingal VIC 3199",km:42},
{name:"Langwarrin VIC 3910",km:38},
{name:"Somerville VIC 3912",km:46},
{name:"Tyabb VIC 3913",km:49},
{name:"Hastings VIC 3915",km:53},
{name:"Mount Eliza VIC 3930",km:49},
{name:"Mornington VIC 3931",km:56},
{name:"Mount Martha VIC 3934",km:61},
{name:"Safety Beach VIC 3936",km:67},
{name:"Dromana VIC 3936",km:69},
{name:"Rosebud VIC 3939",km:76},
{name:"Rye VIC 3941",km:84},
{name:"Sorrento VIC 3943",km:94},
{name:"Portsea VIC 3944",km:98},{name:"Emerald VIC 3782",km:27},
{name:"Avonsleigh VIC 3782",km:25},
{name:"Clematis VIC 3782",km:29},
{name:"Cockatoo VIC 3781",km:24},
{name:"Gembrook VIC 3783",km:22},
{name:"Belgrave VIC 3160",km:33},
{name:"Upwey VIC 3158",km:36},
{name:"Olinda VIC 3788",km:43},
{name:"Lilydale VIC 3140",km:54},
{name:"Chirnside Park VIC 3116",km:55},
{name:"Coldstream VIC 3770",km:60},
{name:"Yarra Glen VIC 3775",km:68},
{name:"Healesville VIC 3777",km:74},{name:"Ringwood VIC 3134",km:50},
{name:"Ringwood East VIC 3135",km:49},
{name:"Heathmont VIC 3135",km:46},
{name:"Vermont VIC 3133",km:47},
{name:"Mitcham VIC 3132",km:50},
{name:"Nunawading VIC 3131",km:51},
{name:"Forest Hill VIC 3131",km:48},
{name:"Blackburn VIC 3130",km:52},
{name:"Box Hill VIC 3128",km:54},
{name:"Burwood VIC 3125",km:51},
{name:"Doncaster VIC 3108",km:56},{name:"Camberwell VIC 3124",km:54},
{name:"Hawthorn VIC 3122",km:57},
{name:"Kew VIC 3101",km:59},
{name:"Malvern VIC 3144",km:53},
{name:"Toorak VIC 3142",km:56},
{name:"Caulfield VIC 3162",km:52},
{name:"Bentleigh VIC 3204",km:50},
{name:"St Kilda VIC 3182",km:59},
{name:"South Yarra VIC 3141",km:59},
{name:"Melbourne CBD VIC 3000",km:60},
{name:"Richmond VIC 3121",km:57},{name:"Brunswick VIC 3056",km:64},
{name:"Coburg VIC 3058",km:67},
{name:"Preston VIC 3072",km:66},
{name:"Footscray VIC 3011",km:66},
{name:"Williamstown VIC 3016",km:68},
{name:"Altona VIC 3018",km:71},
{name:"Point Cook VIC 3030",km:75},
{name:"Werribee VIC 3030",km:79},
{name:"Sunshine VIC 3020",km:70},{name:"Longwarry VIC 3816",km:34},
{name:"Drouin VIC 3818",km:38},
{name:"Warragul VIC 3820",km:45},
{name:"Moe VIC 3825",km:79},
{name:"Morwell VIC 3840",km:93},
{name:"Traralgon VIC 3844",km:106},
{name:"Nyora VIC 3987",km:38},
{name:"Korumburra VIC 3950",km:58},
{name:"Leongatha VIC 3953",km:72},
{name:"Phillip Island VIC 3922",km:82}];/* =====================================================
PRICING MATRIX
===================================================== */const pricing = {mini:{
sedan:99,
suv_small:115,
suv_large:129,
name:"Mini Car Detail"
},interior:{
sedan:149,
suv_small:169,
suv_large:189,
name:"Deep Interior Restoration Detail"
},full:{
sedan:249,
suv_small:289,
suv_large:329,
name:"Full Interior & Exterior Detail"
},presale:{
sedan:249,
suv_small:289,
suv_large:329,
name:"Pre-Sale Makeover Detail"
},correction:{
sedan:275,
suv_small:299,
suv_large:329,
name:"Paint Correction: Cut & Polish"
},showroom:{
sedan:399,
suv_small:425,
suv_large:499,
name:"The Showroom Perfection Detail"
},ceramic:{
sedan:699,
suv_small:799,
suv_large:999,
name:"9H Ceramic Coating Protection"
},commercial:{
default:189,
name:"Commercial Van & Truck Detailing"
},bike:{
sedan:149,
suv_small:149,
suv_large:189,
default:149,
name:"Motorbike & Scooter Precision Detail"
},marine:{
default:699,
name:"Marine & Boat Full Detailing"
},caravan:{
default:70,
name:"Caravan & Motorhome Detailing"
},other:{
default:0,
name:"Custom Fleet / Other Service"
}};/* =====================================================
ELEMENTS
===================================================== */const form = document.getElementById("shineCraftQuoteForm");const nameInput = document.getElementById("scName");
const phoneInput = document.getElementById("scPhone");
const emailInput = document.getElementById("scEmail");
const dateInput = document.getElementById("scDate");const addressInput = document.getElementById("scAddress");
const suggestions = document.getElementById("scSuggestions");const vehicleSize = document.getElementById("scVehicleSize");
const vehicleModel = document.getElementById("scVehicleModel");const serviceSelect = document.getElementById("scService");const discountCheckbox =
document.getElementById("scInstagramDiscount");const mapLink =
document.getElementById("scMapLink");const submitButton =
document.getElementById("scSubmit");const servicePrice =
document.getElementById("scServicePrice");const discountLine =
document.getElementById("scDiscountLine");const discountPrice =
document.getElementById("scDiscountPrice");const distanceText =
document.getElementById("scDistanceText");const calloutPrice =
document.getElementById("scCalloutPrice");const totalPrice =
document.getElementById("scTotalPrice");let selectedKm = 0;/* =====================================================
FORMAT CURRENCY
===================================================== */function money(value){
return "$" + Math.round(value);
}/* =====================================================
ADDRESS AUTOCOMPLETE
===================================================== */addressInput.addEventListener("input",function(){const query =
addressInput.value.trim().toLowerCase();selectedKm = 0;if(query.length < 2){suggestions.style.display="none";
suggestions.innerHTML="";calculate();return;
}const matches = suburbs.filter(function(item){return item.name
.toLowerCase()
.includes(query);});suggestions.innerHTML="";if(!matches.length){suggestions.style.display="none";calculate();return;}matches.slice(0,8).forEach(function(item){const div =
document.createElement("div");div.className="sc-suggestion";div.tabIndex=0;div.innerHTML =
"
"+item.name+" "+
"
~"+
item.km+
" km ";function selectAddress(){addressInput.value=item.name;selectedKm=item.km;suggestions.style.display="none";updateMap();calculate();checkForm();}div.addEventListener(
"click",
selectAddress
);div.addEventListener(
"keydown",
function(e){if(e.key==="Enter"){e.preventDefault();selectAddress();}}
);suggestions.appendChild(div);});suggestions.style.display="block";});/* =====================================================
CLOSE AUTOCOMPLETE OUTSIDE
===================================================== */document.addEventListener("click",function(e){if(
!addressInput.contains(e.target) &&
!suggestions.contains(e.target)
){suggestions.style.display="none";}});/* =====================================================
MAP LINK
===================================================== */function updateMap(){const address =
addressInput.value.trim();if(address){mapLink.href =
"https://www.google.com/maps/dir/?api=1"+
"&origin="+
encodeURIComponent(BASE_LOCATION)+
"&destination="+
encodeURIComponent(address);}else{mapLink.href =
"https://www.google.com/maps/dir/?api=1"+
"&origin="+
encodeURIComponent(BASE_LOCATION);}}/* =====================================================
GET DISTANCE
===================================================== */function getDistance(){const address =
addressInput.value.trim().toLowerCase();if(selectedKm > 0){return selectedKm;}if(!address){return 0;}const found =
suburbs.find(function(item){return address.includes(
item.name
.split(" ")[0]
.toLowerCase()
);});if(found){return found.km;}if(address.includes("pakenham")){return 0;}return 20;}/* =====================================================
CALCULATE PRICE
===================================================== */function calculate(){const service =
serviceSelect.value;const size =
vehicleSize.value;const km =
getDistance();const calloutFee =
Math.round(km * CALLOUT_RATE);if(!addressInput.value.trim()){distanceText.textContent =
"Pakenham Base";calloutPrice.textContent =
"$0";}else if(km===0){distanceText.textContent =
"Pakenham (0 km)";calloutPrice.textContent =
"$0 (FREE)";}else{distanceText.textContent =
"~"+km+" km from Pakenham";calloutPrice.textContent =
"$"+calloutFee+
" ($0.75/km)";}if(!service){servicePrice.textContent="$0";discountLine.style.display="none";totalPrice.textContent =
"Select service & size";return {
basePrice:0,
discountAmount:0,
discountedBase:0,
calloutFee:calloutFee,
grandTotal:0,
km:km,
isHourly:false
};}const serviceData =
pricing[service];let basePrice=0;let hourly=false;if(service==="caravan"){hourly=true;basePrice=70;}else if(serviceData[size]){basePrice =
serviceData[size];}else if(serviceData.default){basePrice =
serviceData.default;}else if(size==="suv_small"){basePrice =
serviceData.suv_small ||
serviceData.sedan ||
169;}else if(
size==="suv_large" ||
size==="van_truck"
){basePrice =
serviceData.suv_large ||
189;}else{basePrice =
serviceData.sedan ||
serviceData.default ||
149;}let discountAmount=0;if(
discountCheckbox.checked &&
basePrice>0
){discountAmount =
Math.round(basePrice*0.15);}const discountedBase =
basePrice-discountAmount;servicePrice.textContent =
hourly
? money(basePrice)+"/hr"
: money(basePrice);if(
discountCheckbox.checked &&
discountAmount>0
){discountLine.style.display="flex";discountPrice.textContent =
hourly
? "-"+money(discountAmount)+"/hr (15%)"
: "-"+money(discountAmount)+" (15%)";}else{discountLine.style.display="none";}const grandTotal =
discountedBase+calloutFee;if(hourly){totalPrice.textContent =
discountCheckbox.checked
? "From "+
money(discountedBase)+
"/hr (15% Off) + "+
money(calloutFee)+
" travel": "From "+
money(basePrice)+
"/hr + "+
money(calloutFee)+
" travel";}else{totalPrice.textContent =
discountCheckbox.checked
? money(grandTotal)+
" (Saved "+
money(discountAmount)+
")": money(grandTotal);}return {basePrice:basePrice,discountAmount:discountAmount,discountedBase:discountedBase,isDiscountApplied:
discountCheckbox.checked,calloutFee:calloutFee,grandTotal:grandTotal,km:km,isHourly:hourly,serviceName:
serviceData.name};}/* =====================================================
FORM COMPLETION
===================================================== */function checkForm(){calculate();const validName =
nameInput.value.trim().length>1;const validPhone =
phoneInput.value.trim().length>6;const validEmail =
emailInput.value.trim().length>3 &&
emailInput.value.includes("@");const validAddress =
addressInput.value.trim().length>2;const validSize =
vehicleSize.value!=="";const validModel =
vehicleModel.value.trim().length>1;const validService =
serviceSelect.value!=="";if(
validName &&
validPhone &&
validEmail &&
validAddress &&
validSize &&
validModel &&
validService
){submitButton.classList.add("ready");submitButton.innerHTML =
"💬 SEND VIA WHATSAPP";}else{submitButton.classList.remove("ready");submitButton.innerHTML =
"REQUEST A QUOTE";}}/* =====================================================
LIVE EVENTS
===================================================== */form.addEventListener(
"input",
checkForm
);form.addEventListener(
"change",
checkForm
);/* =====================================================
FORM SUBMIT
===================================================== */form.addEventListener("submit",function(e){e.preventDefault();const values =
calculate();if(
nameInput.value.trim().length<2 ||
phoneInput.value.trim().length<7 ||
!emailInput.value.includes("@") ||
addressInput.value.trim().length<3 ||
!vehicleSize.value ||
vehicleModel.value.trim().length0
){lines.push(
"*15% Follower Discount:* -"+
money(values.discountAmount)+
(values.isHourly ? "/hr" : "")+
" (Service fee only)"
);lines.push(
"*Discounted Service Price:* "+
money(values.discountedBase)+
(values.isHourly ? "/hr" : "")
);}lines.push(
"*Call-Out Distance:* ~"+
values.km+
" km from Pakenham"
);lines.push(
"*Call-Out Fee (@ $0.75/km):* "+
money(values.calloutFee)
);if(values.isHourly){lines.push(
"*TOTAL ESTIMATE:* From "+
money(values.discountedBase)+
"/hr + "+
money(values.calloutFee)+
" travel"
);}else{lines.push(
"*TOTAL ESTIMATE:* "+
money(values.grandTotal)
);}if(date){lines.push(
"*Preferred Date:* "+
date
);}if(message){lines.push(
"*Message / Condition:* "+
message
);}const finalMessage =
lines.join("\n");const whatsappURL =
"https://api.whatsapp.com/send?phone="+
WHATSAPP_NUMBER+
"&text="+
encodeURIComponent(finalMessage);window.open(
whatsappURL,
"_blank",
"noopener,noreferrer"
);});/* =====================================================
INITIAL STATE
===================================================== */updateMap();calculate();checkForm();})();```
/* =========================================================
COMPACT GOLD QUOTE FORM
ORIGINAL DESIGN PRESERVED
========================================================= */.gold-quote-box {
background: rgba(15, 23, 42, 0.88);
border: 1.5px solid #f5b719;
padding: 20px 22px;
backdrop-filter: blur(10px);
border-radius: 6px;
box-shadow: 0 14px 35px rgba(0, 0, 0, 0.45);
}.gold-quote-box h3 {
color: #ffffff;
font-size: 1.15rem;
font-weight: 800;
margin-bottom: 12px;
text-align: center;
}.gold-quote-form {
display: flex;
flex-direction: column;
gap: 10px;
}.compact-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}.form-field {
display: flex;
flex-direction: column;
gap: 4px;
text-align: left;
}.form-field.full {
grid-column: span 2;
}.form-field label {
color: #e2e8f0;
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.3px;
text-transform: uppercase;
}.form-field input,
.form-field select {
width: 100%;
background: #ffffff;
color: #1f2937;
border: 1px solid #cbd5e1;
border-radius: 4px;
padding: 8px 10px;
font-size: 0.86rem;
font-family: inherit;
outline: none;
height: 38px;
transition: border-color 0.2s, box-shadow 0.2s;
box-sizing: border-box;
}.form-field select {
cursor: pointer;
}.form-field input:focus,
.form-field select:focus {
border-color: #f5b719;
box-shadow: 0 0 0 2px rgba(245, 183, 25, 0.3);
}.form-field input::placeholder {
color: #94a3b8;
font-size: 0.82rem;
}/* =========================================================
ESTIMATE CARD
========================================================= */.compact-estimate-card {
background: rgba(255, 215, 0, 0.08);
border: 1px dashed rgba(245, 183, 25, 0.5);
border-radius: 6px;
padding: 8px 12px;
display: flex;
flex-direction: column;
gap: 4px;
margin-top: 2px;
}.compact-totals {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 0.85rem;
color: #ffffff;
}.compact-totals strong {
color: #ffd700;
font-size: 1.15rem;
font-weight: 800;
}.travel-subtext {
font-size: 0.72rem;
color: #cbd5e1;
text-align: right;
}/* =========================================================
SUBMIT BUTTON
========================================================= */.gold-submit-btn {
width: 100%;
background: #f5b719;
color: #14263f !important;
font-size: 0.88rem;
font-weight: 800;
letter-spacing: 0.8px;
text-transform: uppercase;
padding: 11px;
border: none;
border-radius: 4px;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
transition: all 0.25s ease;
margin-top: 4px;
}.gold-submit-btn:hover {
background: #e0a30b;
}.gold-submit-btn:disabled {
opacity: 0.7;
cursor: not-allowed;
}/* =========================================================
SUCCESS / ERROR MESSAGE
========================================================= */.sc-form-message {
display: none;
padding: 8px 10px;
border-radius: 4px;
font-size: 0.75rem;
line-height: 1.4;
margin-top: 2px;
}.sc-form-message.error {
display: block;
background: rgba(220, 38, 38, 0.12);
border: 1px solid rgba(248, 113, 113, 0.5);
color: #fecaca;
}/* =========================================================
MOBILE
========================================================= */@media (max-width: 600px) {.compact-grid {
grid-template-columns: 1fr;
}.form-field.full {
grid-column: span 1;
}}
Get Your Fast Estimate
Email *
Vehicle Size *
Select Vehicle Size
Sedan / Hatchback / Coupe
Small SUV / Crossover / Wagon
Large SUV / 4WD / 7-Seat / Dual Cab
Commercial Van / Tradie Ute / Truck
Motorbike / Scooter
Boat / Marine / Jet Ski
Caravan / Motorhome / RV
Select Service Package *
Select Services
Mini Car Detail
Deep Interior Restoration Detail
Full Interior & Exterior Detail
Paint Correction: Cut & Polish
The Showroom Perfection Detail
9H Ceramic Coating Protection
Commercial Van & Truck Detailing
Motorbike & Scooter Precision Detail
Marine & Boat Full Detailing
Caravan & Motorhome Detailing
Estimated Package Price:
$0
Call-out rate: $0.75 per km from Pakenham
(Exempt from discounts)
REQUEST A QUOTE
(function () {function initShineCraftForm() {const form =
document.getElementById("heroQuoteForm");const btn =
document.getElementById("heroSubmitBtn");if (!form || !btn) {
return;
}/* =====================================================
PREVENT DOUBLE INITIALIZATION
====================================================== */if (form.dataset.initialized === "true") {
return;
}form.dataset.initialized = "true";/* =====================================================
ELEMENTS
====================================================== */const sizeSelect =
form.querySelector('[name="vehicle_size"]');const serviceSelect =
form.querySelector('[name="service"]');const totalDisplay =
form.querySelector(".price-estimate-text");const messageBox =
document.getElementById("scFormMessage");/* =====================================================
PRICING MATRIX
====================================================== */const pricingMatrix = {mini: {
sedan: 99,
small_suv: 115,
large_suv: 129,
default: 99
},interior: {
sedan: 149,
small_suv: 169,
large_suv: 189,
default: 149
},full: {
sedan: 249,
small_suv: 289,
large_suv: 329,
default: 249
},presale: {
sedan: 249,
small_suv: 289,
large_suv: 329,
default: 249
},correction: {
sedan: 275,
small_suv: 299,
large_suv: 329,
default: 275
},showroom: {
sedan: 399,
small_suv: 425,
large_suv: 499,
default: 399
},ceramic: {
sedan: 699,
small_suv: 799,
large_suv: 999,
default: 699
},commercial: {
default: 189
},bike: {
default: 149
},marine: {
default: 699
},caravan: {
default: 70
},other: {
default: 0
}};/* =====================================================
GET PRICE
====================================================== */function getPrice() {const serviceValue =
serviceSelect.value;const vehicleValue =
sizeSelect.value;if (
!serviceValue ||
!pricingMatrix[serviceValue]
) {return {
price: 0,
isHourly: false
};}const item =
pricingMatrix[serviceValue];let price = 0;if (
item[vehicleValue] !== undefined
) {price =
item[vehicleValue];} else {price =
item.default || 0;
}return {price: price,isHourly:
serviceValue === "caravan"};}/* =====================================================
UPDATE PRICE
====================================================== */function updatePrice() {const calc =
getPrice();if (calc.price > 0) {totalDisplay.textContent =
calc.isHourly
? "$" + calc.price + "/hr"
: "$" + calc.price;} else {totalDisplay.textContent =
"$0";}}/* =====================================================
BUTTON STATE
====================================================== */function updateButtonState() {if (!form.checkValidity()) {btn.classList.remove(
"is-ready"
);btn.innerHTML =
"
REQUEST A QUOTE ";return;
}btn.classList.add(
"is-ready"
);btn.innerHTML =
"
REQUEST A QUOTE ";}/* =====================================================
FIELD EVENTS
====================================================== */form.addEventListener(
"input",
function () {updatePrice();
updateButtonState();}
);form.addEventListener(
"change",
function () {updatePrice();
updateButtonState();}
);/* =====================================================
SUBMIT
====================================================== */form.addEventListener(
"submit",
function (e) {e.preventDefault();/* -----------------------------
CLEAR MESSAGE
----------------------------- */messageBox.style.display =
"none";messageBox.classList.remove(
"error"
);messageBox.textContent =
"";/* -----------------------------
VALIDATION
----------------------------- */if (!form.checkValidity()) {form.reportValidity();updateButtonState();return;}/* -----------------------------
BUTTON
----------------------------- */btn.disabled = true;btn.classList.remove(
"is-ready"
);btn.innerHTML =
"
SUBMITTING... ";/* -----------------------------
FORM DATA
----------------------------- */const formData =
new FormData(form);formData.append(
"action",
"shinecraft_submit_quote"
);formData.append(
"page_url",
window.location.href
);/* =================================================
WORDPRESS AJAX
================================================= */const ajaxUrl =
window.location.origin +
"/wp-admin/admin-ajax.php";fetch(
ajaxUrl,
{
method: "POST",credentials: "same-origin",body: formData
}
).then(function (response) {if (!response.ok) {throw new Error(
"HTTP " +
response.status
);}return response.json();}).then(function (result) {/* -----------------------------
SUCCESS
----------------------------- */if (
result &&
result.success === true
) {btn.innerHTML =
"
SUBMITTED ";window.location.href =
"https://shinecraftdetailinghub.com/thank-you/";return;}/* -----------------------------
ERROR
----------------------------- */let errorMessage =
"Unable to submit your request. Please try again.";if (
result &&
result.data &&
result.data.message
) {errorMessage =
result.data.message;}messageBox.textContent =
errorMessage;messageBox.classList.add(
"error"
);messageBox.style.display =
"block";btn.disabled = false;btn.innerHTML =
"
REQUEST A QUOTE ";}).catch(function (error) {console.error(
"ShineCraft Form Error:",
error
);messageBox.textContent =
"Something went wrong. Please try again.";messageBox.classList.add(
"error"
);messageBox.style.display =
"block";btn.disabled = false;btn.innerHTML =
"
REQUEST A QUOTE ";});}
);/* =====================================================
INITIAL PRICE
====================================================== */updatePrice();}/* =========================================================
INITIALIZE
========================================================= */if (
document.readyState === "loading"
) {document.addEventListener(
"DOMContentLoaded",
initShineCraftForm
);} else {initShineCraftForm();}})();