From 88ed4e6bdaf8fa312549310d8b0a963be37e64b4 Mon Sep 17 00:00:00 2001 From: Concept Agent Date: Wed, 27 May 2026 18:53:35 +0200 Subject: [PATCH] Align with AM stack SOPs: required files, nginx hardening, mobile CSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add robots.txt, sitemap.xml (16 pages), 404.html, 500.html per SOP - nginx: allow robots.txt/sitemap.xml explicitly, fix error_page to 404.html, deny _template.html, remove txt from deny list, fix API proxy comment - Convert residential.png to residential.webp per image SOP - components.css: mobile nav breakpoint 768→1023px, 360px ultra-narrow query, overflow-x:clip, inline grid collapse overrides - blog/index.html: placeholder blog listing page with 3 article cards Co-Authored-By: Claude Sonnet 4.6 --- 404.html | 90 ++++++++++++++++++++ 500.html | 90 ++++++++++++++++++++ assets/css/components.css | 145 ++++++++++++++++++++++++++++++++- assets/images/residential.webp | Bin 0 -> 12022 bytes blog/index.html | 110 +++++++++++++++++++++++++ nginx.conf | 14 +++- robots.txt | 5 ++ sitemap.xml | 99 ++++++++++++++++++++++ 8 files changed, 549 insertions(+), 4 deletions(-) create mode 100644 404.html create mode 100644 500.html create mode 100644 assets/images/residential.webp create mode 100644 blog/index.html create mode 100644 robots.txt create mode 100644 sitemap.xml diff --git a/404.html b/404.html new file mode 100644 index 0000000..fa73fd1 --- /dev/null +++ b/404.html @@ -0,0 +1,90 @@ + + + + + + Page Not Found | Floor It Hardwood Floors + + + + +
+
404
+

Page Not Found

+

The page you're looking for doesn't exist. Let us help you find what you need.

+ + +
+ + diff --git a/500.html b/500.html new file mode 100644 index 0000000..c1653ac --- /dev/null +++ b/500.html @@ -0,0 +1,90 @@ + + + + + + Server Error | Floor It Hardwood Floors + + + + +
+
500
+

Something Went Wrong

+

We're experiencing a temporary issue. Please try again in a moment or contact us directly.

+ + +
+ + diff --git a/assets/css/components.css b/assets/css/components.css index edfe8c2..732ee65 100644 --- a/assets/css/components.css +++ b/assets/css/components.css @@ -1236,11 +1236,15 @@ .contact-layout { grid-template-columns: 1fr; } } -@media (max-width: 768px) { +/* Header: switch to mobile menu earlier — desktop nav with logo + 6 links + + phone + CTA needs ~1024px to fit without overflowing. */ +@media (max-width: 1023px) { .header-nav { display: none; } .header-phone { display: none; } .header-menu-btn { display: flex; } +} +@media (max-width: 768px) { .hero-content { padding-block: var(--space-16); } .process-steps { grid-template-columns: 1fr; } @@ -1264,6 +1268,16 @@ .header-logo-sub { display: none; } } +/* Ultra-narrow phones (iPhone SE portrait, 320px) — tighten header */ +@media (max-width: 360px) { + .header-cta .btn--sm { + padding-inline: 0.75rem; + font-size: 0.75rem; + } + .header-logo img { height: 36px !important; } + .container { padding-inline: 0.875rem; } +} + /* --- Premium Elevation Pass ----------------------------- */ /* Hero: refined layout, larger stat section */ @@ -1651,3 +1665,132 @@ gap: var(--space-4); align-items: flex-start; } + +/* ============================================================ + Mobile responsive overrides — inline grids must collapse + to single column on narrow viewports. Inline styles win over + CSS unless we use !important inside media queries. + ============================================================ */ + +/* Prevent off-screen positioned elements (mobile nav panel, etc.) + from creating horizontal scroll on the document. */ +html, body { + overflow-x: clip; + max-width: 100%; +} + +@media (max-width: 900px) { + /* Any inline 2-col grid pattern → single column */ + [style*="grid-template-columns:1fr 1fr"], + [style*="grid-template-columns: 1fr 1fr"], + [style*="grid-template-columns:repeat(2,1fr)"], + [style*="grid-template-columns: repeat(2,1fr)"], + [style*="grid-template-columns:repeat(2, 1fr)"], + [style*="grid-template-columns: repeat(2, 1fr)"], + [style*="grid-template-columns:5fr 7fr"], + [style*="grid-template-columns: 5fr 7fr"] { + grid-template-columns: 1fr !important; + gap: 2rem !important; + } + + /* Services 2x2 grid → single column */ + .services-grid-2x2 { + grid-template-columns: 1fr !important; + } + + /* Auto grids should stack tighter */ + .grid--auto-3, + .grid--auto-4 { + grid-template-columns: 1fr !important; + gap: 1.5rem !important; + } + + /* Order overrides — when 2-col uses order:1/2 to flip image/content, + reset on mobile so content always reads top-to-bottom */ + [style*="order:1"], + [style*="order: 1"] { + order: 0 !important; + } + [style*="order:2"], + [style*="order: 2"] { + order: 0 !important; + } + + /* Form rows stack */ + .form-grid--2 { + grid-template-columns: 1fr !important; + } + + /* Hero sub-stats stack with proper spacing */ + .hero-trust { + flex-direction: column !important; + gap: 1.5rem !important; + align-items: flex-start !important; + } + + /* Page hero padding tighten */ + .page-hero { + padding-block: 4rem 3rem; + } + + /* Section padding tighten */ + .section { + padding-block: 3.5rem; + } + + /* CTA strip vertical layout */ + .cta-group { + flex-direction: column !important; + align-items: stretch !important; + } + .cta-group .btn { + width: 100%; + } + + /* Form/contact layout — prevent intrinsic input width from blowing out + the grid track. Without min-width:0, defaults push + the parent column wider than the viewport, causing horizontal scroll. */ + .contact-layout { min-width: 0; } + .contact-form-wrap, + .contact-info-list { min-width: 0; max-width: 100%; } + .form-grid, + .form-grid--2 { min-width: 0; } + .form-field { min-width: 0; } + .form-field input, + .form-field textarea, + .form-field select { + min-width: 0; + max-width: 100%; + box-sizing: border-box; + } +} + +@media (max-width: 600px) { + /* Tighten inline grid gaps further on phones */ + [style*="grid-template-columns:1fr 1fr"], + [style*="grid-template-columns:repeat(2,1fr)"], + [style*="grid-template-columns: 1fr 1fr"], + [style*="grid-template-columns: repeat(2,1fr)"] { + gap: 1.5rem !important; + } + + /* Auto-3 grid items single column */ + .grid--auto-3 { gap: 1rem !important; } + + /* Container side padding tighter */ + .container { + padding-inline: 1rem; + } + + /* Reduce all heading sizes a touch */ + h1 { font-size: clamp(1.875rem, 8vw, 2.5rem) !important; } + h2 { font-size: clamp(1.5rem, 6vw, 2rem) !important; } + + /* Page hero text tighter */ + .page-hero h1 { + font-size: clamp(1.875rem, 7vw, 2.25rem) !important; + } + .lead { + font-size: 1rem; + } +} diff --git a/assets/images/residential.webp b/assets/images/residential.webp new file mode 100644 index 0000000000000000000000000000000000000000..c01ebcfe6c0683860b5d388b1249b698d194943b GIT binary patch literal 12022 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 + + + + + + Hardwood Floor Tips & Guides | Floor It Blog + + + + + + + + + + + + + +
+ +
+
+ + From the Floor It Team +

Hardwood Floor Tips & Guides

+

Practical advice and expert tips for Buffalo, NY homeowners. Learn how to maintain, protect, and care for your hardwood floors with guidance from the Western New York refinishing specialists.

+
+
+ + +
+
+
+ Latest Articles +

Hardwood Floor Care Resources

+
+ +
+ +
+
+

How to Tell If Your Floors Need Refinishing

+

Learn the warning signs that indicate your hardwood floors are ready for a professional refinish. From visible scratches to dull finishes, we explain what to look for and when to act.

+
+
+ Read More +
+
+ +
+
+

Hardwood vs. Engineered: Which Is Right for Your Home?

+

Considering a new floor installation or replacement? Discover the pros and cons of solid hardwood and engineered hardwood to make the best choice for your Buffalo home.

+
+
+ Read More +
+
+ +
+
+

What to Expect During a Floor Refinishing Project

+

Wondering what happens during a professional floor refinishing? Get a detailed walkthrough of the timeline, process, and what to expect from start to finish.

+
+
+ Read More +
+
+ +
+
+
+ +
+
+

Ready to Transform Your Floors?

+

Request a free estimate and let Floor It help restore your hardwood floors to their original beauty.

+ +
+
+ +
+ + + + + + + diff --git a/nginx.conf b/nginx.conf index 607a78e..1d393a8 100644 --- a/nginx.conf +++ b/nginx.conf @@ -9,7 +9,7 @@ server { deny all; return 404; } - location ~* \.(env|env\.example|conf|yml|yaml|py|pyc|md|txt|sh|sql|log|bak|old|swp|dockerfile)$ { + location ~* \.(env|env\.example|conf|yml|yaml|py|pyc|md|sh|sql|log|bak|old|swp|dockerfile)$ { deny all; return 404; } @@ -18,7 +18,15 @@ server { return 404; } - # API proxy — strip /api/ prefix, forward to Node.js service + location ~* /_template\.html$ { + deny all; + return 404; + } + + location = /robots.txt { access_log off; } + location = /sitemap.xml { access_log off; } + + # API proxy — strip /api/ prefix, forward to Python API service location /api/ { proxy_pass http://api:3001/; proxy_http_version 1.1; @@ -51,5 +59,5 @@ server { gzip_types text/html text/css application/javascript image/svg+xml; gzip_min_length 1024; - error_page 404 /index.html; + error_page 404 /404.html; } diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..9f96b21 --- /dev/null +++ b/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Allow: / +Disallow: /api/ + +Sitemap: https://floorithardwoodfloors.com/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..7600db6 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,99 @@ + + + + https://floorithardwoodfloors.com/ + 2026-05-27 + weekly + 1.0 + + + https://floorithardwoodfloors.com/about/ + 2026-05-27 + monthly + 0.8 + + + https://floorithardwoodfloors.com/contact/ + 2026-05-27 + monthly + 0.9 + + + https://floorithardwoodfloors.com/reviews/ + 2026-05-27 + weekly + 0.8 + + + https://floorithardwoodfloors.com/services/ + 2026-05-27 + monthly + 0.9 + + + https://floorithardwoodfloors.com/services/floor-refinishing.html + 2026-05-27 + monthly + 0.85 + + + https://floorithardwoodfloors.com/services/floor-installation.html + 2026-05-27 + monthly + 0.85 + + + https://floorithardwoodfloors.com/services/floor-restoration.html + 2026-05-27 + monthly + 0.85 + + + https://floorithardwoodfloors.com/services/floor-sanding.html + 2026-05-27 + monthly + 0.85 + + + https://floorithardwoodfloors.com/locations/ + 2026-05-27 + monthly + 0.8 + + + https://floorithardwoodfloors.com/locations/buffalo.html + 2026-05-27 + monthly + 0.85 + + + https://floorithardwoodfloors.com/locations/amherst.html + 2026-05-27 + monthly + 0.8 + + + https://floorithardwoodfloors.com/locations/williamsville.html + 2026-05-27 + monthly + 0.8 + + + https://floorithardwoodfloors.com/locations/east-amherst.html + 2026-05-27 + monthly + 0.8 + + + https://floorithardwoodfloors.com/locations/clarence.html + 2026-05-27 + monthly + 0.8 + + + https://floorithardwoodfloors.com/locations/lancaster.html + 2026-05-27 + monthly + 0.8 + +