@@ -0,0 +1,18 @@
|
||||
Cresta 31 PageSpeed patch — 15 October 2026
|
||||
|
||||
Based on website(3).zip supplied earlier (not on your subsequent local edits).
|
||||
|
||||
Changes:
|
||||
- Both frontend view paths: remove render-blocking Google Fonts and use local system/Georgia fonts; preload CSS hero image at high priority; main landmark; contrast and focus improvements; accurate image dimensions.
|
||||
- 11 gallery thumbnails: cropped/resized to 320x240, re-encoded as WebP.
|
||||
- Separate 640x480 intro image so full-size gallery photo-02 remains untouched.
|
||||
|
||||
Apply in local repo, review diffs before commit:
|
||||
unzip -o Cresta31_pagespeed_fix.zip -d /Volumes/Developer/Applications/CostalEscape/website
|
||||
php artisan view:clear
|
||||
|
||||
Notes:
|
||||
- Lighthouse LCP hero is CSS background. Preload ensures early discovery without restructuring the hero.
|
||||
- Cloudflare beacon script is injected by Cloudflare Web Analytics / Browser Insights, not by these Blade files. Disable it in Cloudflare if you do not need it.
|
||||
- Run Lighthouse again after deployment. Performance scores vary and are not guaranteed.
|
||||
- If local frontend templates were changed after website(3).zip, merge changes instead of overwriting them.
|
||||
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 5.6 KiB |
@@ -1 +1 @@
|
||||
@extends('lodge.layout')@section('content')<section class="hero"><div class="wrap" style="width:100%"><div class="content"><div class="eyebrow">Unwind · Escape · Explore</div><h1>A little escape.<br>A lot to love.</h1><p>Welcome to Cresta 31 — a comfortable lodge retreat made for slow mornings, fresh air and memorable stays.</p><a class="button" style="background:#fff;color:#1b312b" href="#book">Explore your stay →</a></div></div></section><div class="wrap"><div class="booking" id="book" style="position:relative;margin-top:-45px"><form action="{{ route('lodge.availability') }}" method="get"><div class="booking-grid"><div><label for="check_in">Check in</label><input id="check_in" name="check_in" type="date" min="{{ date('Y-m-d') }}" required></div><div><label for="check_out">Check out</label><input id="check_out" name="check_out" type="date" min="{{ date('Y-m-d',strtotime('+1 day')) }}" required></div><div><label for="guests">Guests</label><select id="guests" name="guests">@for($i=1;$i<=config('lodge.max_guests');$i++)<option value="{{ $i }}">{{ $i }} {{ $i===1?'guest':'guests' }}</option>@endfor</select></div><button>Check dates →</button></div></form></div></div><section class="section" id="the-lodge"><div class="wrap intro"><div><div class="eyebrow" style="color:#b48d51">Welcome to Cresta 31</div><h2>Make yourself<br>right at home.</h2><p>Discover the spaces that make Cresta 31 a special place to get away. Whether you're taking a peaceful break or spending time together, settle in and enjoy a change of scenery.</p><p>Browse the lodge photographs below, then choose your dates to check availability.</p><div class="price">From £{{ number_format($rate,0) }} <span class="small">/ night</span></div></div><img src="{{ asset('images/lodge/gallery/photo-02.webp') }}" alt="Cresta 31 lodge interior" loading="lazy"></div></section><section class="section" id="gallery" style="background:#eaece6"><div class="wrap"><div class="eyebrow" style="color:#b48d51">A closer look</div><h2>Explore the lodge</h2><div class="gallery">@for($i=1;$i<=11;$i++)<a href="{{ asset(sprintf('images/lodge/gallery/photo-%02d.webp',$i)) }}" target="_blank" rel="noopener"><img src="{{ asset(sprintf('images/lodge/thumb/photo-%02d.webp',$i)) }}" loading="lazy" decoding="async" width="480" height="320" alt="Cresta 31 lodge photo {{ $i }}"></a>@endfor@foreach($uploadedPhotos as $photo)<a href="{{ asset('storage/'.$photo->gallery_path) }}" target="_blank" rel="noopener"><img src="{{ asset('storage/'.$photo->thumbnail_path) }}" loading="lazy" decoding="async" width="480" height="320" alt="{{ $photo->alt_text }}"></a>@endforeach</div></div></section><section class="section"><div class="wrap" style="text-align:center"><div class="eyebrow">Your next getaway</div><h2>Ready to stay?</h2><p class="small">Choose your dates and send a booking request.</p><a class="button" href="#book">Check availability →</a></div></section>@endsection
|
||||
@extends('lodge.layout')@section('content')<section class="hero"><div class="wrap" style="width:100%"><div class="content"><div class="eyebrow">Unwind · Escape · Explore</div><h1>A little escape.<br>A lot to love.</h1><p>Welcome to Cresta 31 — a comfortable lodge retreat made for slow mornings, fresh air and memorable stays.</p><a class="button" style="background:#fff;color:#1b312b" href="#book">Explore your stay →</a></div></div></section><div class="wrap"><div class="booking" id="book" style="position:relative;margin-top:-45px"><form action="{{ route('lodge.availability') }}" method="get"><div class="booking-grid"><div><label for="check_in">Check in</label><input id="check_in" name="check_in" type="date" min="{{ date('Y-m-d') }}" required></div><div><label for="check_out">Check out</label><input id="check_out" name="check_out" type="date" min="{{ date('Y-m-d',strtotime('+1 day')) }}" required></div><div><label for="guests">Guests</label><select id="guests" name="guests">@for($i=1;$i<=config('lodge.max_guests');$i++)<option value="{{ $i }}">{{ $i }} {{ $i===1?'guest':'guests' }}</option>@endfor</select></div><button>Check dates →</button></div></form></div></div><section class="section" id="the-lodge"><div class="wrap intro"><div><div class="eyebrow" style="color:#76521f">Welcome to Cresta 31</div><h2>Make yourself<br>right at home.</h2><p>Discover the spaces that make Cresta 31 a special place to get away. Whether you're taking a peaceful break or spending time together, settle in and enjoy a change of scenery.</p><p>Browse the lodge photographs below, then choose your dates to check availability.</p><div class="price">From £{{ number_format($rate,0) }} <span class="small">/ night</span></div></div><img src="{{ asset('images/lodge/gallery/photo-02-intro.webp') }}" alt="Cresta 31 lodge interior" loading="lazy" decoding="async" width="640" height="480"></div></section><section class="section" id="gallery" style="background:#eaece6"><div class="wrap"><div class="eyebrow" style="color:#76521f">A closer look</div><h2>Explore the lodge</h2><div class="gallery">@for($i=1;$i<=11;$i++)<a href="{{ asset(sprintf('images/lodge/gallery/photo-%02d.webp',$i)) }}" target="_blank" rel="noopener"><img src="{{ asset(sprintf('images/lodge/thumb/photo-%02d.webp',$i)) }}" loading="lazy" decoding="async" width="320" height="240" alt="Cresta 31 lodge photo {{ $i }}"></a>@endfor@foreach($uploadedPhotos as $photo)<a href="{{ asset('storage/'.$photo->gallery_path) }}" target="_blank" rel="noopener"><img src="{{ asset('storage/'.$photo->thumbnail_path) }}" loading="lazy" decoding="async" width="320" height="240" alt="{{ $photo->alt_text }}"></a>@endforeach</div></div></section><section class="section"><div class="wrap" style="text-align:center"><div class="eyebrow">Your next getaway</div><h2>Ready to stay?</h2><p class="small">Choose your dates and send a booking request.</p><a class="button" href="#book">Check availability →</a></div></section>@endsection
|
||||
@@ -1,7 +1,11 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="csrf-token" content="{{ csrf_token() }}"><title>@yield('title','Cresta 31 | Lodge escapes')</title><meta name="description" content="Escape to Cresta 31. Discover the lodge, check availability and request your stay."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Playfair+Display:wght@500;600&display=swap" rel="stylesheet"><style>
|
||||
:root{--ink:#1b312b;--muted:#697b70;--sand:#f6f3eb;--gold:#c49b5a;--white:#fff}*{box-sizing:border-box}body{margin:0;background:var(--sand);color:var(--ink);font-family:'DM Sans',sans-serif}a{color:inherit;text-decoration:none}h1,h2,h3{font-family:'Playfair Display',serif;font-weight:500}header{position:absolute;top:0;left:0;right:0;z-index:2;color:#fff;display:flex;align-items:center;justify-content:space-between;padding:25px max(5vw,24px)}header .brand{font-family:'Playfair Display',serif;font-size:30px}header nav{display:flex;gap:25px;align-items:center}header a.button{background:#fff;color:var(--ink)}.button,button{display:inline-block;background:var(--ink);color:white;border:0;padding:15px 24px;border-radius:3px;font:600 14px 'DM Sans';cursor:pointer}.button:hover,button:hover{opacity:.88}.wrap{max-width:1200px;margin:auto;padding:0 24px}.hero{height:min(85vh,780px);min-height:530px;position:relative;display:flex;align-items:center;background:#233d34 url('/images/lodge/hero/photo-01.webp') center/cover;color:#fff}.hero:before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(12,30,24,.7),rgba(12,30,24,.08))}.hero .content{position:relative;max-width:750px;padding:80px 0}.eyebrow{text-transform:uppercase;letter-spacing:.24em;font-size:12px;font-weight:700}.hero h1{font-size:clamp(50px,7vw,95px);line-height:1.05;margin:20px 0}.hero p{font-size:18px;max-width:480px;line-height:1.8}.section{padding:85px 0}.section h2{font-size:clamp(34px,4vw,54px);margin:10px 0 25px}.intro{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center}.intro p{line-height:1.9;color:var(--muted)}.intro img{width:100%;height:480px;object-fit:cover}.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.gallery img{width:100%;height:275px;object-fit:cover;border-radius:3px}.booking{background:#fff;padding:34px;box-shadow:0 14px 60px #172e2220;border-radius:5px}.booking-grid{display:grid;grid-template-columns:repeat(3,1fr) auto;gap:15px;align-items:end}label{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.12em;font-weight:700;margin-bottom:9px}input,select,textarea{display:block;width:100%;border:1px solid #d5ddd7;padding:14px;font:inherit;border-radius:3px;background:#fff;color:var(--ink)}.small{color:var(--muted);font-size:14px}.card{background:#fff;padding:36px;border-radius:5px;max-width:760px;margin:auto}.card h1{font-size:46px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.full{grid-column:1/-1}.errors{background:#fff0ed;color:#8c3024;padding:16px;margin:16px 0}.subhero{background:var(--ink);color:#fff;padding:155px 24px 65px}.subhero h1{font-size:54px;margin:0}footer{background:#142820;color:#fff;padding:45px 0;margin-top:30px}footer .wrap{display:flex;justify-content:space-between}.price{font-size:30px;font-family:'Playfair Display',serif}table{border-collapse:collapse;width:100%;background:white}td,th{padding:13px;text-align:left;border-bottom:1px solid #ddd}@media(max-width:760px){header nav a:not(.button){display:none}.intro{grid-template-columns:1fr;gap:25px}.gallery{grid-template-columns:repeat(2,1fr)}.gallery img{height:180px}.booking-grid,.form-grid{grid-template-columns:1fr}.hero{min-height:600px}.section{padding:55px 0}footer .wrap{display:block}}
|
||||
</style></head><body><header><a class="brand" href="{{ route('home') }}">Cresta 31<span style="color:#d9b985">.</span></a><nav><a href="{{ route('home') }}#the-lodge">The lodge</a><a href="{{ route('home') }}#gallery">Gallery</a><a class="button" href="{{ route('home') }}#book">Check availability</a>@auth
|
||||
@if(filled(config('lodge.admin_email')) && strcasecmp(trim((string) auth()->user()->email), trim((string) config('lodge.admin_email'))) === 0)
|
||||
<a href="{{ route('admin.dashboard') }}" class="button" style="background:#d9b985;color:#1b312b">Administration</a>
|
||||
@endif
|
||||
@endauth</nav></header>@yield('content')<footer><div class="wrap"><div><strong>Cresta 31</strong><p class="small">Your next lodge escape starts here.</p></div><div>© {{ date('Y') }} Cresta 31</div></div></footer></body></html>
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="csrf-token" content="{{ csrf_token() }}"><title>@yield('title','Cresta 31 | Lodge escapes')</title><meta name="description" content="Escape to Cresta 31. Discover the lodge, check availability and request your stay."><link rel="preload" as="image" href="{{ asset('images/lodge/hero/photo-01.webp') }}" fetchpriority="high"><style>
|
||||
:root{--ink:#1b312b;--muted:#4c6055;--sand:#f6f3eb;--gold:#c49b5a;--white:#fff}*{box-sizing:border-box}body{margin:0;background:var(--sand);color:var(--ink);font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}a{color:inherit;text-decoration:none}h1,h2,h3{font-family:Georgia,'Times New Roman',serif;font-weight:500}header{position:absolute;top:0;left:0;right:0;z-index:2;color:#fff;display:flex;align-items:center;justify-content:space-between;padding:25px max(5vw,24px)}header .brand{font-family:Georgia,'Times New Roman',serif;font-size:30px}header nav{display:flex;gap:25px;align-items:center}header a.button{background:#fff;color:var(--ink)}.button,button{display:inline-block;background:var(--ink);color:white;border:0;padding:15px 24px;border-radius:3px;font:600 14px system-ui,-apple-system,'Segoe UI',sans-serif;cursor:pointer}.button:hover,button:hover{opacity:.88}.wrap{max-width:1200px;margin:auto;padding:0 24px}.hero{height:min(85vh,780px);min-height:530px;position:relative;display:flex;align-items:center;background:#233d34 url('/images/lodge/hero/photo-01.webp') center/cover;color:#fff}.hero:before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(12,30,24,.7),rgba(12,30,24,.08))}.hero .content{position:relative;max-width:750px;padding:80px 0}.eyebrow{text-transform:uppercase;letter-spacing:.24em;font-size:12px;font-weight:700}.hero h1{font-size:clamp(50px,7vw,95px);line-height:1.05;margin:20px 0}.hero p{font-size:18px;max-width:480px;line-height:1.8}.section{padding:85px 0}.section h2{font-size:clamp(34px,4vw,54px);margin:10px 0 25px}.intro{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center}.intro p{line-height:1.9;color:var(--muted)}.intro img{width:100%;height:480px;object-fit:cover}.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.gallery img{width:100%;height:275px;object-fit:cover;border-radius:3px}.booking{background:#fff;padding:34px;box-shadow:0 14px 60px #172e2220;border-radius:5px}.booking-grid{display:grid;grid-template-columns:repeat(3,1fr) auto;gap:15px;align-items:end}label{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.12em;font-weight:700;margin-bottom:9px}input,select,textarea{display:block;width:100%;border:1px solid #d5ddd7;padding:14px;font:inherit;border-radius:3px;background:#fff;color:var(--ink)}.small{color:var(--muted);font-size:14px}.card{background:#fff;padding:36px;border-radius:5px;max-width:760px;margin:auto}.card h1{font-size:46px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.full{grid-column:1/-1}.errors{background:#fff0ed;color:#8c3024;padding:16px;margin:16px 0}.subhero{background:var(--ink);color:#fff;padding:155px 24px 65px}.subhero h1{font-size:54px;margin:0}footer{background:#142820;color:#fff;padding:45px 0;margin-top:30px}footer .wrap{display:flex;justify-content:space-between}footer .small{color:#d5e0d9}.price{font-size:30px;font-family:Georgia,'Times New Roman',serif}table{border-collapse:collapse;width:100%;background:white}td,th{padding:13px;text-align:left;border-bottom:1px solid #ddd}@media(max-width:760px){header nav a:not(.button){display:none}.intro{grid-template-columns:1fr;gap:25px}.gallery{grid-template-columns:repeat(2,1fr)}.gallery img{height:180px}.booking-grid,.form-grid{grid-template-columns:1fr}.hero{min-height:600px}.section{padding:55px 0}footer .wrap{display:block}}
|
||||
/* Contrast and accessibility */
|
||||
.eyebrow{color:#654517}.hero .eyebrow{color:#f5e4c7}
|
||||
.hero{background-color:#233d34}
|
||||
.hero .content{isolation:isolate}
|
||||
.intro p,.small{color:var(--muted)}.price .small{color:#4c6055}
|
||||
footer .small{color:#d5e0d9}
|
||||
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid #ad7d33;outline-offset:3px}
|
||||
@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
|
||||
</style></head><body><header><a class="brand" href="{{ route('home') }}">Cresta 31<span style="color:#d9b985">.</span></a><nav><a href="{{ route('home') }}#the-lodge">The lodge</a><a href="{{ route('home') }}#gallery">Gallery</a><a class="button" href="{{ route('home') }}#book">Check availability</a></nav></header><main id="main-content">@yield('content')</main><footer><div class="wrap"><div><strong>Cresta 31</strong><p class="small">Your next lodge escape starts here.</p></div><div>© {{ date('Y') }} Cresta 31</div></div></footer></body></html>
|
||||
@@ -1 +1 @@
|
||||
@extends('lodge.layout')@section('content')<section class="hero"><div class="wrap" style="width:100%"><div class="content"><div class="eyebrow">Unwind · Escape · Explore</div><h1>A little escape.<br>A lot to love.</h1><p>Welcome to Cresta 31 — a comfortable lodge retreat made for slow mornings, fresh air and memorable stays.</p><a class="button" style="background:#fff;color:#1b312b" href="#book">Explore your stay →</a></div></div></section><div class="wrap"><div class="booking" id="book" style="position:relative;margin-top:-45px"><form action="{{ route('lodge.availability') }}" method="get"><div class="booking-grid"><div><label for="check_in">Check in</label><input id="check_in" name="check_in" type="date" min="{{ date('Y-m-d') }}" required></div><div><label for="check_out">Check out</label><input id="check_out" name="check_out" type="date" min="{{ date('Y-m-d',strtotime('+1 day')) }}" required></div><div><label for="guests">Guests</label><select id="guests" name="guests">@for($i=1;$i<=config('lodge.max_guests');$i++)<option value="{{ $i }}">{{ $i }} {{ $i===1?'guest':'guests' }}</option>@endfor</select></div><button>Check dates →</button></div></form></div></div><section class="section" id="the-lodge"><div class="wrap intro"><div><div class="eyebrow" style="color:#b48d51">Welcome to Cresta 31</div><h2>Make yourself<br>right at home.</h2><p>Discover the spaces that make Cresta 31 a special place to get away. Whether you're taking a peaceful break or spending time together, settle in and enjoy a change of scenery.</p><p>Browse the lodge photographs below, then choose your dates to check availability.</p><div class="price">From £{{ number_format($rate,0) }} <span class="small">/ night</span></div></div><img src="{{ asset('images/lodge/gallery/photo-02.webp') }}" alt="Cresta 31 lodge interior" loading="lazy"></div></section><section class="section" id="gallery" style="background:#eaece6"><div class="wrap"><div class="eyebrow" style="color:#b48d51">A closer look</div><h2>Explore the lodge</h2><div class="gallery">@for($i=1;$i<=11;$i++)<a href="{{ asset(sprintf('images/lodge/gallery/photo-%02d.webp',$i)) }}" target="_blank" rel="noopener"><img src="{{ asset(sprintf('images/lodge/thumb/photo-%02d.webp',$i)) }}" loading="lazy" decoding="async" width="480" height="320" alt="Cresta 31 lodge photo {{ $i }}"></a>@endfor@foreach($uploadedPhotos as $photo)<a href="{{ asset('storage/'.$photo->gallery_path) }}" target="_blank" rel="noopener"><img src="{{ asset('storage/'.$photo->thumbnail_path) }}" loading="lazy" decoding="async" width="480" height="320" alt="{{ $photo->alt_text }}"></a>@endforeach</div></div></section><section class="section"><div class="wrap" style="text-align:center"><div class="eyebrow">Your next getaway</div><h2>Ready to stay?</h2><p class="small">Choose your dates and send a booking request.</p><a class="button" href="#book">Check availability →</a></div></section>@endsection
|
||||
@extends('lodge.layout')@section('content')<section class="hero"><div class="wrap" style="width:100%"><div class="content"><div class="eyebrow">Unwind · Escape · Explore</div><h1>A little escape.<br>A lot to love.</h1><p>Welcome to Cresta 31 — a comfortable lodge retreat made for slow mornings, fresh air and memorable stays.</p><a class="button" style="background:#fff;color:#1b312b" href="#book">Explore your stay →</a></div></div></section><div class="wrap"><div class="booking" id="book" style="position:relative;margin-top:-45px"><form action="{{ route('lodge.availability') }}" method="get"><div class="booking-grid"><div><label for="check_in">Check in</label><input id="check_in" name="check_in" type="date" min="{{ date('Y-m-d') }}" required></div><div><label for="check_out">Check out</label><input id="check_out" name="check_out" type="date" min="{{ date('Y-m-d',strtotime('+1 day')) }}" required></div><div><label for="guests">Guests</label><select id="guests" name="guests">@for($i=1;$i<=config('lodge.max_guests');$i++)<option value="{{ $i }}">{{ $i }} {{ $i===1?'guest':'guests' }}</option>@endfor</select></div><button>Check dates →</button></div></form></div></div><section class="section" id="the-lodge"><div class="wrap intro"><div><div class="eyebrow" style="color:#76521f">Welcome to Cresta 31</div><h2>Make yourself<br>right at home.</h2><p>Discover the spaces that make Cresta 31 a special place to get away. Whether you're taking a peaceful break or spending time together, settle in and enjoy a change of scenery.</p><p>Browse the lodge photographs below, then choose your dates to check availability.</p><div class="price">From £{{ number_format($rate,0) }} <span class="small">/ night</span></div></div><img src="{{ asset('images/lodge/gallery/photo-02-intro.webp') }}" alt="Cresta 31 lodge interior" loading="lazy" decoding="async" width="640" height="480"></div></section><section class="section" id="gallery" style="background:#eaece6"><div class="wrap"><div class="eyebrow" style="color:#76521f">A closer look</div><h2>Explore the lodge</h2><div class="gallery">@for($i=1;$i<=11;$i++)<a href="{{ asset(sprintf('images/lodge/gallery/photo-%02d.webp',$i)) }}" target="_blank" rel="noopener"><img src="{{ asset(sprintf('images/lodge/thumb/photo-%02d.webp',$i)) }}" loading="lazy" decoding="async" width="320" height="240" alt="Cresta 31 lodge photo {{ $i }}"></a>@endfor@foreach($uploadedPhotos as $photo)<a href="{{ asset('storage/'.$photo->gallery_path) }}" target="_blank" rel="noopener"><img src="{{ asset('storage/'.$photo->thumbnail_path) }}" loading="lazy" decoding="async" width="320" height="240" alt="{{ $photo->alt_text }}"></a>@endforeach</div></div></section><section class="section"><div class="wrap" style="text-align:center"><div class="eyebrow">Your next getaway</div><h2>Ready to stay?</h2><p class="small">Choose your dates and send a booking request.</p><a class="button" href="#book">Check availability →</a></div></section>@endsection
|
||||
@@ -1,7 +1,11 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="csrf-token" content="{{ csrf_token() }}"><title>@yield('title','Cresta 31 | Lodge escapes')</title><meta name="description" content="Escape to Cresta 31. Discover the lodge, check availability and request your stay."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Playfair+Display:wght@500;600&display=swap" rel="stylesheet"><style>
|
||||
:root{--ink:#1b312b;--muted:#697b70;--sand:#f6f3eb;--gold:#c49b5a;--white:#fff}*{box-sizing:border-box}body{margin:0;background:var(--sand);color:var(--ink);font-family:'DM Sans',sans-serif}a{color:inherit;text-decoration:none}h1,h2,h3{font-family:'Playfair Display',serif;font-weight:500}header{position:absolute;top:0;left:0;right:0;z-index:2;color:#fff;display:flex;align-items:center;justify-content:space-between;padding:25px max(5vw,24px)}header .brand{font-family:'Playfair Display',serif;font-size:30px}header nav{display:flex;gap:25px;align-items:center}header a.button{background:#fff;color:var(--ink)}.button,button{display:inline-block;background:var(--ink);color:white;border:0;padding:15px 24px;border-radius:3px;font:600 14px 'DM Sans';cursor:pointer}.button:hover,button:hover{opacity:.88}.wrap{max-width:1200px;margin:auto;padding:0 24px}.hero{height:min(85vh,780px);min-height:530px;position:relative;display:flex;align-items:center;background:#233d34 url('/images/lodge/hero/photo-01.webp') center/cover;color:#fff}.hero:before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(12,30,24,.7),rgba(12,30,24,.08))}.hero .content{position:relative;max-width:750px;padding:80px 0}.eyebrow{text-transform:uppercase;letter-spacing:.24em;font-size:12px;font-weight:700}.hero h1{font-size:clamp(50px,7vw,95px);line-height:1.05;margin:20px 0}.hero p{font-size:18px;max-width:480px;line-height:1.8}.section{padding:85px 0}.section h2{font-size:clamp(34px,4vw,54px);margin:10px 0 25px}.intro{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center}.intro p{line-height:1.9;color:var(--muted)}.intro img{width:100%;height:480px;object-fit:cover}.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.gallery img{width:100%;height:275px;object-fit:cover;border-radius:3px}.booking{background:#fff;padding:34px;box-shadow:0 14px 60px #172e2220;border-radius:5px}.booking-grid{display:grid;grid-template-columns:repeat(3,1fr) auto;gap:15px;align-items:end}label{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.12em;font-weight:700;margin-bottom:9px}input,select,textarea{display:block;width:100%;border:1px solid #d5ddd7;padding:14px;font:inherit;border-radius:3px;background:#fff;color:var(--ink)}.small{color:var(--muted);font-size:14px}.card{background:#fff;padding:36px;border-radius:5px;max-width:760px;margin:auto}.card h1{font-size:46px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.full{grid-column:1/-1}.errors{background:#fff0ed;color:#8c3024;padding:16px;margin:16px 0}.subhero{background:var(--ink);color:#fff;padding:155px 24px 65px}.subhero h1{font-size:54px;margin:0}footer{background:#142820;color:#fff;padding:45px 0;margin-top:30px}footer .wrap{display:flex;justify-content:space-between}.price{font-size:30px;font-family:'Playfair Display',serif}table{border-collapse:collapse;width:100%;background:white}td,th{padding:13px;text-align:left;border-bottom:1px solid #ddd}@media(max-width:760px){header nav a:not(.button){display:none}.intro{grid-template-columns:1fr;gap:25px}.gallery{grid-template-columns:repeat(2,1fr)}.gallery img{height:180px}.booking-grid,.form-grid{grid-template-columns:1fr}.hero{min-height:600px}.section{padding:55px 0}footer .wrap{display:block}}
|
||||
</style></head><body><header><a class="brand" href="{{ route('home') }}">Cresta 31<span style="color:#d9b985">.</span></a><nav><a href="{{ route('home') }}#the-lodge">The lodge</a><a href="{{ route('home') }}#gallery">Gallery</a><a class="button" href="{{ route('home') }}#book">Check availability</a>@auth
|
||||
@if(filled(config('lodge.admin_email')) && strcasecmp(trim((string) auth()->user()->email), trim((string) config('lodge.admin_email'))) === 0)
|
||||
<a href="{{ route('admin.dashboard') }}" class="button" style="background:#d9b985;color:#1b312b">Administration</a>
|
||||
@endif
|
||||
@endauth</nav></header>@yield('content')<footer><div class="wrap"><div><strong>Cresta 31</strong><p class="small">Your next lodge escape starts here.</p></div><div>© {{ date('Y') }} Cresta 31</div></div></footer></body></html>
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="csrf-token" content="{{ csrf_token() }}"><title>@yield('title','Cresta 31 | Lodge escapes')</title><meta name="description" content="Escape to Cresta 31. Discover the lodge, check availability and request your stay."><link rel="preload" as="image" href="{{ asset('images/lodge/hero/photo-01.webp') }}" fetchpriority="high"><style>
|
||||
:root{--ink:#1b312b;--muted:#4c6055;--sand:#f6f3eb;--gold:#c49b5a;--white:#fff}*{box-sizing:border-box}body{margin:0;background:var(--sand);color:var(--ink);font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}a{color:inherit;text-decoration:none}h1,h2,h3{font-family:Georgia,'Times New Roman',serif;font-weight:500}header{position:absolute;top:0;left:0;right:0;z-index:2;color:#fff;display:flex;align-items:center;justify-content:space-between;padding:25px max(5vw,24px)}header .brand{font-family:Georgia,'Times New Roman',serif;font-size:30px}header nav{display:flex;gap:25px;align-items:center}header a.button{background:#fff;color:var(--ink)}.button,button{display:inline-block;background:var(--ink);color:white;border:0;padding:15px 24px;border-radius:3px;font:600 14px system-ui,-apple-system,'Segoe UI',sans-serif;cursor:pointer}.button:hover,button:hover{opacity:.88}.wrap{max-width:1200px;margin:auto;padding:0 24px}.hero{height:min(85vh,780px);min-height:530px;position:relative;display:flex;align-items:center;background:#233d34 url('/images/lodge/hero/photo-01.webp') center/cover;color:#fff}.hero:before{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(12,30,24,.7),rgba(12,30,24,.08))}.hero .content{position:relative;max-width:750px;padding:80px 0}.eyebrow{text-transform:uppercase;letter-spacing:.24em;font-size:12px;font-weight:700}.hero h1{font-size:clamp(50px,7vw,95px);line-height:1.05;margin:20px 0}.hero p{font-size:18px;max-width:480px;line-height:1.8}.section{padding:85px 0}.section h2{font-size:clamp(34px,4vw,54px);margin:10px 0 25px}.intro{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center}.intro p{line-height:1.9;color:var(--muted)}.intro img{width:100%;height:480px;object-fit:cover}.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.gallery img{width:100%;height:275px;object-fit:cover;border-radius:3px}.booking{background:#fff;padding:34px;box-shadow:0 14px 60px #172e2220;border-radius:5px}.booking-grid{display:grid;grid-template-columns:repeat(3,1fr) auto;gap:15px;align-items:end}label{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.12em;font-weight:700;margin-bottom:9px}input,select,textarea{display:block;width:100%;border:1px solid #d5ddd7;padding:14px;font:inherit;border-radius:3px;background:#fff;color:var(--ink)}.small{color:var(--muted);font-size:14px}.card{background:#fff;padding:36px;border-radius:5px;max-width:760px;margin:auto}.card h1{font-size:46px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.full{grid-column:1/-1}.errors{background:#fff0ed;color:#8c3024;padding:16px;margin:16px 0}.subhero{background:var(--ink);color:#fff;padding:155px 24px 65px}.subhero h1{font-size:54px;margin:0}footer{background:#142820;color:#fff;padding:45px 0;margin-top:30px}footer .wrap{display:flex;justify-content:space-between}footer .small{color:#d5e0d9}.price{font-size:30px;font-family:Georgia,'Times New Roman',serif}table{border-collapse:collapse;width:100%;background:white}td,th{padding:13px;text-align:left;border-bottom:1px solid #ddd}@media(max-width:760px){header nav a:not(.button){display:none}.intro{grid-template-columns:1fr;gap:25px}.gallery{grid-template-columns:repeat(2,1fr)}.gallery img{height:180px}.booking-grid,.form-grid{grid-template-columns:1fr}.hero{min-height:600px}.section{padding:55px 0}footer .wrap{display:block}}
|
||||
/* Contrast and accessibility */
|
||||
.eyebrow{color:#654517}.hero .eyebrow{color:#f5e4c7}
|
||||
.hero{background-color:#233d34}
|
||||
.hero .content{isolation:isolate}
|
||||
.intro p,.small{color:var(--muted)}.price .small{color:#4c6055}
|
||||
footer .small{color:#d5e0d9}
|
||||
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid #ad7d33;outline-offset:3px}
|
||||
@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
|
||||
</style></head><body><header><a class="brand" href="{{ route('home') }}">Cresta 31<span style="color:#d9b985">.</span></a><nav><a href="{{ route('home') }}#the-lodge">The lodge</a><a href="{{ route('home') }}#gallery">Gallery</a><a class="button" href="{{ route('home') }}#book">Check availability</a></nav></header><main id="main-content">@yield('content')</main><footer><div class="wrap"><div><strong>Cresta 31</strong><p class="small">Your next lodge escape starts here.</p></div><div>© {{ date('Y') }} Cresta 31</div></div></footer></body></html>
|
||||