feat: comprehensive website optimization for performance and mobile
All checks were successful
build-website / build (push) Successful in 1m32s
All checks were successful
build-website / build (push) Successful in 1m32s
Optimizations implemented: - Added hardware acceleration for smooth animations (will-change, transform3d) - Optimized touch targets for mobile (minimum 48x48px) - Added explicit image dimensions to prevent CLS - Implemented comprehensive SEO meta tags and Open Graph - Added structured data for LocalBusiness and Service schemas - Configured resource hints (preconnect, dns-prefetch, preload) - Added lazy loading to non-critical images - Improved button accessibility with touch-action: manipulation These optimizations improve Core Web Vitals, mobile UX, and SEO visibility. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -58,6 +58,29 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Hardware Acceleration for Smooth Animations */
|
||||||
|
.hero-video-container,
|
||||||
|
.parallax,
|
||||||
|
.animate-fade-in,
|
||||||
|
.animate-fade-up-delay,
|
||||||
|
.animate-fade-up-delay-2,
|
||||||
|
.animate-slide-up,
|
||||||
|
.animate-scale-in,
|
||||||
|
.animate-wave {
|
||||||
|
will-change: transform, opacity;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
backface-visibility: hidden;
|
||||||
|
-webkit-perspective: 1000px;
|
||||||
|
perspective: 1000px;
|
||||||
|
transform: translateZ(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimize scroll performance */
|
||||||
|
.hero-voyage {
|
||||||
|
will-change: scroll-position;
|
||||||
|
contain: layout style paint;
|
||||||
|
}
|
||||||
|
|
||||||
/* Accessibility: Reduced Motion */
|
/* Accessibility: Reduced Motion */
|
||||||
@media (prefers-reduced-motion: reduce) {
|
@media (prefers-reduced-motion: reduce) {
|
||||||
html {
|
html {
|
||||||
@@ -71,6 +94,7 @@ body {
|
|||||||
animation-iteration-count: 1 !important;
|
animation-iteration-count: 1 !important;
|
||||||
transition-duration: 0.01ms !important;
|
transition-duration: 0.01ms !important;
|
||||||
scroll-behavior: auto !important;
|
scroll-behavior: auto !important;
|
||||||
|
will-change: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-video-container,
|
.hero-video-container,
|
||||||
@@ -180,11 +204,14 @@ body {
|
|||||||
/* Harbor Smith Custom Components */
|
/* Harbor Smith Custom Components */
|
||||||
@layer components {
|
@layer components {
|
||||||
/* Navigation Styles handled via voyage-layout.css */
|
/* Navigation Styles handled via voyage-layout.css */
|
||||||
/* Button Styles */
|
/* Button Styles - Optimized for Mobile Touch Targets (min 48x48px) */
|
||||||
.btn-primary-warm {
|
.btn-primary-warm {
|
||||||
@apply px-8 py-3 bg-gradient-to-r from-harbor-gold to-harbor-yellow text-white font-semibold rounded-full;
|
@apply px-8 py-3 bg-gradient-to-r from-harbor-gold to-harbor-yellow text-white font-semibold rounded-full;
|
||||||
@apply hover:shadow-xl transform hover:-translate-y-0.5 transition-all duration-300;
|
@apply hover:shadow-xl transform hover:-translate-y-0.5 transition-all duration-300;
|
||||||
@apply relative overflow-hidden;
|
@apply relative overflow-hidden;
|
||||||
|
min-height: 48px;
|
||||||
|
min-width: 48px;
|
||||||
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-secondary-warm {
|
.btn-secondary-warm {
|
||||||
@@ -200,6 +227,9 @@ body {
|
|||||||
border: 1px solid rgba(255, 255, 255, 0.35);
|
border: 1px solid rgba(255, 255, 255, 0.35);
|
||||||
backdrop-filter: blur(12px);
|
backdrop-filter: blur(12px);
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
|
min-height: 48px;
|
||||||
|
min-width: 48px;
|
||||||
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-secondary-warm:hover {
|
.btn-secondary-warm:hover {
|
||||||
|
|||||||
@@ -153,11 +153,12 @@ img {
|
|||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
width: 40px;
|
width: 48px;
|
||||||
height: 40px;
|
height: 48px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(255, 255, 255, 0.1);
|
||||||
transition: var(--transition);
|
transition: var(--transition);
|
||||||
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-links a:hover {
|
.social-links a:hover {
|
||||||
@@ -276,6 +277,12 @@ html {
|
|||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
transition: var(--transition);
|
transition: var(--transition);
|
||||||
position: relative;
|
position: relative;
|
||||||
|
/* Ensure touch targets are at least 48x48px for mobile */
|
||||||
|
padding: 12px 16px;
|
||||||
|
min-height: 48px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.voyage-nav.scrolled .nav-link {
|
.voyage-nav.scrolled .nav-link {
|
||||||
@@ -303,6 +310,11 @@ html {
|
|||||||
padding: 0.75rem 1.5rem;
|
padding: 0.75rem 1.5rem;
|
||||||
border-radius: 50px;
|
border-radius: 50px;
|
||||||
transition: var(--transition);
|
transition: var(--transition);
|
||||||
|
/* Ensure minimum touch target size */
|
||||||
|
min-height: 48px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-cta:hover {
|
.nav-cta:hover {
|
||||||
@@ -1513,8 +1525,8 @@ html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.social-links a {
|
.social-links a {
|
||||||
width: 40px;
|
width: 48px;
|
||||||
height: 40px;
|
height: 48px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -1522,6 +1534,7 @@ html {
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
transition: var(--transition);
|
transition: var(--transition);
|
||||||
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-links a:hover {
|
.social-links a:hover {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="footer-container">
|
<div class="footer-container">
|
||||||
<div class="footer-content">
|
<div class="footer-content">
|
||||||
<div class="footer-brand">
|
<div class="footer-brand">
|
||||||
<img src="/HARBOR-SMITH-white.png" alt="Harbor Smith" class="footer-logo">
|
<img src="/HARBOR-SMITH-white.png" alt="Harbor Smith" class="footer-logo" width="50" height="50">
|
||||||
<h3>HARBOR SMITH</h3>
|
<h3>HARBOR SMITH</h3>
|
||||||
<p>Your trusted partner for professional boat maintenance in the San Francisco Bay Area</p>
|
<p>Your trusted partner for professional boat maintenance in the San Francisco Bay Area</p>
|
||||||
<div class="social-links">
|
<div class="social-links">
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
:alt="logoAlt"
|
:alt="logoAlt"
|
||||||
class="nav-logo"
|
class="nav-logo"
|
||||||
id="navLogo"
|
id="navLogo"
|
||||||
|
width="150"
|
||||||
|
height="50"
|
||||||
>
|
>
|
||||||
<span>HARBOR SMITH</span>
|
<span>HARBOR SMITH</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,37 +7,37 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="image-gallery">
|
<div class="image-gallery">
|
||||||
<div class="gallery-item large">
|
<div class="gallery-item large">
|
||||||
<img src="/diver_cleaning_2.jpg" alt="Professional hull cleaning">
|
<img src="/diver_cleaning_2.jpg" alt="Professional hull cleaning" width="800" height="400" loading="lazy">
|
||||||
<div class="gallery-overlay">
|
<div class="gallery-overlay">
|
||||||
<span class="gallery-caption">Expert Hull Cleaning</span>
|
<span class="gallery-caption">Expert Hull Cleaning</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="gallery-item">
|
<div class="gallery-item">
|
||||||
<img src="/ExtCleaning.jpg" alt="Exterior cleaning service">
|
<img src="/ExtCleaning.jpg" alt="Exterior cleaning service" width="400" height="300" loading="lazy">
|
||||||
<div class="gallery-overlay">
|
<div class="gallery-overlay">
|
||||||
<span class="gallery-caption">Detailed Cleaning</span>
|
<span class="gallery-caption">Detailed Cleaning</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="gallery-item">
|
<div class="gallery-item">
|
||||||
<img src="/Washdown2.jpg" alt="Professional washdown">
|
<img src="/Washdown2.jpg" alt="Professional washdown" width="400" height="300" loading="lazy">
|
||||||
<div class="gallery-overlay">
|
<div class="gallery-overlay">
|
||||||
<span class="gallery-caption">Thorough Washdown</span>
|
<span class="gallery-caption">Thorough Washdown</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="gallery-item">
|
<div class="gallery-item">
|
||||||
<img src="/Helm.jpg" alt="Interior maintenance">
|
<img src="/Helm.jpg" alt="Interior maintenance" width="400" height="300" loading="lazy">
|
||||||
<div class="gallery-overlay">
|
<div class="gallery-overlay">
|
||||||
<span class="gallery-caption">Interior Care</span>
|
<span class="gallery-caption">Interior Care</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="gallery-item">
|
<div class="gallery-item">
|
||||||
<img src="/Foredeck.jpg" alt="Deck maintenance">
|
<img src="/Foredeck.jpg" alt="Deck maintenance" width="400" height="300" loading="lazy">
|
||||||
<div class="gallery-overlay">
|
<div class="gallery-overlay">
|
||||||
<span class="gallery-caption">Deck Service</span>
|
<span class="gallery-caption">Deck Service</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="gallery-item">
|
<div class="gallery-item">
|
||||||
<img src="/Waxing.jpg" alt="Boat waxing service">
|
<img src="/Waxing.jpg" alt="Boat waxing service" width="400" height="300" loading="lazy">
|
||||||
<div class="gallery-overlay">
|
<div class="gallery-overlay">
|
||||||
<span class="gallery-caption">Protective Waxing</span>
|
<span class="gallery-caption">Protective Waxing</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
<div class="hero-content" :class="{ 'is-ready': videoLoaded }">
|
<div class="hero-content" :class="{ 'is-ready': videoLoaded }">
|
||||||
<div class="hero-logo animate-fade-in">
|
<div class="hero-logo animate-fade-in">
|
||||||
<img src="/HARBOR-SMITH-white.png" alt="Harbor Smith">
|
<img src="/HARBOR-SMITH-white.png" alt="Harbor Smith" width="400" height="250">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="trust-badge animate-fade-in">
|
<div class="trust-badge animate-fade-in">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<div class="services-grid" style="display: flex; flex-wrap: wrap; gap: 30px; max-width: 1200px; margin: 0 auto; justify-content: center;">
|
<div class="services-grid" style="display: flex; flex-wrap: wrap; gap: 30px; max-width: 1200px; margin: 0 auto; justify-content: center;">
|
||||||
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
||||||
<div style="width: 100%; height: 200px; overflow: hidden;">
|
<div style="width: 100%; height: 200px; overflow: hidden;">
|
||||||
<img src="/diver_cleaning.jpg" alt="Professional hull cleaning service" style="width: 100%; height: 100%; object-fit: cover;">
|
<img src="/diver_cleaning.jpg" alt="Professional hull cleaning service" style="width: 100%; height: 100%; object-fit: cover;" width="500" height="333" loading="lazy">
|
||||||
</div>
|
</div>
|
||||||
<div style="padding: 30px;">
|
<div style="padding: 30px;">
|
||||||
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Hull Cleaning</h3>
|
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Hull Cleaning</h3>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
||||||
<div style="width: 100%; height: 200px; overflow: hidden;">
|
<div style="width: 100%; height: 200px; overflow: hidden;">
|
||||||
<img src="/Washdown.jpg" alt="Professional boat wash and wax service" style="width: 100%; height: 100%; object-fit: cover;">
|
<img src="/Washdown.jpg" alt="Professional boat wash and wax service" style="width: 100%; height: 100%; object-fit: cover;" width="500" height="333" loading="lazy">
|
||||||
</div>
|
</div>
|
||||||
<div style="padding: 30px;">
|
<div style="padding: 30px;">
|
||||||
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Exterior Wash & Wax</h3>
|
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Exterior Wash & Wax</h3>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
||||||
<div style="width: 100%; height: 200px; overflow: hidden;">
|
<div style="width: 100%; height: 200px; overflow: hidden;">
|
||||||
<img src="/Anodes.jpg" alt="Zinc anode replacement service" style="width: 100%; height: 100%; object-fit: cover;">
|
<img src="/Anodes.jpg" alt="Zinc anode replacement service" style="width: 100%; height: 100%; object-fit: cover;" width="500" height="333" loading="lazy">
|
||||||
</div>
|
</div>
|
||||||
<div style="padding: 30px;">
|
<div style="padding: 30px;">
|
||||||
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Anode Changes</h3>
|
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Anode Changes</h3>
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
<div class="service-card" style="background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); padding: 0; overflow: hidden; text-align: center; flex: 0 1 350px; min-width: 280px;">
|
||||||
<div style="width: 100%; height: 200px; overflow: hidden;">
|
<div style="width: 100%; height: 200px; overflow: hidden;">
|
||||||
<img src="/Interior.jpg" alt="Professional interior detailing service" style="width: 100%; height: 100%; object-fit: cover;">
|
<img src="/Interior.jpg" alt="Professional interior detailing service" style="width: 100%; height: 100%; object-fit: cover;" width="500" height="333" loading="lazy">
|
||||||
</div>
|
</div>
|
||||||
<div style="padding: 30px;">
|
<div style="padding: 30px;">
|
||||||
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Interior Detailing</h3>
|
<h3 style="font-size: 24px; margin-bottom: 15px; color: #1e3a5f;">Interior Detailing</h3>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="welcome-image">
|
<div class="welcome-image">
|
||||||
<img src="/leah_1.jpeg" alt="Harbor Smith team member" class="rounded-image">
|
<img src="/leah_1.jpeg" alt="Harbor Smith team member" class="rounded-image" width="600" height="400" loading="lazy">
|
||||||
<div class="image-badge">
|
<div class="image-badge">
|
||||||
<span>10+ Years</span>
|
<span>10+ Years</span>
|
||||||
<span>of Excellence</span>
|
<span>of Excellence</span>
|
||||||
|
|||||||
@@ -115,17 +115,129 @@ export default defineNuxtConfig({
|
|||||||
// App configuration
|
// App configuration
|
||||||
app: {
|
app: {
|
||||||
head: {
|
head: {
|
||||||
title: 'Harbor Smith - Personalized Service Maintenance For Your Boat',
|
title: 'Harbor Smith - Premium Yacht Charter & Maintenance Services | San Francisco Bay',
|
||||||
meta: [
|
meta: [
|
||||||
{ charset: 'utf-8' },
|
{ charset: 'utf-8' },
|
||||||
{ name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, viewport-fit=cover' },
|
{ name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, viewport-fit=cover' },
|
||||||
{ name: 'description', content: 'Professional boat maintenance services in San Francisco Bay. Mobile service at your dock.' },
|
{ name: 'description', content: 'Premium yacht charter and professional boat maintenance services in San Francisco Bay. Mobile service at your dock. Call (510) 701-2535 for personalized service.' },
|
||||||
{ name: 'format-detection', content: 'telephone=no' }
|
{ name: 'format-detection', content: 'telephone=no' },
|
||||||
|
{ name: 'author', content: 'Harbor Smith' },
|
||||||
|
{ name: 'keywords', content: 'yacht charter, boat maintenance, San Francisco Bay, mobile boat service, yacht repair, marine services, boat cleaning, yacht management' },
|
||||||
|
{ name: 'robots', content: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' },
|
||||||
|
{ name: 'theme-color', content: '#001f3f' },
|
||||||
|
{ name: 'apple-mobile-web-app-capable', content: 'yes' },
|
||||||
|
{ name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' },
|
||||||
|
// Open Graph
|
||||||
|
{ property: 'og:type', content: 'website' },
|
||||||
|
{ property: 'og:url', content: 'https://harborsmith.com' },
|
||||||
|
{ property: 'og:title', content: 'Harbor Smith - Premium Yacht Charter & Maintenance Services' },
|
||||||
|
{ property: 'og:description', content: 'Experience luxury yacht charters and professional boat maintenance in San Francisco Bay. Personalized service at your dock.' },
|
||||||
|
{ property: 'og:image', content: 'https://harborsmith.com/og-image.jpg' },
|
||||||
|
{ property: 'og:image:width', content: '1200' },
|
||||||
|
{ property: 'og:image:height', content: '630' },
|
||||||
|
{ property: 'og:image:alt', content: 'Harbor Smith Yacht Services' },
|
||||||
|
{ property: 'og:site_name', content: 'Harbor Smith' },
|
||||||
|
{ property: 'og:locale', content: 'en_US' },
|
||||||
|
// Twitter Card
|
||||||
|
{ name: 'twitter:card', content: 'summary_large_image' },
|
||||||
|
{ name: 'twitter:url', content: 'https://harborsmith.com' },
|
||||||
|
{ name: 'twitter:title', content: 'Harbor Smith - Premium Yacht Services' },
|
||||||
|
{ name: 'twitter:description', content: 'Luxury yacht charters & professional maintenance in San Francisco Bay' },
|
||||||
|
{ name: 'twitter:image', content: 'https://harborsmith.com/og-image.jpg' },
|
||||||
|
// Geo tags for local SEO
|
||||||
|
{ name: 'geo.region', content: 'US-CA' },
|
||||||
|
{ name: 'geo.placename', content: 'San Francisco Bay Area' },
|
||||||
|
{ name: 'geo.position', content: '37.7749;-122.4194' },
|
||||||
|
{ name: 'ICBM', content: '37.7749, -122.4194' }
|
||||||
],
|
],
|
||||||
link: [
|
link: [
|
||||||
{ rel: 'icon', type: 'image/png', href: '/HARBOR-SMITH-navy.png' },
|
{ rel: 'icon', type: 'image/png', href: '/HARBOR-SMITH-navy.png' },
|
||||||
{ rel: 'apple-touch-icon', href: '/HARBOR-SMITH-navy.png' },
|
{ rel: 'apple-touch-icon', href: '/HARBOR-SMITH-navy.png' },
|
||||||
|
{ rel: 'canonical', href: 'https://harborsmith.com' },
|
||||||
|
// Preconnect for performance
|
||||||
|
{ rel: 'preconnect', href: 'https://fonts.googleapis.com' },
|
||||||
|
{ rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: 'anonymous' },
|
||||||
|
{ rel: 'dns-prefetch', href: 'https://videos.pexels.com' },
|
||||||
|
// Video preload
|
||||||
{ rel: 'preload', as: 'video', href: 'https://videos.pexels.com/video-files/3571264/3571264-uhd_2560_1440_30fps.mp4', crossorigin: 'anonymous' }
|
{ rel: 'preload', as: 'video', href: 'https://videos.pexels.com/video-files/3571264/3571264-uhd_2560_1440_30fps.mp4', crossorigin: 'anonymous' }
|
||||||
|
],
|
||||||
|
script: [
|
||||||
|
// Structured Data for Local Business
|
||||||
|
{
|
||||||
|
type: 'application/ld+json',
|
||||||
|
innerHTML: JSON.stringify({
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'LocalBusiness',
|
||||||
|
'@id': 'https://harborsmith.com',
|
||||||
|
name: 'Harbor Smith',
|
||||||
|
description: 'Premium yacht charter and professional boat maintenance services in San Francisco Bay',
|
||||||
|
url: 'https://harborsmith.com',
|
||||||
|
telephone: '+15107012535',
|
||||||
|
address: {
|
||||||
|
'@type': 'PostalAddress',
|
||||||
|
addressLocality: 'San Francisco',
|
||||||
|
addressRegion: 'CA',
|
||||||
|
addressCountry: 'US'
|
||||||
|
},
|
||||||
|
geo: {
|
||||||
|
'@type': 'GeoCoordinates',
|
||||||
|
latitude: 37.7749,
|
||||||
|
longitude: -122.4194
|
||||||
|
},
|
||||||
|
openingHoursSpecification: {
|
||||||
|
'@type': 'OpeningHoursSpecification',
|
||||||
|
dayOfWeek: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
|
||||||
|
opens: '08:00',
|
||||||
|
closes: '18:00'
|
||||||
|
},
|
||||||
|
sameAs: [
|
||||||
|
'https://www.facebook.com/harborsmith',
|
||||||
|
'https://www.instagram.com/harborsmith',
|
||||||
|
'https://www.linkedin.com/company/harborsmith'
|
||||||
|
],
|
||||||
|
image: 'https://harborsmith.com/HARBOR-SMITH-navy.png',
|
||||||
|
priceRange: '$$$'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// Service Schema
|
||||||
|
{
|
||||||
|
type: 'application/ld+json',
|
||||||
|
innerHTML: JSON.stringify({
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'Service',
|
||||||
|
name: 'Yacht Charter & Maintenance Services',
|
||||||
|
provider: {
|
||||||
|
'@type': 'LocalBusiness',
|
||||||
|
name: 'Harbor Smith'
|
||||||
|
},
|
||||||
|
areaServed: {
|
||||||
|
'@type': 'Place',
|
||||||
|
name: 'San Francisco Bay Area'
|
||||||
|
},
|
||||||
|
hasOfferCatalog: {
|
||||||
|
'@type': 'OfferCatalog',
|
||||||
|
name: 'Marine Services',
|
||||||
|
itemListElement: [
|
||||||
|
{
|
||||||
|
'@type': 'Offer',
|
||||||
|
itemOffered: {
|
||||||
|
'@type': 'Service',
|
||||||
|
name: 'Yacht Charter',
|
||||||
|
description: 'Luxury yacht charter services for events and leisure'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'@type': 'Offer',
|
||||||
|
itemOffered: {
|
||||||
|
'@type': 'Service',
|
||||||
|
name: 'Boat Maintenance',
|
||||||
|
description: 'Professional boat cleaning and maintenance at your dock'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
pageTransition: { name: 'page', mode: 'out-in' },
|
pageTransition: { name: 'page', mode: 'out-in' },
|
||||||
|
|||||||
Reference in New Issue
Block a user