BuckalewFinancial commited on
Commit
2b691e7
·
verified ·
1 Parent(s): 6a4a4ce

can you complete the build...all other pages

Browse files
Files changed (8) hide show
  1. about.html +356 -0
  2. b2b.html +1 -2
  3. components/footer.js +351 -0
  4. components/navbar.js +372 -0
  5. contact.html +1 -2
  6. index.html +0 -1
  7. products.html +1 -2
  8. 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">&copy; 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);