84 Commits

Author SHA1 Message Date
Matt
934985c07c fix: critical mobile iOS issues - scrolling and safe areas
All checks were successful
build-website / build (push) Successful in 2m14s
CRITICAL FIXES:
1. Removed iOS position:fixed hack that completely broke scrolling
   - Users can now scroll on iPhones/iPads (site was unusable before)

2. Fixed video not extending into safe areas
   - Video now properly fills the entire screen including notch areas
   - Used CSS env() variables with negative margins for full-bleed effect
   - Content respects safe areas with proper padding

3. Added explicit white background fallback
   - White background shows if video fails to load
   - No longer relies on implicit browser defaults

The site is now fully functional on iOS devices with proper safe area
handling and immersive video experience as intended.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 20:17:18 +02:00
Matt
bbf9c0d436 fix: resolve Docker container startup error with entrypoint script
All checks were successful
build-website / build (push) Successful in 2m12s
- Created docker-entrypoint.sh script to properly start Next.js server
- Script explicitly changes to /app directory and runs node server.js
- Updated Dockerfile to copy and use the entrypoint script
- This fixes the "Cannot find module '/server.js'" error
- Makes deployment more robust against container orchestration overrides

The container now has a proper entrypoint that Portainer expects
and correctly starts the Next.js standalone server.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 20:02:50 +02:00
Matt
39bb603020 fix: Docker container deployment issues
All checks were successful
build-website / build (push) Successful in 2m14s
- Set proper environment variables (NODE_ENV, HOSTNAME, PORT)
- Use ENTRYPOINT and CMD for better container control
- Fix ownership issues with --chown on COPY commands
- Ensure public directory is copied correctly
- Combine user creation commands for efficiency

The container should now start properly with the Next.js standalone server.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 19:52:21 +02:00
Matt
e0e334852e fix: resolve Next.js build failure by removing Vue archive
All checks were successful
build-website / build (push) Successful in 2m37s
- Removed vue-archive directory containing old Nuxt code
- Removed harborsmith-nextjs temporary directory
- Updated tsconfig.json to exclude archived directories
- Updated .dockerignore to exclude archived code
- Updated .gitignore with proper Next.js patterns
- Updated README.md to reflect current project structure

Build now completes successfully without TypeScript errors.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 19:46:46 +02:00
Matt
634257442c fix: Update CI/CD pipeline for Next.js
Some checks failed
build-website / build (push) Failing after 35s
- Updated Gitea workflow to build Next.js instead of Nuxt
- Removed working-directory references to apps/website
- Created Dockerfile for Next.js production builds
- Added standalone output mode to next.config.js for Docker
- Updated build and artifact paths in workflow

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 16:23:28 +02:00
Matt
d0f33f66f3 feat: Migrate to Next.js with complete mobile-optimized website
Some checks failed
build-website / build (push) Failing after 7s
- Replaced Vue/Nuxt with Next.js 15 for better performance and simpler architecture
- Implemented all website sections with responsive design:
  - Hero section with video background and mobile-optimized spacing
  - About section with feature highlights
  - Services showcase with 3 service cards
  - Contact section with CTAs and trust badges
  - Footer with branding
- Added Lucide React icons throughout
- Mobile optimizations:
  - Responsive text and button sizing
  - Touch-friendly CTAs
  - Proper spacing adjustments for mobile/desktop
  - Scroll indicator with bouncing chevron
- Archived Vue/Nuxt version in vue-archive folder
- Moved all assets to Next.js public folder

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 16:12:00 +02:00
Matt
256f7eb069 Revert "fix: iOS Safari safe area - remove HTML height constraint and add body position fix"
All checks were successful
build-website / build (push) Successful in 1m40s
This reverts commit ac7651811c.
2025-09-25 17:04:26 +02:00
Matt
ac7651811c fix: iOS Safari safe area - remove HTML height constraint and add body position fix
All checks were successful
build-website / build (push) Successful in 1m42s
- Remove height: 100% from HTML element that was preventing safe area extension
- Add min-height with -webkit-fill-available instead
- Detect iOS devices and set body position:fixed for proper safe area handling
- iOS Safari requires body to be position:fixed for content to extend into safe areas

This addresses the root cause: parent element constraints preventing video extension
2025-09-25 17:00:42 +02:00
Matt
82e5b4506d fix: complete iOS Safari safe area solution using inset and -webkit-fill-available
All checks were successful
build-website / build (push) Successful in 1m34s
- Replace calc() with env() approach (which returns 0px in portrait)
- Use inset: 0 to fill entire viewport including safe areas
- Add -webkit-fill-available for proper iOS height handling
- Add iOS-specific meta tags for full-screen web app support
- Include style element with !important to override any conflicts
- Use @supports query to target only Safari browsers

This approach bypasses the buggy env() functions and uses native iOS solutions
2025-09-25 16:53:47 +02:00
Matt
73c195ab58 fix: use negative positioning to extend video into iOS safe areas
All checks were successful
build-website / build (push) Successful in 1m39s
- Change top from 0 to calc(-1 * env(safe-area-inset-top, 0px))
- Increase height to calc(100vh + env(safe-area-inset-top, 0px))
- Fix object-position to 'top center' to anchor video at top edge
- This pulls the video container UP into the safe area instead of starting at its boundary
2025-09-25 16:46:49 +02:00
Matt
dc2b97e5e3 fix: nuclear option - inject video directly into DOM bypassing Vue/Nuxt
All checks were successful
build-website / build (push) Successful in 1m42s
- Remove video from Vue template entirely
- Inject video HTML directly into document.body on mount
- Video now exists completely outside #__nuxt and Vue control
- Bypasses all framework hydration and virtual DOM issues
- Add cleanup on unmount to remove injected element

This nuclear approach ensures the video is rendered as pure HTML/CSS without any framework interference that could be blocking iOS Safari safe area extension.
2025-09-25 16:39:07 +02:00
Matt
f36eca27b9 fix: apply complete safe area formula used by Apple and Netflix
All checks were successful
build-website / build (push) Successful in 1m36s
- Use position:fixed with complete calc formula
- Include ALL safe area insets (top, bottom, left, right) in width/height
- Remove iOS-specific overrides that were interfering
- This is the pattern used by Apple.com and Netflix for full-screen video
2025-09-25 16:32:57 +02:00
Matt
f534a4bba3 fix: comprehensive iOS Safari safe area fix
All checks were successful
build-website / build (push) Successful in 1m42s
- Removed Tailwind @apply from body to prevent default backgrounds
- Forced transparent backgrounds on all containers with !important
- Switched from position:fixed to position:absolute (iOS Safari bug workaround)
- Added autoplay fallback for iOS user interaction requirement
- Ensured video extends into safe area with negative top positioning
2025-09-25 16:24:20 +02:00
Matt
2fedc094d8 fix: remove HTML background-color that was blocking video in iOS safe areas
All checks were successful
build-website / build (push) Successful in 1m37s
The root cause was the html element's background-color:#001f3f on line 105 of voyage-layout.css
This opaque background was preventing the video from showing through in the safe areas.
Removing it allows the video to properly extend into the iOS Safari safe areas.
2025-09-25 16:16:27 +02:00
Matt
c7ac41296b fix: use position fixed for video to escape all containing blocks and extend into iOS safe areas
All checks were successful
build-website / build (push) Successful in 1m47s
2025-09-25 16:10:06 +02:00
Matt
b25512ad65 fix: finally resolve iOS safe area issue by removing body background
All checks were successful
build-website / build (push) Successful in 1m34s
- Remove body background that was blocking video from showing in safe areas
- Add main-content wrapper with white background for content sections
- This allows video to extend into safe areas while keeping content readable
- Root cause: body's white background was covering entire viewport including safe areas
2025-09-25 16:02:29 +02:00
Matt
0cbaaccea3 fix: resolve video autoplay and safe area rendering issues
All checks were successful
build-website / build (push) Successful in 1m41s
- Change object-position from center center to center top to anchor video at top edge
- Remove remaining hardcoded fallbacks (59px, 44px) that prevented proper env() values
- Add transition to transform to smooth parallax initialization
- Fixes video autoplay being blocked by repositioning on load
- Fixes safe areas showing background instead of video content
2025-09-25 15:53:36 +02:00
Matt
5de43236c3 fix: resolve iOS Safari safe area and parallax issues
All checks were successful
build-website / build (push) Successful in 1m36s
- Add transform rule to video container for parallax functionality
- Change hero-content to absolute positioning to extend into safe areas
- Remove hardcoded fallback values, use only env() functions
- Delete conflicting mobile CSS overrides with !important declarations
- Fix CSS cascade issues that prevented proper safe area rendering

These changes ensure the video parallax effect works correctly and content
properly extends into iOS safe areas (notch/Dynamic Island).
2025-09-25 15:42:39 +02:00
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