diff --git a/about/index.html b/about/index.html index 9a0058a..deedaf6 100644 --- a/about/index.html +++ b/about/index.html @@ -4,7 +4,7 @@ About Lahr Carpet Cleaning | Waterloo NY - + @@ -14,7 +14,7 @@ -
+
Waterloo, NY — Finger Lakes Region @@ -29,7 +29,7 @@
- Lahr Carpet Cleaning technician at work + Lahr Carpet Cleaning technician at work
@@ -98,7 +98,7 @@

We serve homes, rental properties, offices, and commercial spaces throughout Seneca, Ontario, Schuyler, and Yates counties. If you are not sure we cover your area, give us a call at 315-719-1218.

- Clean living room carpet in Finger Lakes home + Clean living room carpet in Finger Lakes home
diff --git a/assets/css/styles.css b/assets/css/styles.css index 6119d77..3b03f96 100644 --- a/assets/css/styles.css +++ b/assets/css/styles.css @@ -1181,31 +1181,33 @@ h1,h2,h3,h4 { /* Nav */ .nav-links { display: none; - position: absolute; - top: 100%; + position: fixed; + top: 57px; left: 0; width: 100%; + max-height: calc(100vh - 57px - 60px); + overflow-y: auto; background: var(--color-surface); border-bottom: 1px solid var(--color-border); flex-direction: column; padding: 16px; gap: 4px; - z-index: 999; + z-index: 1001; } .nav-links.active { display: flex; } .nav-links a { text-align: left; } .nav-contact { display: none; - position: absolute; - top: calc(100% + 260px); + position: fixed; + bottom: 0; left: 0; width: 100%; background: var(--color-surface); + border-top: 1px solid var(--color-border); flex-direction: row; - padding: 14px 20px; - border-bottom: 1px solid var(--color-border); + padding: 12px 20px; gap: 12px; - z-index: 999; + z-index: 1002; } .nav-contact.active { display: flex; } .mobile-menu-toggle { display: flex; } diff --git a/assets/images/hero/hero-about.jpg b/assets/images/hero/hero-about.jpg new file mode 100644 index 0000000..df4b8a8 Binary files /dev/null and b/assets/images/hero/hero-about.jpg differ diff --git a/assets/images/hero/hero-about.webp b/assets/images/hero/hero-about.webp new file mode 100644 index 0000000..3dc0e26 Binary files /dev/null and b/assets/images/hero/hero-about.webp differ diff --git a/assets/images/hero/hero-add-ons.jpg b/assets/images/hero/hero-add-ons.jpg new file mode 100644 index 0000000..0a82a20 Binary files /dev/null and b/assets/images/hero/hero-add-ons.jpg differ diff --git a/assets/images/hero/hero-add-ons.webp b/assets/images/hero/hero-add-ons.webp new file mode 100644 index 0000000..74ee5bc Binary files /dev/null and b/assets/images/hero/hero-add-ons.webp differ diff --git a/assets/images/hero/hero-area-rugs.jpg b/assets/images/hero/hero-area-rugs.jpg new file mode 100644 index 0000000..19addbe Binary files /dev/null and b/assets/images/hero/hero-area-rugs.jpg differ diff --git a/assets/images/hero/hero-area-rugs.webp b/assets/images/hero/hero-area-rugs.webp new file mode 100644 index 0000000..f3b571b Binary files /dev/null and b/assets/images/hero/hero-area-rugs.webp differ diff --git a/assets/images/hero/hero-before-after.jpg b/assets/images/hero/hero-before-after.jpg deleted file mode 100644 index 5d1b460..0000000 Binary files a/assets/images/hero/hero-before-after.jpg and /dev/null differ diff --git a/assets/images/hero/hero-before-after.webp b/assets/images/hero/hero-before-after.webp new file mode 100644 index 0000000..ccef775 Binary files /dev/null and b/assets/images/hero/hero-before-after.webp differ diff --git a/assets/images/hero/hero-carpet-cleaning.jpg b/assets/images/hero/hero-carpet-cleaning.jpg deleted file mode 100644 index 8c5cf1f..0000000 Binary files a/assets/images/hero/hero-carpet-cleaning.jpg and /dev/null differ diff --git a/assets/images/hero/hero-carpet-cleaning.webp b/assets/images/hero/hero-carpet-cleaning.webp new file mode 100644 index 0000000..22401d7 Binary files /dev/null and b/assets/images/hero/hero-carpet-cleaning.webp differ diff --git a/assets/images/hero/hero-clean-result.jpg b/assets/images/hero/hero-clean-result.jpg index 2dc3f2a..f56e0f5 100644 Binary files a/assets/images/hero/hero-clean-result.jpg and b/assets/images/hero/hero-clean-result.jpg differ diff --git a/assets/images/hero/hero-clean-result.webp b/assets/images/hero/hero-clean-result.webp new file mode 100644 index 0000000..b729a20 Binary files /dev/null and b/assets/images/hero/hero-clean-result.webp differ diff --git a/assets/images/hero/hero-commercial.jpg b/assets/images/hero/hero-commercial.jpg new file mode 100644 index 0000000..1972305 Binary files /dev/null and b/assets/images/hero/hero-commercial.jpg differ diff --git a/assets/images/hero/hero-commercial.webp b/assets/images/hero/hero-commercial.webp new file mode 100644 index 0000000..ee737f3 Binary files /dev/null and b/assets/images/hero/hero-commercial.webp differ diff --git a/assets/images/hero/hero-floors.jpg b/assets/images/hero/hero-floors.jpg new file mode 100644 index 0000000..0e0ea17 Binary files /dev/null and b/assets/images/hero/hero-floors.jpg differ diff --git a/assets/images/hero/hero-floors.webp b/assets/images/hero/hero-floors.webp new file mode 100644 index 0000000..9b7eeb0 Binary files /dev/null and b/assets/images/hero/hero-floors.webp differ diff --git a/assets/images/hero/hero-hotels.jpg b/assets/images/hero/hero-hotels.jpg new file mode 100644 index 0000000..cbc7263 Binary files /dev/null and b/assets/images/hero/hero-hotels.jpg differ diff --git a/assets/images/hero/hero-hotels.webp b/assets/images/hero/hero-hotels.webp new file mode 100644 index 0000000..4739bd7 Binary files /dev/null and b/assets/images/hero/hero-hotels.webp differ diff --git a/assets/images/hero/hero-living-room.jpg b/assets/images/hero/hero-living-room.jpg index b6aa4f6..5024663 100644 Binary files a/assets/images/hero/hero-living-room.jpg and b/assets/images/hero/hero-living-room.jpg differ diff --git a/assets/images/hero/hero-living-room.webp b/assets/images/hero/hero-living-room.webp new file mode 100644 index 0000000..358ea90 Binary files /dev/null and b/assets/images/hero/hero-living-room.webp differ diff --git a/assets/images/hero/hero-offices.jpg b/assets/images/hero/hero-offices.jpg new file mode 100644 index 0000000..9c1a8be Binary files /dev/null and b/assets/images/hero/hero-offices.jpg differ diff --git a/assets/images/hero/hero-offices.webp b/assets/images/hero/hero-offices.webp new file mode 100644 index 0000000..e43f8e6 Binary files /dev/null and b/assets/images/hero/hero-offices.webp differ diff --git a/assets/images/hero/hero-property-management.jpg b/assets/images/hero/hero-property-management.jpg new file mode 100644 index 0000000..12dcba9 Binary files /dev/null and b/assets/images/hero/hero-property-management.jpg differ diff --git a/assets/images/hero/hero-property-management.webp b/assets/images/hero/hero-property-management.webp new file mode 100644 index 0000000..de0b601 Binary files /dev/null and b/assets/images/hero/hero-property-management.webp differ diff --git a/assets/images/hero/hero-retail.jpg b/assets/images/hero/hero-retail.jpg new file mode 100644 index 0000000..bba82dc Binary files /dev/null and b/assets/images/hero/hero-retail.jpg differ diff --git a/assets/images/hero/hero-retail.webp b/assets/images/hero/hero-retail.webp new file mode 100644 index 0000000..368f477 Binary files /dev/null and b/assets/images/hero/hero-retail.webp differ diff --git a/assets/images/hero/hero-service-area.jpg b/assets/images/hero/hero-service-area.jpg new file mode 100644 index 0000000..9eb2341 Binary files /dev/null and b/assets/images/hero/hero-service-area.jpg differ diff --git a/assets/images/hero/hero-service-area.webp b/assets/images/hero/hero-service-area.webp new file mode 100644 index 0000000..3d3a9cf Binary files /dev/null and b/assets/images/hero/hero-service-area.webp differ diff --git a/assets/images/hero/hero-stairs.jpg b/assets/images/hero/hero-stairs.jpg deleted file mode 100644 index a7ca08b..0000000 Binary files a/assets/images/hero/hero-stairs.jpg and /dev/null differ diff --git a/assets/images/hero/hero-stairs.webp b/assets/images/hero/hero-stairs.webp new file mode 100644 index 0000000..d4e3413 Binary files /dev/null and b/assets/images/hero/hero-stairs.webp differ diff --git a/assets/images/hero/hero-technician.jpg b/assets/images/hero/hero-technician.jpg deleted file mode 100644 index 2dc3f2a..0000000 Binary files a/assets/images/hero/hero-technician.jpg and /dev/null differ diff --git a/assets/images/hero/hero-technician.webp b/assets/images/hero/hero-technician.webp new file mode 100644 index 0000000..5a917ed Binary files /dev/null and b/assets/images/hero/hero-technician.webp differ diff --git a/assets/images/hero/hero-upholstery.jpg b/assets/images/hero/hero-upholstery.jpg new file mode 100644 index 0000000..de9b4a6 Binary files /dev/null and b/assets/images/hero/hero-upholstery.jpg differ diff --git a/assets/images/hero/hero-upholstery.webp b/assets/images/hero/hero-upholstery.webp new file mode 100644 index 0000000..749a36f Binary files /dev/null and b/assets/images/hero/hero-upholstery.webp differ diff --git a/assets/images/hero/hero-vacation-rentals.jpg b/assets/images/hero/hero-vacation-rentals.jpg new file mode 100644 index 0000000..b7b5945 Binary files /dev/null and b/assets/images/hero/hero-vacation-rentals.jpg differ diff --git a/assets/images/hero/hero-vacation-rentals.webp b/assets/images/hero/hero-vacation-rentals.webp new file mode 100644 index 0000000..3735e3e Binary files /dev/null and b/assets/images/hero/hero-vacation-rentals.webp differ diff --git a/assets/images/services/add-ons.jpg b/assets/images/services/add-ons.jpg deleted file mode 100644 index a0c6f5e..0000000 Binary files a/assets/images/services/add-ons.jpg and /dev/null differ diff --git a/assets/images/services/add-ons.webp b/assets/images/services/add-ons.webp new file mode 100644 index 0000000..d4cb2f9 Binary files /dev/null and b/assets/images/services/add-ons.webp differ diff --git a/assets/images/services/area-rug-cleaning.jpg b/assets/images/services/area-rug-cleaning.jpg deleted file mode 100644 index 519a4ef..0000000 Binary files a/assets/images/services/area-rug-cleaning.jpg and /dev/null differ diff --git a/assets/images/services/area-rug-cleaning.webp b/assets/images/services/area-rug-cleaning.webp new file mode 100644 index 0000000..f72d6dc Binary files /dev/null and b/assets/images/services/area-rug-cleaning.webp differ diff --git a/assets/images/services/carpet-cleaning.jpg b/assets/images/services/carpet-cleaning.jpg deleted file mode 100644 index ebbded8..0000000 Binary files a/assets/images/services/carpet-cleaning.jpg and /dev/null differ diff --git a/assets/images/services/carpet-cleaning.webp b/assets/images/services/carpet-cleaning.webp new file mode 100644 index 0000000..0f62e36 Binary files /dev/null and b/assets/images/services/carpet-cleaning.webp differ diff --git a/assets/images/services/commercial-overview.jpg b/assets/images/services/commercial-overview.jpg deleted file mode 100644 index b2a3ad8..0000000 Binary files a/assets/images/services/commercial-overview.jpg and /dev/null differ diff --git a/assets/images/services/commercial-overview.webp b/assets/images/services/commercial-overview.webp new file mode 100644 index 0000000..c70b9b9 Binary files /dev/null and b/assets/images/services/commercial-overview.webp differ diff --git a/assets/images/services/floor-cleaning.jpg b/assets/images/services/floor-cleaning.jpg deleted file mode 100644 index 0861aaf..0000000 Binary files a/assets/images/services/floor-cleaning.jpg and /dev/null differ diff --git a/assets/images/services/floor-cleaning.webp b/assets/images/services/floor-cleaning.webp new file mode 100644 index 0000000..88c93fe Binary files /dev/null and b/assets/images/services/floor-cleaning.webp differ diff --git a/assets/images/services/hotels-inns.jpg b/assets/images/services/hotels-inns.jpg deleted file mode 100644 index 2ebe2db..0000000 Binary files a/assets/images/services/hotels-inns.jpg and /dev/null differ diff --git a/assets/images/services/hotels-inns.webp b/assets/images/services/hotels-inns.webp new file mode 100644 index 0000000..6d9caf5 Binary files /dev/null and b/assets/images/services/hotels-inns.webp differ diff --git a/assets/images/services/office-spaces.jpg b/assets/images/services/office-spaces.jpg deleted file mode 100644 index ff5b6c3..0000000 Binary files a/assets/images/services/office-spaces.jpg and /dev/null differ diff --git a/assets/images/services/office-spaces.webp b/assets/images/services/office-spaces.webp new file mode 100644 index 0000000..4aefec9 Binary files /dev/null and b/assets/images/services/office-spaces.webp differ diff --git a/assets/images/services/property-management.jpg b/assets/images/services/property-management.jpg deleted file mode 100644 index 99c231b..0000000 Binary files a/assets/images/services/property-management.jpg and /dev/null differ diff --git a/assets/images/services/property-management.webp b/assets/images/services/property-management.webp new file mode 100644 index 0000000..f4b173e Binary files /dev/null and b/assets/images/services/property-management.webp differ diff --git a/assets/images/services/retail-showrooms.jpg b/assets/images/services/retail-showrooms.jpg deleted file mode 100644 index c7adfc4..0000000 Binary files a/assets/images/services/retail-showrooms.jpg and /dev/null differ diff --git a/assets/images/services/retail-showrooms.webp b/assets/images/services/retail-showrooms.webp new file mode 100644 index 0000000..06f666d Binary files /dev/null and b/assets/images/services/retail-showrooms.webp differ diff --git a/assets/images/services/stairs-cleaning.jpg b/assets/images/services/stairs-cleaning.jpg deleted file mode 100644 index 410628f..0000000 Binary files a/assets/images/services/stairs-cleaning.jpg and /dev/null differ diff --git a/assets/images/services/stairs-cleaning.webp b/assets/images/services/stairs-cleaning.webp new file mode 100644 index 0000000..bbb0deb Binary files /dev/null and b/assets/images/services/stairs-cleaning.webp differ diff --git a/assets/images/services/upholstery-cleaning.jpg b/assets/images/services/upholstery-cleaning.jpg deleted file mode 100644 index 6b62744..0000000 Binary files a/assets/images/services/upholstery-cleaning.jpg and /dev/null differ diff --git a/assets/images/services/upholstery-cleaning.webp b/assets/images/services/upholstery-cleaning.webp new file mode 100644 index 0000000..c418ad9 Binary files /dev/null and b/assets/images/services/upholstery-cleaning.webp differ diff --git a/assets/images/services/vacation-rentals.jpg b/assets/images/services/vacation-rentals.jpg deleted file mode 100644 index c9966f8..0000000 Binary files a/assets/images/services/vacation-rentals.jpg and /dev/null differ diff --git a/assets/images/services/vacation-rentals.webp b/assets/images/services/vacation-rentals.webp new file mode 100644 index 0000000..afbdc54 Binary files /dev/null and b/assets/images/services/vacation-rentals.webp differ diff --git a/assets/videos/hero/hero-reel-opt.mp4 b/assets/videos/hero/hero-reel-opt.mp4 deleted file mode 100644 index da2c0a6..0000000 Binary files a/assets/videos/hero/hero-reel-opt.mp4 and /dev/null differ diff --git a/assets/videos/hero/hero-reel.mp4 b/assets/videos/hero/hero-reel.mp4 index 8e7b3f5..863cada 100644 Binary files a/assets/videos/hero/hero-reel.mp4 and b/assets/videos/hero/hero-reel.mp4 differ diff --git a/commercial/hotels-inns/index.html b/commercial/hotels-inns/index.html index 3aff894..140cd5e 100644 --- a/commercial/hotels-inns/index.html +++ b/commercial/hotels-inns/index.html @@ -4,7 +4,7 @@ Hotel and Inn Carpet Cleaning | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@
-
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

Bed and breakfasts, small inns, and boutique hotels all receive the same professional extraction service we bring to larger commercial accounts. No property is too small to benefit from clean carpet.

Book Now
-
+
diff --git a/commercial/offices/index.html b/commercial/offices/index.html index 641469d..8734d97 100644 --- a/commercial/offices/index.html +++ b/commercial/offices/index.html @@ -4,7 +4,7 @@ Office Carpet Cleaning Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

We use truck-mounted hot water extraction that pulls deep soil out of office carpet rather than pushing it around. The result lasts longer and dries faster than portable equipment. Your office is ready for the morning crew, not still damp when they arrive.

Book Now
-
+
diff --git a/commercial/property-management/index.html b/commercial/property-management/index.html index b6c1d6c..8edaf38 100644 --- a/commercial/property-management/index.html +++ b/commercial/property-management/index.html @@ -4,7 +4,7 @@ Carpet Cleaning for Property Managers | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

We work with both residential and commercial property managers. From single-family rental homes to multi-unit apartment buildings and commercial office suites, we bring the same professional extraction process and reliable communication to every job in your portfolio.

Book Now
-
+
diff --git a/commercial/retail-showrooms/index.html b/commercial/retail-showrooms/index.html index fff521f..2184c40 100644 --- a/commercial/retail-showrooms/index.html +++ b/commercial/retail-showrooms/index.html @@ -4,7 +4,7 @@ Retail and Showroom Carpet Cleaning | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

We serve businesses from Waterloo to Seneca Falls and throughout the wine country corridor. Our scheduling is flexible enough to work around tasting room hours, gallery events, and seasonal traffic spikes.

Book Now
-
+
diff --git a/commercial/vacation-rentals/index.html b/commercial/vacation-rentals/index.html index e1e2e27..2ff0a83 100644 --- a/commercial/vacation-rentals/index.html +++ b/commercial/vacation-rentals/index.html @@ -4,7 +4,7 @@ Carpet Cleaning for Vacation Rentals | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

We communicate clearly, arrive when scheduled, and send confirmation when the job is done. Set up a recurring program and take carpet cleaning off your mental list entirely.

Book Now
-
+
diff --git a/contact/index.html b/contact/index.html index d949e7a..c9304e4 100644 --- a/contact/index.html +++ b/contact/index.html @@ -4,7 +4,7 @@ Contact | Lahr Carpet Cleaning - + - - - - -
-
-
- Results from the Finger Lakes Region -

Our Work

-

Real cleaning jobs. Real results. See what professional carpet care looks like.

- Book Now -
-
-
- -
-
- -

The Results Speak for Themselves

-

We clean carpets, stairs, upholstery, area rugs, hard floors, and commercial spaces throughout the Finger Lakes region. Every job gets the same equipment and the same standard of care. The types of results below reflect our everyday work for homeowners and businesses in Waterloo, Geneva, Seneca Falls, and surrounding communities.

-
-
- -
-
-
- -

What We Achieve on Every Job

-

From pet-stained carpet to commercial office floors, our equipment reaches what household cleaning cannot.

-
-
-
-
-

Carpet Cleaning

-

We remove deep-seated dirt, allergens, and stains from carpet fibers using hot water extraction. High-traffic areas and heavily soiled rooms get pre-treatment before the main clean.

-
-
-
-

Upholstery Cleaning

-

Sofas, chairs, and mattresses hold more than you expect. Our upholstery cleaning restores color and removes odors without damaging fabric.

-
-
-
-

Stair Cleaning

-

Stairs are the most heavily trafficked surface in any home. We clean every tread and riser with the same thoroughness we bring to open floor areas.

-
-
-
-

Commercial Spaces

-

We work in offices, rental properties, and retail spaces. Commercial cleaning is scheduled around your business hours to minimize disruption.

-
-
-
-
- - - -
-
-

Want Results Like These?

-

Schedule your cleaning today. We serve the entire Finger Lakes region. Free estimates included.

- Book Now -
-
- - - - - - diff --git a/reviews/index.html b/reviews/index.html index 8a26d6d..67ba867 100644 --- a/reviews/index.html +++ b/reviews/index.html @@ -4,7 +4,7 @@ Customer Reviews | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, NY — Finger Lakes Region @@ -70,7 +70,7 @@
- Clean carpet results after professional cleaning + Clean carpet results after professional cleaning

When your carpets and upholstery look genuinely clean, people notice. They ask who you used. That is how Lahr Carpet Cleaning grows in this region.

diff --git a/service-area/index.html b/service-area/index.html index d6fa054..72e0821 100644 --- a/service-area/index.html +++ b/service-area/index.html @@ -4,7 +4,7 @@ Service Area | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@
-
+
Seneca, Ontario, Schuyler & Yates Counties diff --git a/services/add-ons/index.html b/services/add-ons/index.html index 90d27e9..1ff9505 100644 --- a/services/add-ons/index.html +++ b/services/add-ons/index.html @@ -4,7 +4,7 @@ Carpet Cleaning Add-On Services | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@
-
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

These treatments are optional. Not every home needs them. We will tell you honestly at the time of booking whether an add-on makes sense for your situation.

Book Now
-
+
diff --git a/services/area-rugs/index.html b/services/area-rugs/index.html index e390688..d730a44 100644 --- a/services/area-rugs/index.html +++ b/services/area-rugs/index.html @@ -4,7 +4,7 @@ Area Rug Cleaning Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@
-
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

If your rug smells, looks flat, or has visible staining, professional cleaning will make a clear difference. A rug that looks too far gone often surprises its owner after a thorough clean.

Book Now
-
+
diff --git a/services/carpet-cleaning/index.html b/services/carpet-cleaning/index.html index f0025aa..49d2017 100644 --- a/services/carpet-cleaning/index.html +++ b/services/carpet-cleaning/index.html @@ -4,7 +4,7 @@ Residential Carpet Cleaning in Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

Every job follows the same approach: assess the carpet, pre-treat problem areas, extract thoroughly, and leave the space cleaner than we found it. That consistency is what keeps customers coming back.

Book Now
-
+
diff --git a/services/commercial/index.html b/services/commercial/index.html index b3ffc20..a8b113d 100644 --- a/services/commercial/index.html +++ b/services/commercial/index.html @@ -4,7 +4,7 @@ Commercial Carpet Cleaning Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

Every job uses professional hot water extraction equipment. No rental-grade machines, no shortcuts. You get clean carpets the first time, with a before and after walk-through so you know exactly what was done.

Book Now
-
+
diff --git a/services/floors/index.html b/services/floors/index.html index 167f8f1..a93ca36 100644 --- a/services/floors/index.html +++ b/services/floors/index.html @@ -4,7 +4,7 @@ Floor Cleaning Services Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

If your floors look dull or your grout lines have darkened despite regular mopping, professional cleaning will show you the difference. Book the service and see what the floor actually looks like clean.

Book Now
-
+
diff --git a/services/stairs/index.html b/services/stairs/index.html index c4dd887..ce1cdc8 100644 --- a/services/stairs/index.html +++ b/services/stairs/index.html @@ -4,7 +4,7 @@ Stair Carpet Cleaning Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

The process takes longer per square foot than open room cleaning, but the result justifies it. Stairs that looked permanently stained often clean up completely with this approach.

Book Now
-
+
diff --git a/services/upholstery/index.html b/services/upholstery/index.html index 8cac322..82a0a7f 100644 --- a/services/upholstery/index.html +++ b/services/upholstery/index.html @@ -4,7 +4,7 @@ Upholstery Cleaning Waterloo NY | Lahr Carpet Cleaning - + @@ -14,7 +14,7 @@ -
+
Waterloo, Seneca Falls & the Finger Lakes @@ -67,7 +67,7 @@

If your furniture smells, looks dull, or shows visible soil on the armrests and seat cushions, cleaning will make a visible difference. Book the appointment and see the result for yourself.

Book Now
-
+
diff --git a/tools/__pycache__/convert-to-webp.cpython-313.pyc b/tools/__pycache__/convert-to-webp.cpython-313.pyc new file mode 100644 index 0000000..3bdcd84 Binary files /dev/null and b/tools/__pycache__/convert-to-webp.cpython-313.pyc differ diff --git a/tools/convert-to-webp.py b/tools/convert-to-webp.py new file mode 100644 index 0000000..47d210e --- /dev/null +++ b/tools/convert-to-webp.py @@ -0,0 +1,60 @@ +"""Convert all service/hero JPGs to WebP at 60-70KB target, update all HTML refs.""" +import os, glob +from PIL import Image + +BASE = os.path.dirname(os.path.dirname(__file__)) +IMG_DIRS = [ + os.path.join(BASE, "assets", "images", "services"), + os.path.join(BASE, "assets", "images", "hero"), +] + +def convert(jpg_path, max_width=900, quality=78): + # Hero images get larger max_width + if "/hero/" in jpg_path: + max_width = 1400 + quality = 80 + webp_path = jpg_path.rsplit(".", 1)[0] + ".webp" + img = Image.open(jpg_path).convert("RGB") + w, h = img.size + if w > max_width: + img = img.resize((max_width, int(h * max_width / w)), Image.LANCZOS) + img.save(webp_path, "WEBP", quality=quality, method=6) + kb = os.path.getsize(webp_path) // 1024 + orig_kb = os.path.getsize(jpg_path) // 1024 + return webp_path, kb, orig_kb + +converted = [] +for d in IMG_DIRS: + for jpg in glob.glob(os.path.join(d, "*.jpg")): + if any(x in jpg for x in ["gen.log", "regen"]): + continue + webp, kb, orig = convert(jpg) + print(f" {os.path.basename(jpg)} {orig}KB -> {kb}KB") + converted.append((jpg, webp)) + +print(f"\n{len(converted)} images converted") + +# Update all HTML files to reference .webp instead of .jpg (for these image dirs only) +html_files = [] +for root, dirs, files in os.walk(BASE): + dirs[:] = [d for d in dirs if d not in [".git", "tools", "assets/videos"]] + for f in files: + if f.endswith(".html"): + html_files.append(os.path.join(root, f)) + +updated = 0 +for html in html_files: + with open(html, "r") as f: + content = f.read() + new = content + for jpg, webp in converted: + jpg_ref = "/assets/images/" + os.path.relpath(jpg, os.path.join(BASE, "assets", "images")) + webp_ref = "/assets/images/" + os.path.relpath(webp, os.path.join(BASE, "assets", "images")) + new = new.replace(jpg_ref, webp_ref) + if new != content: + with open(html, "w") as f: + f.write(new) + updated += 1 + +print(f"{updated} HTML files updated to .webp refs") +print("Done.")