Spaces:
Running
Running
can you complete the build...all other pages
Browse files- about.html +356 -0
- b2b.html +1 -2
- components/footer.js +351 -0
- components/navbar.js +372 -0
- contact.html +1 -2
- index.html +0 -1
- products.html +1 -2
- script.js +383 -1
about.html
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>About Us - PalletPal Pro</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
darkMode: 'class',
|
| 15 |
+
theme: {
|
| 16 |
+
extend: {
|
| 17 |
+
colors: {
|
| 18 |
+
primary: {
|
| 19 |
+
50: '#f0fdf4',
|
| 20 |
+
100: '#dcfce7',
|
| 21 |
+
200: '#bbf7d0',
|
| 22 |
+
300: '#86efac',
|
| 23 |
+
400: '#4ade80',
|
| 24 |
+
500: '#22c55e',
|
| 25 |
+
600: '#16a34a',
|
| 26 |
+
700: '#15803d',
|
| 27 |
+
800: '#166534',
|
| 28 |
+
900: '#14532d',
|
| 29 |
+
},
|
| 30 |
+
secondary: {
|
| 31 |
+
50: '#fff7ed',
|
| 32 |
+
100: '#ffedd5',
|
| 33 |
+
200: '#fed7aa',
|
| 34 |
+
300: '#fdba74',
|
| 35 |
+
400: '#fb923c',
|
| 36 |
+
500: '#f97316',
|
| 37 |
+
600: '#ea580c',
|
| 38 |
+
700: '#c2410c',
|
| 39 |
+
800: '#9a3412',
|
| 40 |
+
900: '#7c2d12',
|
| 41 |
+
},
|
| 42 |
+
wood: {
|
| 43 |
+
50: '#fafaf9',
|
| 44 |
+
100: '#f5f5f4',
|
| 45 |
+
200: '#e7e5e4',
|
| 46 |
+
300: '#d6d3d1',
|
| 47 |
+
400: '#a8a29e',
|
| 48 |
+
500: '#78716c',
|
| 49 |
+
600: '#57534e',
|
| 50 |
+
700: '#44403c',
|
| 51 |
+
800: '#292524',
|
| 52 |
+
900: '#1c1917',
|
| 53 |
+
}
|
| 54 |
+
},
|
| 55 |
+
fontFamily: {
|
| 56 |
+
sans: ['Inter', 'system-ui', 'sans-serif'],
|
| 57 |
+
display: ['Playfair Display', 'serif'],
|
| 58 |
+
}
|
| 59 |
+
}
|
| 60 |
+
}
|
| 61 |
+
}
|
| 62 |
+
</script>
|
| 63 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Playfair+Display:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 64 |
+
</head>
|
| 65 |
+
<body class="font-sans antialiased bg-wood-50 text-wood-800 dark:bg-wood-900 dark:text-wood-100">
|
| 66 |
+
|
| 67 |
+
<custom-navbar></custom-navbar>
|
| 68 |
+
|
| 69 |
+
<!-- Page Header -->
|
| 70 |
+
<section class="relative py-20 bg-gradient-to-br from-primary-900 to-primary-800 text-white">
|
| 71 |
+
<div class="absolute inset-0 opacity-10">
|
| 72 |
+
<div class="absolute inset-0" style="background-image: url('data:image/svg+xml,%3Csvg width=\'40\' height=\'40\' viewBox=\'0 0 40 40\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cg fill=\'%23ffffff\' fill-opacity=\'1\' fill-rule=\'evenodd\'%3E%3Cpath d=\'M0 40L40 0H20L0 20M40 40V20L20 40\'/%3E%3C/g%3E%3C/svg%3E');"></div>
|
| 73 |
+
</div>
|
| 74 |
+
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 75 |
+
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
| 76 |
+
<div>
|
| 77 |
+
<h1 class="font-display text-4xl lg:text-5xl font-bold mb-2">About Us</h1>
|
| 78 |
+
<p class="text-primary-100 text-lg">Three decades of pallet excellence</p>
|
| 79 |
+
</div>
|
| 80 |
+
<div class="flex items-center gap-2 text-sm">
|
| 81 |
+
<a href="index.html" class="hover:text-primary-200">Home</a>
|
| 82 |
+
<i data-feather="chevron-right" class="w-4 h-4"></i>
|
| 83 |
+
<span class="text-primary-200">About</span>
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
</div>
|
| 87 |
+
</section>
|
| 88 |
+
|
| 89 |
+
<!-- Our Story -->
|
| 90 |
+
<section class="py-20">
|
| 91 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 92 |
+
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
| 93 |
+
<div>
|
| 94 |
+
<div class="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300 text-sm font-medium mb-6">
|
| 95 |
+
<i data-feather="clock" class="w-4 h-4"></i>
|
| 96 |
+
Est. 1995
|
| 97 |
+
</div>
|
| 98 |
+
<h2 class="font-display text-4xl font-bold mb-6">Our Story</h2>
|
| 99 |
+
<div class="space-y-4 text-wood-600 dark:text-wood-400 leading-relaxed">
|
| 100 |
+
<p>
|
| 101 |
+
PalletPal Pro began as a small family-owned sawmill in rural Illinois. What started as a modest operation producing wooden crates for local farmers has grown into one of the Midwest's premier pallet manufacturers and suppliers.
|
| 102 |
+
</p>
|
| 103 |
+
<p>
|
| 104 |
+
In 1995, founder James Morrison recognized the growing need for standardized shipping pallets as e-commerce began to transform American logistics. With three employees and a single nailing machine, he set out to build a company that would prioritize quality, sustainability, and customer service above all else.
|
| 105 |
+
</p>
|
| 106 |
+
<p>
|
| 107 |
+
Today, PalletPal Pro employs over 200 people across three facilities, producing more than 50,000 pallets monthly. We've served over 2,000 businesses, from local startups to Fortune 500 companies, always staying true to our roots of craftsmanship and integrity.
|
| 108 |
+
</p>
|
| 109 |
+
</div>
|
| 110 |
+
|
| 111 |
+
<div class="flex gap-8 mt-8 pt-8 border-t border-wood-200 dark:border-wood-700">
|
| 112 |
+
<div>
|
| 113 |
+
<div class="text-3xl font-bold text-primary-600">29</div>
|
| 114 |
+
<div class="text-sm text-wood-500 dark:text-wood-400">Years in Business</div>
|
| 115 |
+
</div>
|
| 116 |
+
<div>
|
| 117 |
+
<div class="text-3xl font-bold text-secondary-600">200+</div>
|
| 118 |
+
<div class="text-sm text-wood-500 dark:text-wood-400">Team Members</div>
|
| 119 |
+
</div>
|
| 120 |
+
<div>
|
| 121 |
+
<div class="text-3xl font-bold text-wood-700 dark:text-wood-300">3</div>
|
| 122 |
+
<div class="text-sm text-wood-500 dark:text-wood-400">Facilities</div>
|
| 123 |
+
</div>
|
| 124 |
+
</div>
|
| 125 |
+
</div>
|
| 126 |
+
|
| 127 |
+
<div class="relative">
|
| 128 |
+
<img src="http://static.photos/industry/640x640/301" alt="PalletPal Pro History" class="rounded-3xl shadow-2xl">
|
| 129 |
+
<div class="absolute -bottom-6 -right-6 bg-white dark:bg-wood-800 p-6 rounded-2xl shadow-xl">
|
| 130 |
+
<div class="text-4xl font-bold text-primary-600 mb-1">2M+</div>
|
| 131 |
+
<div class="text-sm text-wood-600 dark:text-wood-400">Pallets Produced</div>
|
| 132 |
+
</div>
|
| 133 |
+
</div>
|
| 134 |
+
</div>
|
| 135 |
+
</div>
|
| 136 |
+
</section>
|
| 137 |
+
|
| 138 |
+
<!-- Values -->
|
| 139 |
+
<section class="py-20 bg-wood-100 dark:bg-wood-800/50">
|
| 140 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 141 |
+
<div class="text-center max-w-3xl mx-auto mb-16">
|
| 142 |
+
<h2 class="font-display text-4xl font-bold mb-4">Our Values</h2>
|
| 143 |
+
<p class="text-wood-600 dark:text-wood-400 text-lg">The principles that guide every pallet we build and every relationship we nurture.</p>
|
| 144 |
+
</div>
|
| 145 |
+
|
| 146 |
+
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
| 147 |
+
<div class="bg-white dark:bg-wood-800 p-8 rounded-2xl shadow-lg text-center">
|
| 148 |
+
<div class="w-16 h-16 bg-primary-100 dark:bg-primary-900/30 rounded-2xl flex items-center justify-center mx-auto mb-4">
|
| 149 |
+
<i data-feather="shield" class="w-8 h-8 text-primary-600"></i>
|
| 150 |
+
</div>
|
| 151 |
+
<h3 class="font-semibold text-lg mb-2">Quality First</h3>
|
| 152 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">Every pallet meets rigorous standards before leaving our facility.</p>
|
| 153 |
+
</div>
|
| 154 |
+
|
| 155 |
+
<div class="bg-white dark:bg-wood-800 p-8 rounded-2xl shadow-lg text-center">
|
| 156 |
+
<div class="w-16 h-16 bg-secondary-100 dark:bg-secondary-900/30 rounded-2xl flex items-center justify-center mx-auto mb-4">
|
| 157 |
+
<i data-feather="leaf" class="w-8 h-8 text-secondary-600"></i>
|
| 158 |
+
</div>
|
| 159 |
+
<h3 class="font-semibold text-lg mb-2">Sustainability</h3>
|
| 160 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">100% of our wood comes from certified sustainable sources.</p>
|
| 161 |
+
</div>
|
| 162 |
+
|
| 163 |
+
<div class="bg-white dark:bg-wood-800 p-8 rounded-2xl shadow-lg text-center">
|
| 164 |
+
<div class="w-16 h-16 bg-primary-100 dark:bg-primary-900/30 rounded-2xl flex items-center justify-center mx-auto mb-4">
|
| 165 |
+
<i data-feather="users" class="w-8 h-8 text-primary-600"></i>
|
| 166 |
+
</div>
|
| 167 |
+
<h3 class="font-semibold text-lg mb-2">People Focused</h3>
|
| 168 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">We invest in our team and treat every customer as a partner.</p>
|
| 169 |
+
</div>
|
| 170 |
+
|
| 171 |
+
<div class="bg-white dark:bg-wood-800 p-8 rounded-2xl shadow-lg text-center">
|
| 172 |
+
<div class="w-16 h-16 bg-secondary-100 dark:bg-secondary-900/30 rounded-2xl flex items-center justify-center mx-auto mb-4">
|
| 173 |
+
<i data-feather="zap" class="w-8 h-8 text-secondary-600"></i>
|
| 174 |
+
</div>
|
| 175 |
+
<h3 class="font-semibold text-lg mb-2">Innovation</h3>
|
| 176 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">Continuously improving our processes and products.</p>
|
| 177 |
+
</div>
|
| 178 |
+
</div>
|
| 179 |
+
</div>
|
| 180 |
+
</section>
|
| 181 |
+
|
| 182 |
+
<!-- Team -->
|
| 183 |
+
<section class="py-20">
|
| 184 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 185 |
+
<div class="text-center max-w-3xl mx-auto mb-16">
|
| 186 |
+
<h2 class="font-display text-4xl font-bold mb-4">Leadership Team</h2>
|
| 187 |
+
<p class="text-wood-600 dark:text-wood-400 text-lg">Meet the experienced professionals guiding PalletPal Pro into the future.</p>
|
| 188 |
+
</div>
|
| 189 |
+
|
| 190 |
+
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
| 191 |
+
<div class="bg-white dark:bg-wood-800 rounded-2xl overflow-hidden shadow-lg">
|
| 192 |
+
<img src="http://static.photos/people/400x400/401" alt="James Morrison" class="w-full h-64 object-cover">
|
| 193 |
+
<div class="p-6">
|
| 194 |
+
<h3 class="font-semibold text-lg">James Morrison</h3>
|
| 195 |
+
<p class="text-primary-600 text-sm mb-3">Founder & Chairman</p>
|
| 196 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">Started the company in 1995 with a vision for quality pallets.</p>
|
| 197 |
+
</div>
|
| 198 |
+
</div>
|
| 199 |
+
|
| 200 |
+
<div class="bg-white dark:bg-wood-800 rounded-2xl overflow-hidden shadow-lg">
|
| 201 |
+
<img src="http://static.photos/people/400x400/402" alt="Sarah Chen" class="w-full h-64 object-cover">
|
| 202 |
+
<div class="p-6">
|
| 203 |
+
<h3 class="font-semibold text-lg">Sarah Chen</h3>
|
| 204 |
+
<p class="text-primary-600 text-sm mb-3">Chief Executive Officer</p>
|
| 205 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">Leading our growth strategy and operational excellence.</p>
|
| 206 |
+
</div>
|
| 207 |
+
</div>
|
| 208 |
+
|
| 209 |
+
<div class="bg-white dark:bg-wood-800 rounded-2xl overflow-hidden shadow-lg">
|
| 210 |
+
<img src="http://static.photos/people/400x400/403" alt="Michael Torres" class="w-full h-64 object-cover">
|
| 211 |
+
<div class="p-6">
|
| 212 |
+
<h3 class="font-semibold text-lg">Michael Torres</h3>
|
| 213 |
+
<p class="text-secondary-600 text-sm mb-3">Chief Operations Officer</p>
|
| 214 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">Overseeing production and logistics across all facilities.</p>
|
| 215 |
+
</div>
|
| 216 |
+
</div>
|
| 217 |
+
|
| 218 |
+
<div class="bg-white dark:bg-wood-800 rounded-2xl overflow-hidden shadow-lg">
|
| 219 |
+
<img src="http://static.photos/people/400x400/404" alt="Emily Watson" class="w-full h-64 object-cover">
|
| 220 |
+
<div class="p-6">
|
| 221 |
+
<h3 class="font-semibold text-lg">Emily Watson</h3>
|
| 222 |
+
<p class="text-secondary-600 text-sm mb-3">VP of Sustainability</p>
|
| 223 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm">Driving our environmental initiatives and green practices.</p>
|
| 224 |
+
</div>
|
| 225 |
+
</div>
|
| 226 |
+
</div>
|
| 227 |
+
</div>
|
| 228 |
+
</section>
|
| 229 |
+
|
| 230 |
+
<!-- Sustainability -->
|
| 231 |
+
<section id="sustainability" class="py-20 bg-gradient-to-br from-primary-900 to-primary-800 text-white relative overflow-hidden">
|
| 232 |
+
<div class="absolute inset-0 opacity-10">
|
| 233 |
+
<div class="absolute inset-0" style="background-image: url('data:image/svg+xml,%3Csvg width=\'60\' height=\'60\' viewBox=\'0 0 60 60\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cg fill=\'none\' fill-rule=\'evenodd\'%3E%3Cg fill=\'%23ffffff\' fill-opacity=\'1\'%3E%3Cpath d=\'M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z\'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E');"></div>
|
| 234 |
+
</div>
|
| 235 |
+
|
| 236 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative">
|
| 237 |
+
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
| 238 |
+
<div>
|
| 239 |
+
<div class="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 text-primary-100 text-sm font-medium mb-6">
|
| 240 |
+
<i data-feather="award" class="w-4 h-4"></i>
|
| 241 |
+
ISO 14001 Certified
|
| 242 |
+
</div>
|
| 243 |
+
<h2 class="font-display text-4xl font-bold mb-6">Our Commitment to Sustainability</h2>
|
| 244 |
+
<p class="text-primary-100 text-lg mb-8 leading-relaxed">
|
| 245 |
+
We believe that great pallets shouldn't come at the expense of our planet. That's why we've built sustainability into every aspect of our business.
|
| 246 |
+
</p>
|
| 247 |
+
|
| 248 |
+
<div class="space-y-6">
|
| 249 |
+
<div class="flex items-start gap-4">
|
| 250 |
+
<div class="w-12 h-12 rounded-full bg-white/10 flex items-center justify-center flex-shrink-0">
|
| 251 |
+
<i data-feather="refresh-cw" class="w-6 h-6"></i>
|
| 252 |
+
</div>
|
| 253 |
+
<div>
|
| 254 |
+
<h3 class="font-semibold text-lg mb-1">Circular Economy</h3>
|
| 255 |
+
<p class="text-primary-100">Our buy-back and refurbishment program keeps pallets in use longer and out of landfills.</p>
|
| 256 |
+
</div>
|
| 257 |
+
</div>
|
| 258 |
+
|
| 259 |
+
<div class="flex items-start gap-4">
|
| 260 |
+
<div class="w-12 h-12 rounded-full bg-white/10 flex items-center justify-center flex-shrink-0">
|
| 261 |
+
<i data-feather="tree" class="w-6 h-6"></i>
|
| 262 |
+
</div>
|
| 263 |
+
<div>
|
| 264 |
+
<h3 class="font-semibold text-lg mb-1">Responsible Sourcing</h3>
|
| 265 |
+
<p class="text-primary-100">All lumber comes from FSC-certified forests with replanting programs.</p>
|
| 266 |
+
</div>
|
| 267 |
+
</div>
|
| 268 |
+
|
| 269 |
+
<div class="flex items-start gap-4">
|
| 270 |
+
<div class="w-12 h-12 rounded-full bg-white/10 flex items-center justify-center flex-shrink-0">
|
| 271 |
+
<i data-feather="sun" class="w-6 h-6"></i>
|
| 272 |
+
</div>
|
| 273 |
+
<div>
|
| 274 |
+
<h3 class="font-semibold text-lg mb-1">Solar Powered</h3>
|
| 275 |
+
<p class="text-primary-100">Our main facility runs on 100% renewable energy from our rooftop solar array.</p>
|
| 276 |
+
</div>
|
| 277 |
+
</div>
|
| 278 |
+
</div>
|
| 279 |
+
</div>
|
| 280 |
+
|
| 281 |
+
<div class="grid grid-cols-2 gap-6">
|
| 282 |
+
<div class="bg-white/10 backdrop-blur rounded-2xl p-6 text-center">
|
| 283 |
+
<div class="text-4xl font-bold mb-2">85%</div>
|
| 284 |
+
<div class="text-primary-100 text-sm">Waste Diverted from Landfills</div>
|
| 285 |
+
</div>
|
| 286 |
+
<div class="bg-white/10 backdrop-blur rounded-2xl p-6 text-center">
|
| 287 |
+
<div class="text-4xl font-bold mb-2">2M</div>
|
| 288 |
+
<div class="text-primary-100 text-sm">Trees Planted Since 2010</div>
|
| 289 |
+
</div>
|
| 290 |
+
<div class="bg-white/10 backdrop-blur rounded-2xl p-6 text-center">
|
| 291 |
+
<div class="text-4xl font-bold mb-2">40%</div>
|
| 292 |
+
<div class="text-primary-100 text-sm">Carbon Reduction vs. Industry Average</div>
|
| 293 |
+
</div>
|
| 294 |
+
<div class="bg-white/10 backdrop-blur rounded-2xl p-6 text-center">
|
| 295 |
+
<div class="text-4xl font-bold mb-2">100%</div>
|
| 296 |
+
<div class="text-primary-100 text-sm">Renewable Energy at Main Facility</div>
|
| 297 |
+
</div>
|
| 298 |
+
</div>
|
| 299 |
+
</div>
|
| 300 |
+
</div>
|
| 301 |
+
</section>
|
| 302 |
+
|
| 303 |
+
<!-- Careers -->
|
| 304 |
+
<section id="careers" class="py-20">
|
| 305 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 306 |
+
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
| 307 |
+
<div>
|
| 308 |
+
<h2 class="font-display text-4xl font-bold mb-6">Join Our Team</h2>
|
| 309 |
+
<p class="text-wood-600 dark:text-wood-400 text-lg mb-8">
|
| 310 |
+
We're always looking for talented, hardworking individuals who share our passion for quality and sustainability. We offer competitive wages, comprehensive benefits, and opportunities for growth.
|
| 311 |
+
</p>
|
| 312 |
+
|
| 313 |
+
<div class="space-y-4 mb-8">
|
| 314 |
+
<div class="flex items-center gap-3">
|
| 315 |
+
<i data-feather="check-circle" class="w-5 h-5 text-primary-600"></i>
|
| 316 |
+
<span>Competitive salary and performance bonuses</span>
|
| 317 |
+
</div>
|
| 318 |
+
<div class="flex items-center gap-3">
|
| 319 |
+
<i data-feather="check-circle" class="w-5 h-5 text-primary-600"></i>
|
| 320 |
+
<span>Health, dental, and vision insurance</span>
|
| 321 |
+
</div>
|
| 322 |
+
<div class="flex items-center gap-3">
|
| 323 |
+
<i data-feather="check-circle" class="w-5 h-5 text-primary-600"></i>
|
| 324 |
+
<span>401(k) with company matching</span>
|
| 325 |
+
</div>
|
| 326 |
+
<div class="flex items-center gap-3">
|
| 327 |
+
<i data-feather="check-circle" class="w-5 h-5 text-primary-600"></i>
|
| 328 |
+
<span>Paid time off and holidays</span>
|
| 329 |
+
</div>
|
| 330 |
+
<div class="flex items-center gap-3">
|
| 331 |
+
<i data-feather="check-circle" class="w-5 h-5 text-primary-600"></i>
|
| 332 |
+
<span>Career development and training programs</span>
|
| 333 |
+
</div>
|
| 334 |
+
</div>
|
| 335 |
+
|
| 336 |
+
<a href="contact.html" class="inline-flex items-center gap-2 px-8 py-4 bg-secondary-600 hover:bg-secondary-700 text-white rounded-xl font-semibold transition-all duration-300">
|
| 337 |
+
<i data-feather="briefcase" class="w-5 h-5"></i>
|
| 338 |
+
View Open Positions
|
| 339 |
+
</a>
|
| 340 |
+
</div>
|
| 341 |
+
|
| 342 |
+
<div class="relative">
|
| 343 |
+
<img src="http://static.photos/workspace/640x480/501" alt="PalletPal Pro Team" class="rounded-3xl shadow-2xl">
|
| 344 |
+
</div>
|
| 345 |
+
</div>
|
| 346 |
+
</div>
|
| 347 |
+
</section>
|
| 348 |
+
|
| 349 |
+
<custom-footer></custom-footer>
|
| 350 |
+
|
| 351 |
+
<script src="components/navbar.js"></script>
|
| 352 |
+
<script src="components/footer.js"></script>
|
| 353 |
+
<script src="script.js"></script>
|
| 354 |
+
<script>feather.replace();</script>
|
| 355 |
+
</body>
|
| 356 |
+
</html>
|
b2b.html
CHANGED
|
@@ -280,10 +280,9 @@
|
|
| 280 |
</section>
|
| 281 |
|
| 282 |
<custom-footer></custom-footer>
|
| 283 |
-
|
| 284 |
<script src="components/navbar.js"></script>
|
| 285 |
<script src="components/footer.js"></script>
|
| 286 |
<script src="script.js"></script>
|
| 287 |
<script>feather.replace();</script>
|
| 288 |
</body>
|
| 289 |
-
</html>
|
|
|
|
| 280 |
</section>
|
| 281 |
|
| 282 |
<custom-footer></custom-footer>
|
|
|
|
| 283 |
<script src="components/navbar.js"></script>
|
| 284 |
<script src="components/footer.js"></script>
|
| 285 |
<script src="script.js"></script>
|
| 286 |
<script>feather.replace();</script>
|
| 287 |
</body>
|
| 288 |
+
</html>
|
components/footer.js
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomFooter extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
* {
|
| 7 |
+
margin: 0;
|
| 8 |
+
padding: 0;
|
| 9 |
+
box-sizing: border-box;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
:host {
|
| 13 |
+
display: block;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
footer {
|
| 17 |
+
background: #1c1917;
|
| 18 |
+
color: #fafaf9;
|
| 19 |
+
padding: 4rem 0 2rem;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
.footer-container {
|
| 23 |
+
max-width: 1280px;
|
| 24 |
+
margin: 0 auto;
|
| 25 |
+
padding: 0 1rem;
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
.footer-grid {
|
| 29 |
+
display: grid;
|
| 30 |
+
grid-template-columns: repeat(4, 1fr);
|
| 31 |
+
gap: 3rem;
|
| 32 |
+
margin-bottom: 3rem;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
@media (max-width: 1024px) {
|
| 36 |
+
.footer-grid {
|
| 37 |
+
grid-template-columns: repeat(2, 1fr);
|
| 38 |
+
}
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
@media (max-width: 640px) {
|
| 42 |
+
.footer-grid {
|
| 43 |
+
grid-template-columns: 1fr;
|
| 44 |
+
}
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.footer-brand {
|
| 48 |
+
grid-column: span 1;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
@media (max-width: 1024px) {
|
| 52 |
+
.footer-brand {
|
| 53 |
+
grid-column: span 2;
|
| 54 |
+
}
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
@media (max-width: 640px) {
|
| 58 |
+
.footer-brand {
|
| 59 |
+
grid-column: span 1;
|
| 60 |
+
}
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
.footer-logo {
|
| 64 |
+
display: flex;
|
| 65 |
+
align-items: center;
|
| 66 |
+
gap: 0.5rem;
|
| 67 |
+
text-decoration: none;
|
| 68 |
+
font-family: 'Playfair Display', serif;
|
| 69 |
+
font-size: 1.5rem;
|
| 70 |
+
font-weight: 700;
|
| 71 |
+
color: #fafaf9;
|
| 72 |
+
margin-bottom: 1rem;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
.footer-logo-icon {
|
| 76 |
+
width: 40px;
|
| 77 |
+
height: 40px;
|
| 78 |
+
background: linear-gradient(135deg, #22c55e 0%, #f97316 100%);
|
| 79 |
+
border-radius: 10px;
|
| 80 |
+
display: flex;
|
| 81 |
+
align-items: center;
|
| 82 |
+
justify-content: center;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
.footer-logo-icon svg {
|
| 86 |
+
width: 24px;
|
| 87 |
+
height: 24px;
|
| 88 |
+
color: white;
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
.footer-description {
|
| 92 |
+
color: #a8a29e;
|
| 93 |
+
font-size: 0.95rem;
|
| 94 |
+
line-height: 1.7;
|
| 95 |
+
margin-bottom: 1.5rem;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.social-links {
|
| 99 |
+
display: flex;
|
| 100 |
+
gap: 0.75rem;
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
.social-link {
|
| 104 |
+
width: 40px;
|
| 105 |
+
height: 40px;
|
| 106 |
+
border-radius: 10px;
|
| 107 |
+
background: #292524;
|
| 108 |
+
display: flex;
|
| 109 |
+
align-items: center;
|
| 110 |
+
justify-content: center;
|
| 111 |
+
transition: all 0.2s ease;
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.social-link:hover {
|
| 115 |
+
background: #16a34a;
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
.social-link svg {
|
| 119 |
+
width: 20px;
|
| 120 |
+
height: 20px;
|
| 121 |
+
color: #a8a29e;
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
.social-link:hover svg {
|
| 125 |
+
color: white;
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
.footer-column h4 {
|
| 129 |
+
font-size: 1rem;
|
| 130 |
+
font-weight: 600;
|
| 131 |
+
color: #fafaf9;
|
| 132 |
+
margin-bottom: 1.25rem;
|
| 133 |
+
text-transform: uppercase;
|
| 134 |
+
letter-spacing: 0.05em;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
.footer-links {
|
| 138 |
+
list-style: none;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
.footer-links li {
|
| 142 |
+
margin-bottom: 0.75rem;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
.footer-links a {
|
| 146 |
+
color: #a8a29e;
|
| 147 |
+
text-decoration: none;
|
| 148 |
+
font-size: 0.95rem;
|
| 149 |
+
transition: color 0.2s ease;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
.footer-links a:hover {
|
| 153 |
+
color: #22c55e;
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
.contact-info {
|
| 157 |
+
list-style: none;
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
.contact-info li {
|
| 161 |
+
display: flex;
|
| 162 |
+
align-items: flex-start;
|
| 163 |
+
gap: 0.75rem;
|
| 164 |
+
margin-bottom: 1rem;
|
| 165 |
+
color: #a8a29e;
|
| 166 |
+
font-size: 0.95rem;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
.contact-info svg {
|
| 170 |
+
width: 20px;
|
| 171 |
+
height: 20px;
|
| 172 |
+
color: #22c55e;
|
| 173 |
+
flex-shrink: 0;
|
| 174 |
+
margin-top: 0.125rem;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
.footer-bottom {
|
| 178 |
+
border-top: 1px solid #292524;
|
| 179 |
+
padding-top: 2rem;
|
| 180 |
+
display: flex;
|
| 181 |
+
flex-direction: column;
|
| 182 |
+
gap: 1rem;
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
@media (min-width: 640px) {
|
| 186 |
+
.footer-bottom {
|
| 187 |
+
flex-direction: row;
|
| 188 |
+
justify-content: space-between;
|
| 189 |
+
align-items: center;
|
| 190 |
+
}
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
.copyright {
|
| 194 |
+
color: #78716c;
|
| 195 |
+
font-size: 0.875rem;
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
.footer-bottom-links {
|
| 199 |
+
display: flex;
|
| 200 |
+
gap: 1.5rem;
|
| 201 |
+
}
|
| 202 |
+
|
| 203 |
+
.footer-bottom-links a {
|
| 204 |
+
color: #78716c;
|
| 205 |
+
text-decoration: none;
|
| 206 |
+
font-size: 0.875rem;
|
| 207 |
+
transition: color 0.2s ease;
|
| 208 |
+
}
|
| 209 |
+
|
| 210 |
+
.footer-bottom-links a:hover {
|
| 211 |
+
color: #22c55e;
|
| 212 |
+
}
|
| 213 |
+
|
| 214 |
+
.newsletter {
|
| 215 |
+
margin-top: 1.5rem;
|
| 216 |
+
}
|
| 217 |
+
|
| 218 |
+
.newsletter-form {
|
| 219 |
+
display: flex;
|
| 220 |
+
gap: 0.5rem;
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
.newsletter-input {
|
| 224 |
+
flex: 1;
|
| 225 |
+
padding: 0.625rem 1rem;
|
| 226 |
+
border-radius: 8px;
|
| 227 |
+
border: 1px solid #44403c;
|
| 228 |
+
background: #292524;
|
| 229 |
+
color: #fafaf9;
|
| 230 |
+
font-size: 0.9rem;
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
.newsletter-input::placeholder {
|
| 234 |
+
color: #78716c;
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
.newsletter-input:focus {
|
| 238 |
+
outline: none;
|
| 239 |
+
border-color: #22c55e;
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
.newsletter-btn {
|
| 243 |
+
padding: 0.625rem 1rem;
|
| 244 |
+
background: #16a34a;
|
| 245 |
+
color: white;
|
| 246 |
+
border: none;
|
| 247 |
+
border-radius: 8px;
|
| 248 |
+
font-weight: 600;
|
| 249 |
+
font-size: 0.9rem;
|
| 250 |
+
cursor: pointer;
|
| 251 |
+
transition: background 0.2s ease;
|
| 252 |
+
}
|
| 253 |
+
|
| 254 |
+
.newsletter-btn:hover {
|
| 255 |
+
background: #15803d;
|
| 256 |
+
}
|
| 257 |
+
</style>
|
| 258 |
+
|
| 259 |
+
<footer>
|
| 260 |
+
<div class="footer-container">
|
| 261 |
+
<div class="footer-grid">
|
| 262 |
+
<div class="footer-brand">
|
| 263 |
+
<a href="index.html" class="footer-logo">
|
| 264 |
+
<div class="footer-logo-icon">
|
| 265 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>
|
| 266 |
+
</div>
|
| 267 |
+
<span>PalletPal Pro</span>
|
| 268 |
+
</a>
|
| 269 |
+
<p class="footer-description">
|
| 270 |
+
Premium pallet solutions for businesses of all sizes. Quality craftsmanship, sustainable practices, and exceptional service since 1995.
|
| 271 |
+
</p>
|
| 272 |
+
<div class="social-links">
|
| 273 |
+
<a href="#" class="social-link" aria-label="LinkedIn">
|
| 274 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"/><rect x="2" y="9" width="4" height="12"/><circle cx="4" cy="4" r="2"/></svg>
|
| 275 |
+
</a>
|
| 276 |
+
<a href="#" class="social-link" aria-label="Facebook">
|
| 277 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
|
| 278 |
+
</a>
|
| 279 |
+
<a href="#" class="social-link" aria-label="Instagram">
|
| 280 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"/></svg>
|
| 281 |
+
</a>
|
| 282 |
+
<a href="#" class="social-link" aria-label="Twitter">
|
| 283 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"/></svg>
|
| 284 |
+
</a>
|
| 285 |
+
</div>
|
| 286 |
+
</div>
|
| 287 |
+
|
| 288 |
+
<div class="footer-column">
|
| 289 |
+
<h4>Products</h4>
|
| 290 |
+
<ul class="footer-links">
|
| 291 |
+
<li><a href="products.html">New Pallets</a></li>
|
| 292 |
+
<li><a href="products.html">Used Pallets</a></li>
|
| 293 |
+
<li><a href="products.html">Custom Pallets</a></li>
|
| 294 |
+
<li><a href="products.html">Export Pallets</a></li>
|
| 295 |
+
<li><a href="products.html">Pallet Accessories</a></li>
|
| 296 |
+
</ul>
|
| 297 |
+
</div>
|
| 298 |
+
|
| 299 |
+
<div class="footer-column">
|
| 300 |
+
<h4>Company</h4>
|
| 301 |
+
<ul class="footer-links">
|
| 302 |
+
<li><a href="about.html">About Us</a></li>
|
| 303 |
+
<li><a href="b2b.html">B2B Solutions</a></li>
|
| 304 |
+
<li><a href="about.html#sustainability">Sustainability</a></li>
|
| 305 |
+
<li><a href="about.html#careers">Careers</a></li>
|
| 306 |
+
<li><a href="contact.html">Contact</a></li>
|
| 307 |
+
</ul>
|
| 308 |
+
</div>
|
| 309 |
+
|
| 310 |
+
<div class="footer-column">
|
| 311 |
+
<h4>Contact Us</h4>
|
| 312 |
+
<ul class="contact-info">
|
| 313 |
+
<li>
|
| 314 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
| 315 |
+
<span>1234 Pallet Way<br>Chicago, IL 60609</span>
|
| 316 |
+
</li>
|
| 317 |
+
<li>
|
| 318 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
|
| 319 |
+
<span>(555) 123-4567</span>
|
| 320 |
+
</li>
|
| 321 |
+
<li>
|
| 322 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
|
| 323 |
+
<span>sales@palletpalpro.com</span>
|
| 324 |
+
</li>
|
| 325 |
+
</ul>
|
| 326 |
+
|
| 327 |
+
<div class="newsletter">
|
| 328 |
+
<h4 style="font-size: 0.875rem; margin-bottom: 0.75rem;">Newsletter</h4>
|
| 329 |
+
<form class="newsletter-form" onsubmit="event.preventDefault(); alert('Thanks for subscribing!');">
|
| 330 |
+
<input type="email" placeholder="Your email" class="newsletter-input" required>
|
| 331 |
+
<button type="submit" class="newsletter-btn">Join</button>
|
| 332 |
+
</form>
|
| 333 |
+
</div>
|
| 334 |
+
</div>
|
| 335 |
+
</div>
|
| 336 |
+
|
| 337 |
+
<div class="footer-bottom">
|
| 338 |
+
<p class="copyright">© 2024 PalletPal Pro. All rights reserved.</p>
|
| 339 |
+
<div class="footer-bottom-links">
|
| 340 |
+
<a href="#">Privacy Policy</a>
|
| 341 |
+
<a href="#">Terms of Service</a>
|
| 342 |
+
<a href="#">Cookie Settings</a>
|
| 343 |
+
</div>
|
| 344 |
+
</div>
|
| 345 |
+
</div>
|
| 346 |
+
</footer>
|
| 347 |
+
`;
|
| 348 |
+
}
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
customElements.define('custom-footer', CustomFooter);
|
components/navbar.js
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomNavbar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
* {
|
| 7 |
+
margin: 0;
|
| 8 |
+
padding: 0;
|
| 9 |
+
box-sizing: border-box;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
:host {
|
| 13 |
+
display: block;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
nav {
|
| 17 |
+
position: fixed;
|
| 18 |
+
top: 0;
|
| 19 |
+
left: 0;
|
| 20 |
+
right: 0;
|
| 21 |
+
z-index: 1000;
|
| 22 |
+
background: rgba(250, 250, 249, 0.9);
|
| 23 |
+
backdrop-filter: blur(12px);
|
| 24 |
+
-webkit-backdrop-filter: blur(12px);
|
| 25 |
+
border-bottom: 1px solid rgba(231, 229, 228, 0.5);
|
| 26 |
+
transition: all 0.3s ease;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
.dark nav {
|
| 30 |
+
background: rgba(28, 25, 23, 0.9);
|
| 31 |
+
border-bottom-color: rgba(68, 64, 60, 0.5);
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
.nav-container {
|
| 35 |
+
max-width: 1280px;
|
| 36 |
+
margin: 0 auto;
|
| 37 |
+
padding: 0 1rem;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
.nav-inner {
|
| 41 |
+
display: flex;
|
| 42 |
+
align-items: center;
|
| 43 |
+
justify-content: space-between;
|
| 44 |
+
height: 72px;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.logo {
|
| 48 |
+
display: flex;
|
| 49 |
+
align-items: center;
|
| 50 |
+
gap: 0.5rem;
|
| 51 |
+
text-decoration: none;
|
| 52 |
+
font-family: 'Playfair Display', serif;
|
| 53 |
+
font-size: 1.5rem;
|
| 54 |
+
font-weight: 700;
|
| 55 |
+
color: #1c1917;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
.dark .logo {
|
| 59 |
+
color: #fafaf9;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
.logo-icon {
|
| 63 |
+
width: 40px;
|
| 64 |
+
height: 40px;
|
| 65 |
+
background: linear-gradient(135deg, #16a34a 0%, #f97316 100%);
|
| 66 |
+
border-radius: 10px;
|
| 67 |
+
display: flex;
|
| 68 |
+
align-items: center;
|
| 69 |
+
justify-content: center;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
.logo-icon svg {
|
| 73 |
+
width: 24px;
|
| 74 |
+
height: 24px;
|
| 75 |
+
color: white;
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
.nav-links {
|
| 79 |
+
display: flex;
|
| 80 |
+
align-items: center;
|
| 81 |
+
gap: 2rem;
|
| 82 |
+
list-style: none;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
.nav-links a {
|
| 86 |
+
text-decoration: none;
|
| 87 |
+
color: #57534e;
|
| 88 |
+
font-weight: 500;
|
| 89 |
+
font-size: 0.95rem;
|
| 90 |
+
transition: color 0.2s ease;
|
| 91 |
+
position: relative;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
.dark .nav-links a {
|
| 95 |
+
color: #a8a29e;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.nav-links a:hover {
|
| 99 |
+
color: #16a34a;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
.nav-links a.active {
|
| 103 |
+
color: #16a34a;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
.nav-links a.active::after {
|
| 107 |
+
content: '';
|
| 108 |
+
position: absolute;
|
| 109 |
+
bottom: -6px;
|
| 110 |
+
left: 0;
|
| 111 |
+
right: 0;
|
| 112 |
+
height: 2px;
|
| 113 |
+
background: #16a34a;
|
| 114 |
+
border-radius: 1px;
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
.nav-actions {
|
| 118 |
+
display: flex;
|
| 119 |
+
align-items: center;
|
| 120 |
+
gap: 1rem;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.btn-primary {
|
| 124 |
+
padding: 0.625rem 1.25rem;
|
| 125 |
+
background: #16a34a;
|
| 126 |
+
color: white;
|
| 127 |
+
text-decoration: none;
|
| 128 |
+
border-radius: 10px;
|
| 129 |
+
font-weight: 600;
|
| 130 |
+
font-size: 0.9rem;
|
| 131 |
+
transition: all 0.2s ease;
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
.btn-primary:hover {
|
| 135 |
+
background: #15803d;
|
| 136 |
+
transform: translateY(-1px);
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
.theme-toggle {
|
| 140 |
+
width: 40px;
|
| 141 |
+
height: 40px;
|
| 142 |
+
border-radius: 10px;
|
| 143 |
+
border: 1px solid #e7e5e4;
|
| 144 |
+
background: white;
|
| 145 |
+
cursor: pointer;
|
| 146 |
+
display: flex;
|
| 147 |
+
align-items: center;
|
| 148 |
+
justify-content: center;
|
| 149 |
+
transition: all 0.2s ease;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
.dark .theme-toggle {
|
| 153 |
+
background: #292524;
|
| 154 |
+
border-color: #44403c;
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
.theme-toggle:hover {
|
| 158 |
+
background: #f5f5f4;
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
.dark .theme-toggle:hover {
|
| 162 |
+
background: #44403c;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
.theme-toggle svg {
|
| 166 |
+
width: 20px;
|
| 167 |
+
height: 20px;
|
| 168 |
+
color: #57534e;
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
.dark .theme-toggle svg {
|
| 172 |
+
color: #a8a29e;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
.mobile-menu-btn {
|
| 176 |
+
display: none;
|
| 177 |
+
width: 40px;
|
| 178 |
+
height: 40px;
|
| 179 |
+
border-radius: 10px;
|
| 180 |
+
border: 1px solid #e7e5e4;
|
| 181 |
+
background: white;
|
| 182 |
+
cursor: pointer;
|
| 183 |
+
align-items: center;
|
| 184 |
+
justify-content: center;
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
+
.dark .mobile-menu-btn {
|
| 188 |
+
background: #292524;
|
| 189 |
+
border-color: #44403c;
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
.mobile-menu-btn svg {
|
| 193 |
+
width: 20px;
|
| 194 |
+
height: 20px;
|
| 195 |
+
color: #57534e;
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
.dark .mobile-menu-btn svg {
|
| 199 |
+
color: #a8a29e;
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
.mobile-menu {
|
| 203 |
+
display: none;
|
| 204 |
+
position: absolute;
|
| 205 |
+
top: 100%;
|
| 206 |
+
left: 0;
|
| 207 |
+
right: 0;
|
| 208 |
+
background: rgba(250, 250, 249, 0.98);
|
| 209 |
+
backdrop-filter: blur(12px);
|
| 210 |
+
border-bottom: 1px solid #e7e5e4;
|
| 211 |
+
padding: 1rem;
|
| 212 |
+
}
|
| 213 |
+
|
| 214 |
+
.dark .mobile-menu {
|
| 215 |
+
background: rgba(28, 25, 23, 0.98);
|
| 216 |
+
border-bottom-color: #44403c;
|
| 217 |
+
}
|
| 218 |
+
|
| 219 |
+
.mobile-menu.active {
|
| 220 |
+
display: block;
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
.mobile-menu a {
|
| 224 |
+
display: block;
|
| 225 |
+
padding: 0.875rem 1rem;
|
| 226 |
+
color: #57534e;
|
| 227 |
+
text-decoration: none;
|
| 228 |
+
font-weight: 500;
|
| 229 |
+
border-radius: 10px;
|
| 230 |
+
transition: all 0.2s ease;
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
.dark .mobile-menu a {
|
| 234 |
+
color: #a8a29e;
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
.mobile-menu a:hover {
|
| 238 |
+
background: #f5f5f4;
|
| 239 |
+
color: #16a34a;
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
.dark .mobile-menu a:hover {
|
| 243 |
+
background: #292524;
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
@media (max-width: 1024px) {
|
| 247 |
+
.nav-links {
|
| 248 |
+
display: none;
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
.mobile-menu-btn {
|
| 252 |
+
display: flex;
|
| 253 |
+
}
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
@media (max-width: 640px) {
|
| 257 |
+
.btn-primary {
|
| 258 |
+
display: none;
|
| 259 |
+
}
|
| 260 |
+
}
|
| 261 |
+
</style>
|
| 262 |
+
|
| 263 |
+
<nav>
|
| 264 |
+
<div class="nav-container">
|
| 265 |
+
<div class="nav-inner">
|
| 266 |
+
<a href="index.html" class="logo">
|
| 267 |
+
<div class="logo-icon">
|
| 268 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>
|
| 269 |
+
</div>
|
| 270 |
+
<span>PalletPal Pro</span>
|
| 271 |
+
</a>
|
| 272 |
+
|
| 273 |
+
<ul class="nav-links">
|
| 274 |
+
<li><a href="index.html" class="nav-link">Home</a></li>
|
| 275 |
+
<li><a href="products.html" class="nav-link">Products</a></li>
|
| 276 |
+
<li><a href="b2b.html" class="nav-link">B2B</a></li>
|
| 277 |
+
<li><a href="about.html" class="nav-link">About</a></li>
|
| 278 |
+
<li><a href="contact.html" class="nav-link">Contact</a></li>
|
| 279 |
+
</ul>
|
| 280 |
+
|
| 281 |
+
<div class="nav-actions">
|
| 282 |
+
<button class="theme-toggle" id="theme-toggle" aria-label="Toggle theme">
|
| 283 |
+
<svg class="sun-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
|
| 284 |
+
<svg class="moon-icon" style="display: none;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
|
| 285 |
+
</button>
|
| 286 |
+
<a href="contact.html" class="btn-primary">Get Quote</a>
|
| 287 |
+
<button class="mobile-menu-btn" id="mobile-menu-btn" aria-label="Toggle menu">
|
| 288 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
|
| 289 |
+
</button>
|
| 290 |
+
</div>
|
| 291 |
+
</div>
|
| 292 |
+
|
| 293 |
+
<div class="mobile-menu" id="mobile-menu">
|
| 294 |
+
<a href="index.html">Home</a>
|
| 295 |
+
<a href="products.html">Products</a>
|
| 296 |
+
<a href="b2b.html">B2B</a>
|
| 297 |
+
<a href="about.html">About</a>
|
| 298 |
+
<a href="contact.html">Contact</a>
|
| 299 |
+
<a href="contact.html" style="background: #16a34a; color: white; text-align: center; margin-top: 0.5rem;">Get Quote</a>
|
| 300 |
+
</div>
|
| 301 |
+
</div>
|
| 302 |
+
</nav>
|
| 303 |
+
|
| 304 |
+
<div style="height: 72px;"></div>
|
| 305 |
+
`;
|
| 306 |
+
|
| 307 |
+
this.setupEventListeners();
|
| 308 |
+
this.setActiveLink();
|
| 309 |
+
this.initTheme();
|
| 310 |
+
}
|
| 311 |
+
|
| 312 |
+
setupEventListeners() {
|
| 313 |
+
const mobileMenuBtn = this.shadowRoot.getElementById('mobile-menu-btn');
|
| 314 |
+
const mobileMenu = this.shadowRoot.getElementById('mobile-menu');
|
| 315 |
+
const themeToggle = this.shadowRoot.getElementById('theme-toggle');
|
| 316 |
+
|
| 317 |
+
mobileMenuBtn?.addEventListener('click', () => {
|
| 318 |
+
mobileMenu.classList.toggle('active');
|
| 319 |
+
});
|
| 320 |
+
|
| 321 |
+
themeToggle?.addEventListener('click', () => {
|
| 322 |
+
this.toggleTheme();
|
| 323 |
+
});
|
| 324 |
+
|
| 325 |
+
// Close mobile menu when clicking outside
|
| 326 |
+
document.addEventListener('click', (e) => {
|
| 327 |
+
if (!this.contains(e.target) && mobileMenu.classList.contains('active')) {
|
| 328 |
+
mobileMenu.classList.remove('active');
|
| 329 |
+
}
|
| 330 |
+
});
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
setActiveLink() {
|
| 334 |
+
const currentPage = window.location.pathname.split('/').pop() || 'index.html';
|
| 335 |
+
const links = this.shadowRoot.querySelectorAll('.nav-link');
|
| 336 |
+
links.forEach(link => {
|
| 337 |
+
const href = link.getAttribute('href');
|
| 338 |
+
if (href === currentPage || (currentPage === '' && href === 'index.html')) {
|
| 339 |
+
link.classList.add('active');
|
| 340 |
+
}
|
| 341 |
+
});
|
| 342 |
+
}
|
| 343 |
+
|
| 344 |
+
initTheme() {
|
| 345 |
+
const isDark = localStorage.getItem('theme') === 'dark' ||
|
| 346 |
+
(!localStorage.getItem('theme') && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
| 347 |
+
|
| 348 |
+
if (isDark) {
|
| 349 |
+
document.documentElement.classList.add('dark');
|
| 350 |
+
this.shadowRoot.querySelector('.sun-icon').style.display = 'none';
|
| 351 |
+
this.shadowRoot.querySelector('.moon-icon').style.display = 'block';
|
| 352 |
+
}
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
toggleTheme() {
|
| 356 |
+
const isDark = document.documentElement.classList.toggle('dark');
|
| 357 |
+
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
| 358 |
+
|
| 359 |
+
const sunIcon = this.shadowRoot.querySelector('.sun-icon');
|
| 360 |
+
const moonIcon = this.shadowRoot.querySelector('.moon-icon');
|
| 361 |
+
|
| 362 |
+
if (isDark) {
|
| 363 |
+
sunIcon.style.display = 'none';
|
| 364 |
+
moonIcon.style.display = 'block';
|
| 365 |
+
} else {
|
| 366 |
+
sunIcon.style.display = 'block';
|
| 367 |
+
moonIcon.style.display = 'none';
|
| 368 |
+
}
|
| 369 |
+
}
|
| 370 |
+
}
|
| 371 |
+
|
| 372 |
+
customElements.define('custom-navbar', CustomNavbar);
|
contact.html
CHANGED
|
@@ -204,10 +204,9 @@
|
|
| 204 |
</section>
|
| 205 |
|
| 206 |
<custom-footer></custom-footer>
|
| 207 |
-
|
| 208 |
<script src="components/navbar.js"></script>
|
| 209 |
<script src="components/footer.js"></script>
|
| 210 |
<script src="script.js"></script>
|
| 211 |
<script>feather.replace();</script>
|
| 212 |
</body>
|
| 213 |
-
</html>
|
|
|
|
| 204 |
</section>
|
| 205 |
|
| 206 |
<custom-footer></custom-footer>
|
|
|
|
| 207 |
<script src="components/navbar.js"></script>
|
| 208 |
<script src="components/footer.js"></script>
|
| 209 |
<script src="script.js"></script>
|
| 210 |
<script>feather.replace();</script>
|
| 211 |
</body>
|
| 212 |
+
</html>
|
index.html
CHANGED
|
@@ -411,6 +411,5 @@
|
|
| 411 |
<script src="components/footer.js"></script>
|
| 412 |
<script src="script.js"></script>
|
| 413 |
<script>feather.replace();</script>
|
| 414 |
-
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 415 |
</body>
|
| 416 |
</html>
|
|
|
|
| 411 |
<script src="components/footer.js"></script>
|
| 412 |
<script src="script.js"></script>
|
| 413 |
<script>feather.replace();</script>
|
|
|
|
| 414 |
</body>
|
| 415 |
</html>
|
products.html
CHANGED
|
@@ -147,10 +147,9 @@
|
|
| 147 |
</section>
|
| 148 |
|
| 149 |
<custom-footer></custom-footer>
|
| 150 |
-
|
| 151 |
<script src="components/navbar.js"></script>
|
| 152 |
<script src="components/footer.js"></script>
|
| 153 |
<script src="script.js"></script>
|
| 154 |
<script>feather.replace();</script>
|
| 155 |
</body>
|
| 156 |
-
</html>
|
|
|
|
| 147 |
</section>
|
| 148 |
|
| 149 |
<custom-footer></custom-footer>
|
|
|
|
| 150 |
<script src="components/navbar.js"></script>
|
| 151 |
<script src="components/footer.js"></script>
|
| 152 |
<script src="script.js"></script>
|
| 153 |
<script>feather.replace();</script>
|
| 154 |
</body>
|
| 155 |
+
</html>
|
script.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
// PalletPal Pro - Main JavaScript
|
| 2 |
|
| 3 |
// Product data
|
|
@@ -27,4 +28,385 @@ const products = [
|
|
| 27 |
price: 6.99,
|
| 28 |
image: "http://static.photos/industry/640x480/3",
|
| 29 |
description: "Top-quality refurbished pallets, repaired to like-new condition.",
|
| 30 |
-
specs: ["48\" x 40\" x
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
// PalletPal Pro - Main JavaScript
|
| 3 |
|
| 4 |
// Product data
|
|
|
|
| 28 |
price: 6.99,
|
| 29 |
image: "http://static.photos/industry/640x480/3",
|
| 30 |
description: "Top-quality refurbished pallets, repaired to like-new condition.",
|
| 31 |
+
specs: ["48\" x 40\" x 6\"", "2,200 lbs capacity", "Heat treated"]
|
| 32 |
+
},
|
| 33 |
+
{
|
| 34 |
+
id: 4,
|
| 35 |
+
name: "Export/Heat Treated",
|
| 36 |
+
category: "export",
|
| 37 |
+
price: 15.99,
|
| 38 |
+
image: "http://static.photos/industry/640x480/4",
|
| 39 |
+
description: "ISPM-15 compliant pallets for international shipping.",
|
| 40 |
+
specs: ["48\" x 40\" x 6\"", "IPPC marked", "Global compliant"]
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
id: 5,
|
| 44 |
+
name: "Custom Size Pallet",
|
| 45 |
+
category: "custom",
|
| 46 |
+
price: 35.00,
|
| 47 |
+
image: "http://static.photos/craft/640x480/5",
|
| 48 |
+
description: "Built to your exact specifications and requirements.",
|
| 49 |
+
specs: ["Any size up to 96\"", "Custom capacity", "Your choice of wood"]
|
| 50 |
+
},
|
| 51 |
+
{
|
| 52 |
+
id: 6,
|
| 53 |
+
name: "Lightweight Economy",
|
| 54 |
+
category: "new",
|
| 55 |
+
price: 8.99,
|
| 56 |
+
image: "http://static.photos/industry/640x480/6",
|
| 57 |
+
description: "Cost-effective solution for light to medium loads.",
|
| 58 |
+
specs: ["48\" x 40\" x 5.5\"", "1,500 lbs capacity", "Softwood construction"]
|
| 59 |
+
}
|
| 60 |
+
];
|
| 61 |
+
|
| 62 |
+
// Testimonials data
|
| 63 |
+
const testimonials = [
|
| 64 |
+
{
|
| 65 |
+
id: 1,
|
| 66 |
+
name: "Robert Martinez",
|
| 67 |
+
company: "FastTrack Logistics",
|
| 68 |
+
role: "Operations Director",
|
| 69 |
+
image: "http://static.photos/people/200x200/101",
|
| 70 |
+
content: "PalletPal Pro has been our go-to supplier for 5 years. Their quality is consistent, delivery is always on time, and their team genuinely cares about our success.",
|
| 71 |
+
rating: 5
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
id: 2,
|
| 75 |
+
name: "Jennifer Walsh",
|
| 76 |
+
company: "Midwest Manufacturing",
|
| 77 |
+
role: "Supply Chain Manager",
|
| 78 |
+
image: "http://static.photos/people/200x200/102",
|
| 79 |
+
content: "The B2B program saved us 30% on pallet costs while eliminating stockouts. Their just-in-time delivery model transformed our warehouse operations.",
|
| 80 |
+
rating: 5
|
| 81 |
+
},
|
| 82 |
+
{
|
| 83 |
+
id: 3,
|
| 84 |
+
name: "David Kim",
|
| 85 |
+
company: "GreenGrocer Distributors",
|
| 86 |
+
role: "CEO",
|
| 87 |
+
image: "http://static.photos/people/200x200/103",
|
| 88 |
+
content: "As a company focused on sustainability, we love that PalletPal Pro shares our values. Their recycled pallet program aligns perfectly with our mission.",
|
| 89 |
+
rating: 5
|
| 90 |
+
}
|
| 91 |
+
];
|
| 92 |
+
|
| 93 |
+
// Pricing configuration
|
| 94 |
+
const pricing = {
|
| 95 |
+
standard: { base: 12.99, multiplier: 1 },
|
| 96 |
+
heavy: { base: 24.99, multiplier: 1 },
|
| 97 |
+
custom: { base: 35.00, multiplier: 1.2 },
|
| 98 |
+
used: { base: 6.99, multiplier: 1 },
|
| 99 |
+
export: { base: 15.99, multiplier: 1 }
|
| 100 |
+
};
|
| 101 |
+
|
| 102 |
+
const locationMultipliers = {
|
| 103 |
+
local: 1,
|
| 104 |
+
regional: 1.15,
|
| 105 |
+
national: 1.35
|
| 106 |
+
};
|
| 107 |
+
|
| 108 |
+
// DOM Ready
|
| 109 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 110 |
+
// Initialize Feather icons
|
| 111 |
+
if (typeof feather !== 'undefined') {
|
| 112 |
+
feather.replace();
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
// Load products on index page
|
| 116 |
+
loadFeaturedProducts();
|
| 117 |
+
|
| 118 |
+
// Load all products on products page
|
| 119 |
+
loadAllProducts();
|
| 120 |
+
|
| 121 |
+
// Load testimonials
|
| 122 |
+
loadTestimonials();
|
| 123 |
+
|
| 124 |
+
// Setup quote calculator
|
| 125 |
+
setupQuoteCalculator();
|
| 126 |
+
|
| 127 |
+
// Setup product filters
|
| 128 |
+
setupProductFilters();
|
| 129 |
+
|
| 130 |
+
// Setup forms
|
| 131 |
+
setupForms();
|
| 132 |
+
|
| 133 |
+
// Setup scroll animations
|
| 134 |
+
setupScrollAnimations();
|
| 135 |
+
});
|
| 136 |
+
|
| 137 |
+
// Load featured products (homepage)
|
| 138 |
+
function loadFeaturedProducts() {
|
| 139 |
+
const grid = document.getElementById('product-grid');
|
| 140 |
+
if (!grid) return;
|
| 141 |
+
|
| 142 |
+
const featuredProducts = products.slice(0, 3);
|
| 143 |
+
|
| 144 |
+
grid.innerHTML = featuredProducts.map(product => createProductCard(product)).join('');
|
| 145 |
+
|
| 146 |
+
if (typeof feather !== 'undefined') {
|
| 147 |
+
feather.replace();
|
| 148 |
+
}
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
// Load all products (products page)
|
| 152 |
+
function loadAllProducts() {
|
| 153 |
+
const grid = document.getElementById('all-products-grid');
|
| 154 |
+
if (!grid) return;
|
| 155 |
+
|
| 156 |
+
grid.innerHTML = products.map(product => createProductCard(product)).join('');
|
| 157 |
+
|
| 158 |
+
if (typeof feather !== 'undefined') {
|
| 159 |
+
feather.replace();
|
| 160 |
+
}
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
// Create product card HTML
|
| 164 |
+
function createProductCard(product) {
|
| 165 |
+
return `
|
| 166 |
+
<div class="bg-white dark:bg-wood-800 rounded-2xl overflow-hidden shadow-lg border border-wood-100 dark:border-wood-700 hover:shadow-2xl transition-all duration-300 group card-lift" data-category="${product.category}">
|
| 167 |
+
<div class="relative h-56 overflow-hidden img-zoom">
|
| 168 |
+
<img src="${product.image}" alt="${product.name}" class="w-full h-full object-cover">
|
| 169 |
+
<div class="absolute top-4 left-4">
|
| 170 |
+
<span class="px-3 py-1 bg-primary-600 text-white text-xs font-semibold rounded-full uppercase tracking-wide">${product.category}</span>
|
| 171 |
+
</div>
|
| 172 |
+
</div>
|
| 173 |
+
<div class="p-6">
|
| 174 |
+
<div class="flex items-center justify-between mb-2">
|
| 175 |
+
<h3 class="font-display text-xl font-bold">${product.name}</h3>
|
| 176 |
+
<span class="text-2xl font-bold text-primary-600">${product.price.toFixed(2)}</span>
|
| 177 |
+
</div>
|
| 178 |
+
<p class="text-wood-600 dark:text-wood-400 text-sm mb-4">${product.description}</p>
|
| 179 |
+
<ul class="space-y-2 mb-6">
|
| 180 |
+
${product.specs.map(spec => `
|
| 181 |
+
<li class="flex items-center gap-2 text-sm text-wood-500 dark:text-wood-400">
|
| 182 |
+
<i data-feather="check" class="w-4 h-4 text-primary-500"></i>
|
| 183 |
+
${spec}
|
| 184 |
+
</li>
|
| 185 |
+
`).join('')}
|
| 186 |
+
</ul>
|
| 187 |
+
<a href="contact.html" class="w-full py-3 bg-wood-100 dark:bg-wood-700 hover:bg-primary-600 hover:text-white dark:hover:bg-primary-600 text-wood-800 dark:text-wood-100 rounded-xl font-semibold transition-all duration-300 flex items-center justify-center gap-2">
|
| 188 |
+
<i data-feather="shopping-cart" class="w-4 h-4"></i>
|
| 189 |
+
Request Quote
|
| 190 |
+
</a>
|
| 191 |
+
</div>
|
| 192 |
+
</div>
|
| 193 |
+
`;
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
// Load testimonials
|
| 197 |
+
function loadTestimonials() {
|
| 198 |
+
const grid = document.getElementById('testimonials-grid');
|
| 199 |
+
if (!grid) return;
|
| 200 |
+
|
| 201 |
+
grid.innerHTML = testimonials.map(t => `
|
| 202 |
+
<div class="bg-white dark:bg-wood-800 rounded-2xl p-8 shadow-lg border border-wood-100 dark:border-wood-700">
|
| 203 |
+
<div class="flex gap-1 mb-4">
|
| 204 |
+
${Array(t.rating).fill('<i data-feather="star" class="w-5 h-5 text-secondary-500 fill-current"></i>').join('')}
|
| 205 |
+
</div>
|
| 206 |
+
<p class="text-wood-600 dark:text-wood-300 mb-6 leading-relaxed">"${t.content}"</p>
|
| 207 |
+
<div class="flex items-center gap-4">
|
| 208 |
+
<img src="${t.image}" alt="${t.name}" class="w-12 h-12 rounded-full object-cover">
|
| 209 |
+
<div>
|
| 210 |
+
<div class="font-semibold">${t.name}</div>
|
| 211 |
+
<div class="text-sm text-wood-500 dark:text-wood-400">${t.role}, ${t.company}</div>
|
| 212 |
+
</div>
|
| 213 |
+
</div>
|
| 214 |
+
</div>
|
| 215 |
+
`).join('');
|
| 216 |
+
|
| 217 |
+
if (typeof feather !== 'undefined') {
|
| 218 |
+
feather.replace();
|
| 219 |
+
}
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
// Setup quote calculator
|
| 223 |
+
function setupQuoteCalculator() {
|
| 224 |
+
const form = document.getElementById('quote-form');
|
| 225 |
+
const result = document.getElementById('quote-result');
|
| 226 |
+
const priceEl = document.getElementById('quote-price');
|
| 227 |
+
|
| 228 |
+
if (!form) return;
|
| 229 |
+
|
| 230 |
+
form.addEventListener('submit', function(e) {
|
| 231 |
+
e.preventDefault();
|
| 232 |
+
|
| 233 |
+
const type = document.getElementById('pallet-type').value;
|
| 234 |
+
const quantity = parseInt(document.getElementById('quantity').value) || 1;
|
| 235 |
+
const location = document.getElementById('location').value;
|
| 236 |
+
|
| 237 |
+
const basePrice = pricing[type].base;
|
| 238 |
+
const locationMult = locationMultipliers[location];
|
| 239 |
+
const volumeDiscount = quantity >= 500 ? 0.85 : quantity >= 100 ? 0.9 : 1;
|
| 240 |
+
|
| 241 |
+
const total = basePrice * quantity * locationMult * volumeDiscount;
|
| 242 |
+
|
| 243 |
+
priceEl.textContent = ' + total.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
| 244 |
+
result.classList.remove('hidden');
|
| 245 |
+
|
| 246 |
+
// Animate the price
|
| 247 |
+
animateValue(priceEl, 0, total, 500);
|
| 248 |
+
});
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
// Animate number value
|
| 252 |
+
function animateValue(element, start, end, duration) {
|
| 253 |
+
const range = end - start;
|
| 254 |
+
const increment = end > start ? 1 : -1;
|
| 255 |
+
const stepTime = Math.abs(Math.floor(duration / (range / 100)));
|
| 256 |
+
let current = start;
|
| 257 |
+
|
| 258 |
+
const timer = setInterval(() => {
|
| 259 |
+
current += range / 20;
|
| 260 |
+
if ((increment > 0 && current >= end) || (increment < 0 && current <= end)) {
|
| 261 |
+
current = end;
|
| 262 |
+
clearInterval(timer);
|
| 263 |
+
}
|
| 264 |
+
element.textContent = ' + current.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
| 265 |
+
}, stepTime);
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
// Submit quote request
|
| 269 |
+
function submitQuote() {
|
| 270 |
+
const type = document.getElementById('pallet-type').value;
|
| 271 |
+
const quantity = document.getElementById('quantity').value;
|
| 272 |
+
|
| 273 |
+
// Store in sessionStorage for contact form
|
| 274 |
+
sessionStorage.setItem('quoteType', type);
|
| 275 |
+
sessionStorage.setItem('quoteQuantity', quantity);
|
| 276 |
+
|
| 277 |
+
window.location.href = 'contact.html?subject=quote';
|
| 278 |
+
}
|
| 279 |
+
|
| 280 |
+
// Setup product filters
|
| 281 |
+
function setupProductFilters() {
|
| 282 |
+
const buttons = document.querySelectorAll('.filter-btn');
|
| 283 |
+
const cards = document.querySelectorAll('[data-category]');
|
| 284 |
+
|
| 285 |
+
if (!buttons.length) return;
|
| 286 |
+
|
| 287 |
+
buttons.forEach(btn => {
|
| 288 |
+
btn.addEventListener('click', () => {
|
| 289 |
+
// Update active state
|
| 290 |
+
buttons.forEach(b => {
|
| 291 |
+
b.classList.remove('active', 'bg-primary-600', 'text-white');
|
| 292 |
+
b.classList.add('bg-white', 'dark:bg-wood-800');
|
| 293 |
+
});
|
| 294 |
+
btn.classList.add('active', 'bg-primary-600', 'text-white');
|
| 295 |
+
btn.classList.remove('bg-white', 'dark:bg-wood-800');
|
| 296 |
+
|
| 297 |
+
// Filter cards
|
| 298 |
+
const filter = btn.dataset.filter;
|
| 299 |
+
|
| 300 |
+
cards.forEach(card => {
|
| 301 |
+
if (filter === 'all' || card.dataset.category === filter) {
|
| 302 |
+
card.style.display = 'block';
|
| 303 |
+
card.classList.add('animate-scale-in');
|
| 304 |
+
} else {
|
| 305 |
+
card.style.display = 'none';
|
| 306 |
+
}
|
| 307 |
+
});
|
| 308 |
+
});
|
| 309 |
+
});
|
| 310 |
+
}
|
| 311 |
+
|
| 312 |
+
// Setup forms
|
| 313 |
+
function setupForms() {
|
| 314 |
+
// Contact form
|
| 315 |
+
const contactForm = document.getElementById('contact-form');
|
| 316 |
+
if (contactForm) {
|
| 317 |
+
// Pre-fill if coming from quote
|
| 318 |
+
const urlParams = new URLSearchParams(window.location.search);
|
| 319 |
+
const subject = urlParams.get('subject');
|
| 320 |
+
if (subject === 'quote') {
|
| 321 |
+
const subjectSelect = contactForm.querySelector('select');
|
| 322 |
+
if (subjectSelect) subjectSelect.value = 'Request Quote';
|
| 323 |
+
}
|
| 324 |
+
|
| 325 |
+
contactForm.addEventListener('submit', function(e) {
|
| 326 |
+
e.preventDefault();
|
| 327 |
+
showToast('Message sent successfully! We\'ll get back to you within 2 hours.');
|
| 328 |
+
this.reset();
|
| 329 |
+
});
|
| 330 |
+
}
|
| 331 |
+
|
| 332 |
+
// B2B form
|
| 333 |
+
const b2bForm = document.getElementById('b2b-form');
|
| 334 |
+
if (b2bForm) {
|
| 335 |
+
b2bForm.addEventListener('submit', function(e) {
|
| 336 |
+
e.preventDefault();
|
| 337 |
+
showToast('Consultation request submitted! Our B2B team will contact you shortly.');
|
| 338 |
+
this.reset();
|
| 339 |
+
});
|
| 340 |
+
}
|
| 341 |
+
}
|
| 342 |
+
|
| 343 |
+
// Show toast notification
|
| 344 |
+
function showToast(message) {
|
| 345 |
+
// Remove existing toast
|
| 346 |
+
const existing = document.querySelector('.toast');
|
| 347 |
+
if (existing) existing.remove();
|
| 348 |
+
|
| 349 |
+
const toast = document.createElement('div');
|
| 350 |
+
toast.className = 'toast';
|
| 351 |
+
toast.innerHTML = `
|
| 352 |
+
<div class="flex items-center gap-3">
|
| 353 |
+
<i data-feather="check-circle" class="w-5 h-5 text-primary-600"></i>
|
| 354 |
+
<span>${message}</span>
|
| 355 |
+
</div>
|
| 356 |
+
`;
|
| 357 |
+
document.body.appendChild(toast);
|
| 358 |
+
|
| 359 |
+
if (typeof feather !== 'undefined') {
|
| 360 |
+
feather.replace();
|
| 361 |
+
}
|
| 362 |
+
|
| 363 |
+
setTimeout(() => toast.classList.add('show'), 10);
|
| 364 |
+
setTimeout(() => {
|
| 365 |
+
toast.classList.remove('show');
|
| 366 |
+
setTimeout(() => toast.remove(), 300);
|
| 367 |
+
}, 4000);
|
| 368 |
+
}
|
| 369 |
+
|
| 370 |
+
// Setup scroll animations
|
| 371 |
+
function setupScrollAnimations() {
|
| 372 |
+
const observerOptions = {
|
| 373 |
+
threshold: 0.1,
|
| 374 |
+
rootMargin: '0px 0px -50px 0px'
|
| 375 |
+
};
|
| 376 |
+
|
| 377 |
+
const observer = new IntersectionObserver((entries) => {
|
| 378 |
+
entries.forEach(entry => {
|
| 379 |
+
if (entry.isIntersecting) {
|
| 380 |
+
entry.target.classList.add('animate-slide-up');
|
| 381 |
+
observer.unobserve(entry.target);
|
| 382 |
+
}
|
| 383 |
+
});
|
| 384 |
+
}, observerOptions);
|
| 385 |
+
|
| 386 |
+
// Observe sections for animation
|
| 387 |
+
document.querySelectorAll('section > div').forEach(el => {
|
| 388 |
+
el.style.opacity = '0';
|
| 389 |
+
el.style.transform = 'translateY(30px)';
|
| 390 |
+
observer.observe(el);
|
| 391 |
+
});
|
| 392 |
+
}
|
| 393 |
+
|
| 394 |
+
// Add CSS animation classes dynamically
|
| 395 |
+
const style = document.createElement('style');
|
| 396 |
+
style.textContent = `
|
| 397 |
+
.animate-slide-up {
|
| 398 |
+
animation: slideUp 0.6s ease-out forwards;
|
| 399 |
+
}
|
| 400 |
+
|
| 401 |
+
@keyframes slideUp {
|
| 402 |
+
from {
|
| 403 |
+
opacity: 0;
|
| 404 |
+
transform: translateY(30px);
|
| 405 |
+
}
|
| 406 |
+
to {
|
| 407 |
+
opacity: 1;
|
| 408 |
+
transform: translateY(0);
|
| 409 |
+
}
|
| 410 |
+
}
|
| 411 |
+
`;
|
| 412 |
+
document.head.appendChild(style);
|