Commit Graph

66 Commits

Author SHA1 Message Date
Matt
9e8b7b3075 fix: restore proper CSS hierarchy for iOS Safari safe areas
All checks were successful
build-website / build (push) Successful in 1m36s
- Remove forced navy background from body element
- Restore white background for body to fix content sections
- Fix hero content padding to allow extension into safe areas
- Remove padding-top additions that pushed content away from safe areas

This fixes the regression where blue background showed through during scrolling
and allows content to properly extend into iOS Safari safe areas.
2025-09-25 11:55:17 +02:00
Matt
1d8e9be567 fix: resolve CSS specificity issue causing white safe areas on iOS Safari
All checks were successful
build-website / build (push) Successful in 1m47s
- Remove white background override from body element (line 238)
- Ensure html and body maintain navy background (#001f3f)
- Simplify HTML element CSS to work properly on iOS
- Add !important to body background to prevent cascade issues
2025-09-25 10:59:52 +02:00
Matt
d504adabf7 fix: comprehensive iOS Safari safe area fix with proper env() usage
All checks were successful
build-website / build (push) Successful in 1m38s
- Add viewport-fit=cover meta tag in nuxt.config.ts for safe area extension
- Remove CSS containment property that was blocking safe area rendering
- Replace hardcoded fallback values with proper max(env(), fallback) syntax
- Fix z-index stacking order (video: 0, footer: 2) to prevent overlays
- Enhance HTML/body background color configuration for safe area coverage
- Add ipx dependency for image optimization

Fixes white background in iOS Safari safe areas by using proper env() functions
with max() for fallbacks instead of hardcoded values that override dynamic sizing.
2025-09-25 10:50:13 +02:00
Matt
2a77ad3913 fix: resolve footer overlay issue on hero video for iOS Safari
All checks were successful
build-website / build (push) Successful in 1m41s
- Adjust footer z-index to -1 to prevent overlay on video
- Ensure proper stacking order for iOS Safari safe area handling
- Maintain existing functionality while fixing visual overlap
2025-09-25 10:12:10 +02:00
d25230920e fix: resolve footer overlay issue on hero video for iOS Safari
All checks were successful
build-website / build (push) Successful in 1m48s
- Add proper z-index hierarchy with footer at z-index: 20
- Create isolated stacking context for hero section
- Implement iOS Safari GPU acceleration optimizations
- Ensure proper layer separation between video, content, and footer
- Add hardware acceleration hints for smooth rendering

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 20:52:55 +02:00
1b9581e90a Revert "fix: restructure layout to allow video extension into iOS safe area"
All checks were successful
build-website / build (push) Successful in 1m49s
This reverts commit c53ac80779.
2025-09-21 20:06:33 +02:00
c53ac80779 fix: restructure layout to allow video extension into iOS safe area
All checks were successful
build-website / build (push) Successful in 1m50s
- Create custom hero layout without constraining wrapper div
- Remove min-h-screen and flex constraints that block video extension
- Change video to position:fixed with z-index:-1 for proper layering
- Fix overflow:clip to overflow:visible in voyage-layout.css
- Revert transparent background to black for stability

This finally solves the iOS Safari safe area issue by removing the DOM
structure constraints that were preventing the video from extending.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 19:59:30 +02:00
8ec50fbf49 fix: comprehensive iOS Safari safe area video extension fix
All checks were successful
build-website / build (push) Successful in 1m48s
- Remove invalid safe-area-max-inset-top (not a valid CSS property)
- Use standard safe-area-inset-top with iOS Safari workarounds
- Remove white background from video container (was blocking transparency)
- Change html/body background to transparent for safe area visibility
- Update status bar style to black-translucent for content under notch
- Add hardcoded fallbacks for iOS Safari portrait bug (env returns 0)

This fixes the issue where the video wasn't extending into the iPhone notch/Dynamic Island
by addressing the root causes: invalid CSS properties, blocking backgrounds, and Safari bugs.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 19:32:56 +02:00
84d6d58dd7 fix: use safe-area-max-inset-top for iOS video extension
All checks were successful
build-website / build (push) Successful in 1m50s
- Remove ClientOnly and Teleport wrappers that were causing SSR issues
- Switch to safe-area-max-inset-top which properly returns notch height on iOS
- Change position from fixed to absolute to prevent footer overlap
- Add proper fallbacks for browsers without safe-area-max support
- Simplify CSS by removing !important flags and duplicate styles

This fixes the Safari bug where env(safe-area-inset-top) returns 0 in portrait mode
by using safe-area-max-inset-top which always returns the correct notch height.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 19:06:08 +02:00
f94e3584ce fix: implement Vue 3 Teleport to bypass DOM containment for iOS video extension
All checks were successful
build-website / build (push) Successful in 1m49s
- Wrapped Teleport in ClientOnly to avoid SSR/hydration issues
- Replaced env() with hardcoded -59px for Dynamic Island (Safari bug workaround)
- Added !important flags to ensure styles aren't overridden
- Set overflow: visible on hero-voyage container
- Used z-index: 0 to ensure video stays behind content

This addresses the Nuxt SSG + Teleport incompatibility and iOS Safari's env() bug

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 18:51:34 +02:00
4dcfea96ce fix: restore hero section with simplified video positioning
All checks were successful
build-website / build (push) Successful in 1m48s
- Removed CSS contain properties that were preventing video from extending into safe area
- Implemented Vue 3 Teleport to bypass DOM containment for iOS video extension
- Video now renders at body level to properly utilize safe area insets
- Kept Safari fallbacks for env() bug workaround

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 18:42:29 +02:00
5e7ac5fbf6 fix: Safari workaround for env() returning 0 in portrait mode
All checks were successful
build-website / build (push) Successful in 1m50s
- Add hardcoded fallbacks using max() function per Apple's recommendation
- Support both constant() and env() for legacy compatibility
- Use 59px fallback for Dynamic Island devices
- Add iOS-specific detection with @supports(-webkit-touch-callout)
- Create improved test page with device detection
- Update hero-content padding with same fallback approach

This works around the known Safari bug where env(safe-area-inset-top)
returns 0px in portrait mode. The video will now extend 59px above the
viewport on Dynamic Island iPhones, ensuring it covers the notch area.
2025-09-21 18:29:20 +02:00
69e4a22354 fix: comprehensive safe area implementation fixes for iOS video display
All checks were successful
build-website / build (push) Successful in 1m46s
- Remove overflow-x: hidden from HeroSection.vue that was clipping video
- Delete duplicate .hero-video-container styles from voyage-layout.css
- Fix navigation to use env() directly instead of CSS variables
- Remove deprecated constant() syntax
- Add safe-area-test.html for testing safe area extension

The video should now properly extend under the iOS notch/Dynamic Island
while keeping content within safe areas.
2025-09-21 18:22:06 +02:00
a9217b54cb fix: comprehensive safe area implementation for hero video
All checks were successful
build-website / build (push) Successful in 1m42s
- Remove overflow:clip from .hero-voyage that was blocking video extension
- Replace hardcoded -50px with proper env(safe-area-inset-top) calculations
- Update hero-content to use env() values directly instead of CSS variables
- Video now properly extends under notch/Dynamic Island on all iOS devices
- Works with Chrome mobile's dynamic address bar using lvh units
- Content stays within safe areas for proper usability
2025-09-21 18:06:56 +02:00
67ae33fc09 fixes
All checks were successful
build-website / build (push) Successful in 1m47s
2025-09-21 17:49:58 +02:00
c35c2f80d1 fix: make hero video cover iOS notch/Dynamic Island using CSS transform
All checks were successful
build-website / build (push) Successful in 1m46s
- Use transform translateY to bypass iOS safe area constraints
- Video now extends into notch/Dynamic Island area on page load
- Removed ineffective iOS-specific negative positioning rules

The transform approach works by moving the element after layout calculations,
successfully bypassing Safari's safe area boundaries.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 17:33:22 +02:00
d844579504 fix: resolve three critical UI issues
All checks were successful
build-website / build (push) Successful in 1m45s
- Fix hero video not displaying in notch safe area by changing z-index from -1 to 1
- Fix lucide icons not showing by installing and configuring nuxt-icon module
- Fix navigation bar bobbing by removing hysteresis thresholds and simplifying scroll handler

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 17:15:29 +02:00
2bc0eb6735 fix: restore hero section with simplified video positioning
All checks were successful
build-website / build (push) Successful in 1m36s
- Remove Teleport implementation that broke the page
- Use fixed positioning for video container
- Change body background to white for iOS safe area
- Maintain iOS-specific video extension rules
2025-09-21 16:56:06 +02:00
eaf31dc56d feat: implement Vue 3 Teleport to bypass DOM containment for iOS video extension
All checks were successful
build-website / build (push) Successful in 1m35s
- Used <Teleport to='body'> to render video at root DOM level
- Bypassed layout container constraints (min-h-screen, flex-grow)
- Added ClientOnly wrapper for SSR compatibility
- Video now positioned directly at body level with fixed positioning
- Added iOS-specific styles to extend video into safe area
- Supports 100vh, 100dvh, and 100lvh for maximum compatibility
- White background fallback if video fails to load
- Object-position: center top for better notch coverage

This solution attempts to extend the video into the iOS safe area by
rendering it outside of all parent container constraints.
2025-09-21 16:48:00 +02:00
bed1067f4d fix: iOS-specific video extension into safe area with white fallback
All checks were successful
build-website / build (push) Successful in 1m39s
- Changed body background from black to white for clean fallback
- Added iOS-specific CSS to extend video 50px beyond safe area
- Used @supports (-webkit-touch-callout: none) to target only iOS Safari
- Added hardware acceleration to prevent header bobbing on iOS
- Non-iOS mobile devices maintain normal video positioning
- Ensures white background shows if video doesn't load/extend properly
2025-09-21 16:25:58 +02:00
342a9123af fixes
All checks were successful
build-website / build (push) Successful in 1m37s
2025-09-21 16:10:10 +02:00
0af4588927 Align hero content grid and tweak iOS theme color
All checks were successful
build-website / build (push) Successful in 1m35s
2025-09-21 16:00:23 +02:00
c9e8dce4d4 Reflow hero layout and update iOS status bar style
All checks were successful
build-website / build (push) Successful in 1m37s
2025-09-21 15:42:39 +02:00
36046ca864 fixes
All checks were successful
build-website / build (push) Successful in 1m36s
2025-09-21 15:27:21 +02:00
81a8c6cf4b Recenter hero content and keep video behind notch
All checks were successful
build-website / build (push) Successful in 1m41s
2025-09-21 15:13:06 +02:00
5055612614 Clamp nav safe area and fix hero video offsets
All checks were successful
build-website / build (push) Successful in 1m36s
2025-09-21 15:04:42 +02:00
07eaf316a0 Stabilize mobile nav padding and extend hero video
All checks were successful
build-website / build (push) Successful in 1m39s
2025-09-21 14:37:28 +02:00
f27b6695e0 Fix mobile hero safe area and nav jitter
All checks were successful
build-website / build (push) Successful in 1m38s
2025-09-21 14:25:52 +02:00
96972a2bca fix: implement GPT's iOS notch video extension solution
All checks were successful
build-website / build (push) Successful in 1m37s
- Added html/body reset styles (margin:0, padding:0, background:#000)
- Removed ALL overflow:hidden from html, body, hero-voyage, and hero-video-container
- Changed hero-voyage to use overflow:clip (prevents scrollbars while allowing extension)
- Fixed video container positioning:
  - Changed from absolute to fixed positioning
  - Added top: calc(-1 * env(safe-area-inset-top)) to pull video into notch
  - Height: calc(100lvh + env(safe-area-inset-top)) with 100vh fallback
  - Set z-index: -1 to place behind all content
- Updated mobile styles to match desktop implementation
- Removed overflow-x:hidden from all parent elements

This follows GPT's exact checklist for iOS notch video extension.
2025-09-21 14:05:30 +02:00
509f7ac57b Revert "fix: restructure video as global backdrop for iOS notch extension"
All checks were successful
build-website / build (push) Successful in 1m34s
This reverts commit ed92c458a9.
2025-09-21 13:54:03 +02:00
ed92c458a9 fix: restructure video as global backdrop for iOS notch extension
All checks were successful
build-website / build (push) Successful in 1m31s
- Created VideoBackdrop component as global sibling layer
- Video now sits at app level behind all content (z-index: 0)
- Hero section made transparent to reveal video backdrop
- Video extends into notch with negative top positioning
- Content remains in safe areas with proper padding
- Removed video container from HeroSection component
- Added app.vue to manage global layout structure

This separation allows the video to truly extend edge-to-edge
including under the iOS notch/Dynamic Island while keeping
all interactive content within safe areas.
2025-09-21 13:48:03 +02:00
bc3ebcb558 revert: restore previous video positioning to fix scrolling issue
All checks were successful
build-website / build (push) Successful in 1m30s
2025-09-21 13:41:58 +02:00
06ce6e6cac fix: use negative positioning for iOS notch video extension
All checks were successful
build-website / build (push) Successful in 1m32s
- Replace broken fixed positioning with absolute + negative top
- Video now extends calc(-1 * env(safe-area-inset-top)) above container
- Height compensated with calc(100dvh + env(safe-area-inset-top))
- Container uses position: relative with overflow: visible
- Fixes iOS Safari bug where fixed positioning doesn't work properly

This approach allows the video to extend under the iOS notch/Dynamic Island
while keeping interactive content in safe areas.
2025-09-21 13:38:51 +02:00
cea7577b52 fix: remove CSS conflicts preventing iOS video from extending under notch
All checks were successful
build-website / build (push) Successful in 1m33s
- Removed incorrect height calculation that added safe areas to video height
- Removed conflicting absolute positioning from main.css
- Video container now properly uses fixed positioning on mobile
- Desktop layout preserved with absolute positioning

The video now correctly extends edge-to-edge under the iOS notch/Dynamic Island
2025-09-21 13:27:16 +02:00
b97be94e2f feat: iOS hero video extends under notch with safe area support
All checks were successful
build-website / build (push) Successful in 1m36s
- Video now uses fixed positioning on mobile to fill entire viewport
- Hero content respects safe-area-inset on all sides (top, left, right, bottom)
- Navigation bar includes safe area padding to stay below notch
- Removed padding-top from hero-voyage to allow video under notch
- Maintains smooth scroll transitions and navbar background changes

This allows the hero video to create an immersive edge-to-edge experience
on iOS devices while keeping all interactive elements accessible.
2025-09-21 13:14:22 +02:00
3b921f4609 feat: make footer contact info clickable
All checks were successful
build-website / build (push) Successful in 1m34s
- Add tel: link to phone number (510) 701-2535
- Add mailto: link to email address hello@harborsmith.co
- Style links to inherit color and remove underline for seamless design

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 12:50:37 +02:00
8d829046d6 feat: update Harbor Smith website content and layout
All checks were successful
build-website / build (push) Successful in 1m42s
- Update hero tagline to "Reliable Care Above and Below the Waterline"
- Remove 5-star rating badge from hero section
- Change "Mobile Service" to "Tailored Service" with wrench icon
- Update section title from "Our Premium Services" to "Our Services"
- Merge Hull Cleaning and Anode Change services into single card
- Rename "Exterior Wash & Wax" to "Exterior Cleaning"
- Update trust indicators to show 3 badges: Years Experience, Customizable Service, Certified Experts
- Remove "Schedule Service" button from booking section
- Fix service card alignment with consistent heights and flexbox layout
- Add responsive layout for trust indicators on mobile (2+1 grid)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-21 12:45:17 +02:00
ed5bb6cc3f fix: improve smooth scroll with ease-out deceleration
All checks were successful
build-website / build (push) Successful in 1m34s
- Changed from linear to ease-out cubic easing function
- Scroll now starts immediately at full speed (no initial delay)
- Gradually decelerates as it approaches the target anchor
- Provides more natural and responsive scrolling experience

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-19 12:31:56 +02:00
753876b071 feat: comprehensive website optimization for performance and mobile
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>
2025-09-19 11:53:47 +02:00
685bcfb86c Fix jarring scroll with linear constant-speed motion
All checks were successful
build-website / build (push) Successful in 1m29s
- Replace easeInOutSine with linear easing (return t)
- Reduce duration from 1200ms to 800ms for snappier feel
- Update all component references to use new duration

Linear easing provides constant-speed scrolling without any
acceleration or deceleration, eliminating the jarring effect.
2025-09-19 11:37:18 +02:00
e8a413542e Fix jarring smooth scroll with sine-based easing
All checks were successful
build-website / build (push) Successful in 1m31s
- Replace easeInOutQuad with easeInOutSine for natural motion
- Add user interruption handling (cancel on wheel/touch/keyboard)
- Add accessibility support for prefers-reduced-motion
- Optimize duration from 1800ms to 1200ms
- Add proper cleanup of event listeners and animation frames
- Update all component references to use new duration

The sine-based easing creates smooth, consistent motion throughout
the entire scroll duration without jarring speed changes.
2025-09-19 11:32:26 +02:00
fc0ee4c33b Fix smooth scroll easing for more consistent motion
All checks were successful
build-website / build (push) Successful in 1m30s
- Changed from easeInOutCubic to easeInOutQuad for smoother motion
- Increased duration from 1.5 to 1.8 seconds
- Fixed jerky acceleration/deceleration issue
- Now provides consistent, smooth scrolling throughout entire motion

The scrolling is now properly smooth without the sudden speed changes.
2025-09-19 11:22:46 +02:00
e0794df092 Add slower smooth scrolling and scroll to explore indicator
All checks were successful
build-website / build (push) Successful in 1m30s
Features added:
- Custom smooth scroll composable with adjustable duration (1.5 seconds)
- Replaced native browser smooth scroll with custom implementation
- Added 'Scroll to explore' text with chevron at bottom of hero
- Animated bounce effect for scroll indicator
- Chevron icon with subtle animation
- Click handler to scroll to services section
- Hidden on mobile for cleaner experience

All anchor links now scroll more slowly and smoothly for better UX.
2025-09-19 11:18:25 +02:00
bcb729c017 Add scroll-to-top functionality on logo/title click
All checks were successful
build-website / build (push) Successful in 1m33s
- Made navbar brand (logo + title) clickable with cursor pointer
- Added scrollToTop function to smoothly scroll to page top
- Especially useful on mobile devices for quick navigation

Users can now tap the Harbor Smith logo or title to return to top.
2025-09-19 11:10:09 +02:00
213813f3a6 Revert app.vue changes that broke header styling
All checks were successful
build-website / build (push) Successful in 1m30s
- Removed app.vue file that was interfering with navbar scroll behavior
- Restored min-h-screen in default.vue layout
- Restored min-height in body CSS
- Kept the mobile footer fixes which are working correctly

The header now properly changes to white background when scrolling past hero.
2025-09-19 11:06:53 +02:00
31bc2604b8 Fix iPhone Safari viewport and mobile footer issues
All checks were successful
build-website / build (push) Successful in 1m30s
Hero Section Viewport Fix:
- Changed body from min-height to height:100% for proper iOS inheritance
- Updated layout wrapper from min-h-screen to h-full
- Created app.vue with explicit height wrapper for Nuxt root
- Maintains complete height inheritance chain: html > body > #__nuxt > layout

Mobile Footer Fix:
- Fixed CSS conflict: removed grid-template-columns from flex container
- Added proper flex column layout for mobile stacking
- Removed margin-left:auto that was causing horizontal overflow
- Added word-wrap and padding for proper text wrapping
- Centered all footer content on mobile devices

These changes ensure the hero section fills the entire iPhone Safari viewport
including the URL bar area, and the footer displays correctly without cutoff.
2025-09-19 11:02:46 +02:00
ae3aefd41b Fix iPhone Safari viewport issue - hero section now fills entire screen
All checks were successful
build-website / build (push) Successful in 1m33s
- Removed safe area padding from .hero-voyage container (was reducing height)
- Simplified video container positioning to fill parent (top:0, bottom:0)
- Applied safe area padding only to .hero-content to protect text/buttons
- Container now uses full viewport height without reduction

The issue was that adding safe area padding to the container itself was
reducing the available height instead of extending it. Safe areas should
only protect content from being obscured, not shrink containers.
2025-09-19 10:50:21 +02:00
86401b91fc Fix iPhone Safari viewport to fill entire screen
All checks were successful
build-website / build (push) Successful in 1m31s
- Add viewport-fit=cover to meta tag for safe area extension
- Implement iOS-specific height handling with -webkit-fill-available
- Use dynamic viewport height (100dvh) for proper mobile behavior
- Extend video container beyond safe areas with negative positioning
- Add safe area padding with env() variables for content positioning
- Include mobile-specific @supports queries for better compatibility

This ensures the hero section fills the entire iPhone viewport from top to bottom, extending behind the status bar and home indicator while keeping content readable within safe areas.
2025-09-19 10:36:14 +02:00
052399e3f7 Improve hero load experience
All checks were successful
build-website / build (push) Successful in 1m29s
2025-09-19 02:50:53 +02:00
8ecb5f9059 Polish hero and buttons for responsiveness
All checks were successful
build-website / build (push) Successful in 1m28s
2025-09-19 02:42:13 +02:00