diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..50242bb
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,7 @@
+.git
+.next
+node_modules
+npm-debug.log
+Dockerfile
+docker-compose.yml
+README.md
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b4069b2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+.next
+node_modules
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+.env
+.env.local
+.env.production
+dist
+coverage
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..7d24247
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,29 @@
+FROM node:22-alpine AS base
+WORKDIR /app
+
+FROM base AS deps
+COPY package.json package-lock.json* ./
+RUN npm install
+
+FROM base AS dev
+ENV NODE_ENV=development
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+EXPOSE 3000
+CMD ["npm", "run", "dev", "--", "--hostname", "0.0.0.0"]
+
+FROM base AS builder
+ENV NODE_ENV=production
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+RUN npm run build
+
+FROM node:22-alpine AS runner
+WORKDIR /app
+ENV NODE_ENV=production
+ENV PORT=3000
+COPY --from=builder /app/public ./public
+COPY --from=builder /app/.next/standalone ./
+COPY --from=builder /app/.next/static ./.next/static
+EXPOSE 3000
+CMD ["node", "server.js"]
diff --git a/app/about/page.tsx b/app/about/page.tsx
new file mode 100644
index 0000000..617600e
--- /dev/null
+++ b/app/about/page.tsx
@@ -0,0 +1,196 @@
+import Image from "next/image";
+import Link from "next/link";
+import { Breadcrumbs } from "@/components/breadcrumbs";
+import { JsonLd } from "@/components/json-ld";
+import { aboutHighlights, buildStory, siteConfig } from "@/data/site-content";
+import { breadcrumbSchema, buildPageMetadata } from "@/lib/seo";
+import { MotionSection } from "@/components/motion-section";
+import { FadeUp, FadeIn, SlideIn } from "@/components/page-hero-motion";
+
+export const metadata = buildPageMetadata({
+ title: "About Southern Masonry Supply",
+ description:
+ "Learn how Southern Masonry Supply has served Corpus Christi with masonry and landscaping materials since 1990.",
+ path: "/about",
+});
+
+export default function AboutPage() {
+ const breadcrumbs = [
+ { name: "Home", path: "/" },
+ { name: "About", path: "/about" },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ Family owned and operated
+
+
+
+ Serving Corpus Christi projects with material knowledge that lasts.
+
+
+
+
+ Southern Masonry Supply has spent more than 34 years helping
+ contractors, homeowners, architects, and designers source the
+ right masonry and landscaping materials for projects large and
+ small.
+
+
+
+
+ Since 1990 in South Texas
+ Family-owned: Sid Smith Jr.
+ Project-grounded recommendations
+
+
+
+
+
+
+
+ Built for long-horizon projects
+
+
+
+
+
+
+
+
+ {buildStory.map((section, idx) => (
+
+
+ {section.eyebrow}
+ {section.title}
+ {section.copy}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Southern Standard
+
Why builders trust our yard
+
+
+
+ {aboutHighlights.map((item, idx) => (
+
+
+
+ {item.icon}
+
+ {item.title}
+ {item.description}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+ Service that stays practical
+
+ Our mission is simple: make good material easier to source.
+
+
+ Founded in 1990 and led by Sid Smith Jr., Southern Masonry Supply
+ stays focused on responsive service, reliable stock levels, and
+ materials worth putting into long-term work. Sid's hands-on
+ expertise in both masonry and landscaping ensures the yard remains
+ the southern standard for quality and practical guidance.
+
+
+ Whether you are ordering flagstone by the ton, pebbles by the
+ bag, or masonry cement for a new project phase, our team keeps the
+ conversation grounded in application, quantity, and timing.
+
+
+
+ View masonry supplies
+
+
+ View landscaping supplies
+
+
+
+
+
+
+
+
+
+
+
Visit or call
+
{siteConfig.address.street}
+
+ Stop by the yard during business hours or call{" "}
+ {siteConfig.phoneDisplay} for material availability and delivery
+ planning.
+
+
+
+ Contact us
+
+
+
+
+ >
+ );
+}
diff --git a/app/api/contact/route.ts b/app/api/contact/route.ts
new file mode 100644
index 0000000..0bcb753
--- /dev/null
+++ b/app/api/contact/route.ts
@@ -0,0 +1,65 @@
+import { NextResponse } from "next/server";
+
+type ContactPayload = {
+ name?: string;
+ phone?: string;
+ email?: string;
+ projectType?: string;
+ materialInterest?: string;
+ message?: string;
+};
+
+function isValidEmail(value: string) {
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
+}
+
+function isValidPhone(value: string) {
+ return /^[0-9()+.\-\s]{10,}$/.test(value);
+}
+
+export async function POST(request: Request) {
+ const payload = (await request.json()) as ContactPayload;
+ const fieldErrors: Record = {};
+
+ const name = payload.name?.trim() ?? "";
+ const phone = payload.phone?.trim() ?? "";
+ const email = payload.email?.trim() ?? "";
+ const message = payload.message?.trim() ?? "";
+
+ if (!name) {
+ fieldErrors.name = "Please enter your full name.";
+ }
+
+ if (!phone) {
+ fieldErrors.phone = "Please enter a phone number.";
+ } else if (!isValidPhone(phone)) {
+ fieldErrors.phone = "Please enter a valid phone number.";
+ }
+
+ if (!email) {
+ fieldErrors.email = "Please enter an email address.";
+ } else if (!isValidEmail(email)) {
+ fieldErrors.email = "Please enter a valid email address.";
+ }
+
+ if (!message) {
+ fieldErrors.message = "Please describe your project or material request.";
+ }
+
+ if (Object.keys(fieldErrors).length > 0) {
+ return NextResponse.json(
+ {
+ success: false,
+ message: "Please correct the highlighted fields and try again.",
+ fieldErrors,
+ },
+ { status: 400 },
+ );
+ }
+
+ return NextResponse.json({
+ success: true,
+ message:
+ "Thanks for reaching out. This form is wired to a placeholder API route and ready for email delivery integration.",
+ });
+}
diff --git a/app/contact/page.tsx b/app/contact/page.tsx
new file mode 100644
index 0000000..a73c55e
--- /dev/null
+++ b/app/contact/page.tsx
@@ -0,0 +1,155 @@
+import Image from "next/image";
+import Link from "next/link";
+import { Suspense } from "react";
+import { Breadcrumbs } from "@/components/breadcrumbs";
+import { ContactForm } from "@/components/contact-form";
+import { JsonLd } from "@/components/json-ld";
+import { deliveryHighlights, siteConfig } from "@/data/site-content";
+import {
+ breadcrumbSchema,
+ buildPageMetadata,
+} from "@/lib/seo";
+import { FadeUp, FadeIn } from "@/components/page-hero-motion";
+import { MotionSection } from "@/components/motion-section";
+
+export const metadata = buildPageMetadata({
+ title: "Contact Southern Masonry Supply in Corpus Christi, TX",
+ description:
+ "Reach Southern Masonry Supply at 5205 Agnes St, Corpus Christi, TX 78405 or call (361) 289-1074 during business hours.",
+ path: "/contact",
+ image: "/images/delivery_truck_logistics_png_1773134721043.png",
+});
+
+export default function ContactPage() {
+ const breadcrumbs = [
+ { name: "Home", path: "/" },
+ { name: "Contact", path: "/contact" },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ Contact and delivery
+
+
+
+ Reach the yard, request a quote, or line up a delivery.
+
+
+
+
+ Share the material, quantity, and timing you need. We will get
+ back with the right next step.
+
+
+
+
+ Quotes during business hours
+ Delivery thresholds made clear upfront
+ Material-first project guidance
+
+
+
+
+
+
+
+ Call first for stock and routing
+
+
+
+
+
+
+
+
+
+ Send us a message
+
Tell us about your project.
+
+
Loading contact form...}>
+
+
+
+
+
+
+
+
+
+
+ Open in Google Maps
+
+
+
+
+
+ Visit the yard
+ {siteConfig.address.street}
+ {siteConfig.address.cityStateZip}
+
+ {siteConfig.phoneDisplay}
+
+
+
+
+ Hours
+
+ {siteConfig.hours.map((item) => (
+
+ {item.label}
+ {item.value}
+
+ ))}
+
+
+
+
+ Delivery notes
+
+ {deliveryHighlights.map((item) => (
+
+ {item.title}
+ {item.description}
+
+ ))}
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..03053ec
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,3149 @@
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Outfit:wght@400;500;600;700;800&family=Nunito:wght@700;800;900&family=Comfortaa:wght@700&display=swap');
+
+:root {
+ /* Color Palette - PlumbFlow Inspired */
+ --primary: #f47f20;
+ --primary-rgb: 244, 127, 32;
+ --primary-dark: #d66c18;
+ --secondary: #0d1b2a;
+ --secondary-rgb: 13, 27, 42;
+ --secondary-light: #1b263b;
+ --secondary-dark: #07101a;
+
+ --accent: #e0e1dd;
+ --white: #ffffff;
+ --black: #000000;
+
+ --text-main: #1d2a33;
+ --text-muted: #4a5a66;
+ --text-on-dark: #ffffff;
+
+ --bg-main: #ffffff;
+ --bg-soft: #f8f9fa;
+ --bg-offset: #f1f3f5;
+
+ --border: #e2e8f0;
+ --radius: 8px;
+ --radius-lg: 12px;
+ --primary-soft: rgba(244, 127, 32, 0.1);
+ --bg-contrast: var(--secondary);
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
+
+ --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+* {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+}
+
+html,
+body {
+ max-width: 100vw;
+ overflow-x: clip;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
+ color: var(--text-main);
+ background: var(--bg-main);
+ line-height: 1.6;
+ -webkit-font-smoothing: antialiased;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: 'Outfit', 'Inter', sans-serif;
+ font-weight: 700;
+ line-height: 1.2;
+ color: var(--secondary);
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+ transition: var(--transition);
+}
+
+ul {
+ list-style: none;
+}
+
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+}
+
+.cover-image {
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+}
+
+.breadcrumbs {
+ display: flex;
+ gap: 0.75rem;
+ list-style: none;
+ font-size: 0.75rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ margin-bottom: 2rem;
+ opacity: 0.6;
+}
+
+.breadcrumbs li::after {
+ content: "—";
+ margin-left: 0.75rem;
+ color: var(--primary);
+}
+
+.breadcrumbs li:last-child::after {
+ content: none;
+}
+
+.breadcrumbs a:hover {
+ color: var(--primary);
+}
+
+.container {
+ width: 100%;
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+.section {
+ padding: 5rem 0;
+}
+
+.section-tight {
+ padding: 3rem 0;
+}
+
+.section-soft {
+ background: var(--bg-soft);
+}
+
+.section-contrast {
+ background: var(--secondary);
+ color: var(--white);
+}
+
+.eyebrow {
+ display: inline-block;
+ font-size: 0.875rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ color: var(--primary);
+ margin-bottom: 1rem;
+}
+
+/* Typography Scale */
+h1 {
+ font-size: clamp(2.5rem, 5vw, 4rem);
+}
+
+h2 {
+ font-size: clamp(2rem, 4vw, 2.75rem);
+}
+
+h3 {
+ font-size: clamp(1.5rem, 3vw, 1.75rem);
+}
+
+p {
+ color: var(--text-muted);
+ margin-bottom: 1.25rem;
+}
+
+/* Buttons */
+.button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0.875rem 2.25rem;
+ font-weight: 700;
+ border-radius: var(--radius);
+ transition: var(--transition);
+ cursor: pointer;
+ border: none;
+ gap: 0.5rem;
+ font-size: 1rem;
+}
+
+.button-primary {
+ background: var(--primary);
+ color: var(--white);
+}
+
+.button-primary:hover {
+ background: var(--primary-dark);
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-lg);
+}
+
+.button-secondary {
+ background: var(--secondary);
+ color: var(--white);
+}
+
+.button-secondary:hover {
+ background: var(--secondary-light);
+ transform: translateY(-2px);
+}
+
+.button-outline {
+ background: transparent;
+ border: 2px solid var(--primary);
+ color: var(--primary);
+}
+
+.button-outline:hover {
+ background: var(--primary);
+ color: var(--white);
+}
+
+/* Site Layout Components */
+.site-shell {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+}
+
+main {
+ flex: 1;
+}
+
+/* Utility Bar */
+.site-utility-bar {
+ background: var(--secondary-dark);
+ color: var(--white);
+ padding: 0.625rem 0;
+ font-size: 0.8125rem;
+ font-weight: 500;
+}
+
+.utility-inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.utility-list {
+ display: flex;
+ gap: 2rem;
+ align-items: center;
+}
+
+.utility-link {
+ color: var(--accent);
+}
+
+.utility-link:hover {
+ color: var(--primary);
+}
+
+/* Header */
+.site-header {
+ background: var(--white);
+ padding: 1.25rem 0;
+ position: sticky;
+ top: 0;
+ z-index: 100;
+ border-bottom: 1px solid var(--border);
+ box-shadow: var(--shadow-sm);
+ transition: background 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
+}
+
+.site-header--scrolled {
+ background: rgba(255, 255, 255, 0.72);
+ backdrop-filter: blur(14px);
+ -webkit-backdrop-filter: blur(14px);
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+ border-bottom-color: rgba(226, 232, 240, 0.5);
+}
+
+.site-header-inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 1.5rem;
+}
+
+.brand {
+ display: inline-flex;
+ align-items: center;
+ flex: 0 0 auto;
+ line-height: 0;
+}
+
+.brand-mark {
+ width: auto;
+ height: auto;
+ background: var(--primary);
+ color: var(--white);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 900;
+ font-size: 1.25rem;
+ border-radius: 6px;
+ clip-path: polygon(10% 0, 100% 0, 90% 100%, 0% 100%);
+}
+
+.brand-mark-logo {
+ background: transparent;
+ clip-path: none;
+ border-radius: 0;
+ overflow: visible;
+ width: clamp(220px, 24vw, 360px);
+}
+
+.brand-logo {
+ display: block;
+ width: 100%;
+ height: auto;
+}
+
+.brand-logo--header {
+ filter: drop-shadow(0 12px 28px rgba(13, 27, 42, 0.08));
+}
+
+.site-footer .brand-mark-logo {
+ width: clamp(240px, 20vw, 320px);
+}
+
+/* ── Brand Logo Text Component ─────────────────────── */
+.brand-logo-text {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 5px;
+ width: 100%;
+ line-height: 1;
+}
+
+.blt-name {
+ font-family: 'Comfortaa', 'Nunito', sans-serif;
+ font-weight: 700;
+ color: #1a8c8c;
+ font-size: clamp(1.05rem, 2.3vw, 1.65rem);
+ line-height: 1;
+ white-space: nowrap;
+ letter-spacing: 0px;
+}
+
+.blt-tagline {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ width: 100%;
+}
+
+.blt-line {
+ flex: 1;
+ height: 1.5px;
+ background: #90d0d0;
+ border-radius: 2px;
+ min-width: 20px;
+}
+
+.blt-city {
+ font-family: 'Outfit', sans-serif;
+ font-weight: 800;
+ font-size: clamp(0.5rem, 1.05vw, 0.7rem);
+ color: #f47f20;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ white-space: nowrap;
+}
+
+/* override line-height:0 from .brand when using text logo */
+.brand-mark-logo:has(.brand-logo-text) {
+ line-height: 1;
+}
+
+.site-footer .brand-logo-text .blt-name {
+ font-size: clamp(1.1rem, 2vw, 1.55rem);
+}
+
+.main-nav {
+ display: flex;
+ gap: 2.25rem;
+}
+
+.nav-link {
+ font-weight: 600;
+ color: var(--secondary);
+ position: relative;
+}
+
+.nav-link:hover {
+ color: var(--primary);
+}
+
+.nav-link::after {
+ content: '';
+ position: absolute;
+ bottom: -4px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background: var(--primary);
+ transition: var(--transition);
+}
+
+.nav-link:hover::after {
+ width: 100%;
+}
+
+/* Featured Products Section */
+.featured-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+ margin-bottom: 4rem;
+}
+
+.featured-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 1.5rem;
+}
+
+/* Mobile Menu Toggle */
+.mobile-menu-toggle {
+ display: none;
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 0.5rem;
+ line-height: 0;
+ color: var(--secondary);
+}
+
+.hamburger {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ width: 24px;
+}
+
+.hamburger span {
+ display: block;
+ height: 2px;
+ width: 100%;
+ background: currentColor;
+ border-radius: 2px;
+ transition: transform 0.3s ease, opacity 0.3s ease;
+ transform-origin: center;
+}
+
+.hamburger--open span:nth-child(1) {
+ transform: translateY(7px) rotate(45deg);
+}
+
+.hamburger--open span:nth-child(2) {
+ opacity: 0;
+ transform: scaleX(0);
+}
+
+.hamburger--open span:nth-child(3) {
+ transform: translateY(-7px) rotate(-45deg);
+}
+
+/* Mobile Nav Drawer */
+.mobile-nav {
+ display: none;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ width: min(320px, 85vw);
+ background: var(--white);
+ z-index: 200;
+ padding: 5rem 1.75rem 2rem;
+ box-shadow: var(--shadow-2xl);
+ transform: translateX(100%);
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ overflow-y: auto;
+}
+
+.mobile-nav--open {
+ transform: translateX(0);
+}
+
+.mobile-nav-overlay {
+ display: none;
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.45);
+ z-index: 150;
+ backdrop-filter: blur(2px);
+}
+
+.mobile-nav-links {
+ display: flex;
+ flex-direction: column;
+}
+
+.mobile-nav-link {
+ font-size: 1.0625rem;
+ font-weight: 600;
+ color: var(--secondary);
+ padding: 1rem 0;
+ border-bottom: 1px solid var(--border);
+ display: block;
+ transition: color 0.2s ease;
+}
+
+.mobile-nav-link:hover {
+ color: var(--primary);
+}
+
+.mobile-nav-cta {
+ margin-top: 1.75rem;
+ text-align: center;
+ display: block;
+}
+
+/* --- Catalog Layout --- */
+.catalog-shell {
+ display: grid;
+ grid-template-columns: 280px 1fr;
+ gap: 3rem;
+ align-items: start;
+}
+
+.catalog-section {
+ scroll-margin-top: 7rem;
+}
+
+.catalog-sidebar {
+ position: sticky;
+ top: 100px;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ align-self: start;
+ background: var(--white);
+ padding: 2rem;
+ border-radius: 12px;
+ border: 1px solid var(--border);
+ box-shadow: var(--shadow);
+}
+
+.filter-group {
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.filter-label {
+ display: block;
+ font-size: 0.9rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ color: var(--text-muted);
+}
+
+.filter-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+}
+
+.filter-chip {
+ padding: 0.5rem 1rem;
+ border: 1px solid var(--border);
+ border-radius: 20px;
+ background: transparent;
+ font-size: 0.85rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.filter-chip:hover {
+ border-color: var(--primary);
+ color: var(--primary);
+}
+
+.filter-chip.active {
+ background: var(--primary);
+ border-color: var(--primary);
+ color: white;
+ box-shadow: var(--shadow-sm);
+}
+
+.filter-group legend {
+ font-size: 0.75rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ color: var(--text-muted);
+ margin-bottom: 1rem;
+}
+
+.filter-option {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ cursor: pointer;
+ font-size: 0.9375rem;
+ transition: color 0.2s ease;
+}
+
+.filter-option:hover {
+ color: var(--primary);
+}
+
+.filter-option input {
+ width: 1.25rem;
+ height: 1.25rem;
+ accent-color: var(--primary);
+}
+
+.catalog-hero {
+ background: var(--bg-contrast);
+ color: white;
+ border-radius: 12px;
+ overflow: hidden;
+ margin-bottom: 3rem;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+}
+
+.catalog-hero-content {
+ padding: 3rem;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.catalog-hero-content h2 {
+ color: white;
+}
+
+.catalog-hero-media {
+ position: relative;
+ min-height: 300px;
+}
+
+.catalog-toolbar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2rem;
+ padding-bottom: 1.5rem;
+ border-bottom: 1px solid var(--border);
+}
+
+.catalog-count {
+ font-size: 0.875rem;
+ font-weight: 600;
+ color: var(--text-muted);
+}
+
+.selected-filters {
+ display: flex;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+}
+
+.selected-chip {
+ background: var(--primary-soft);
+ color: var(--primary);
+ padding: 0.25rem 0.75rem;
+ border-radius: 100px;
+ font-size: 0.75rem;
+ font-weight: 700;
+}
+
+@media (max-width: 1024px) {
+ .catalog-shell {
+ grid-template-columns: 1fr;
+ gap: 2rem;
+ }
+
+ .catalog-sidebar {
+ position: static;
+ top: auto;
+ gap: 1.5rem;
+ padding: 1.5rem;
+ box-shadow: none;
+ }
+
+ .catalog-hero {
+ grid-template-columns: 1fr;
+ }
+
+ .material-card--catalog.reveal,
+ .material-card--catalog.reveal.active {
+ opacity: 1;
+ transform: none;
+ transition: none;
+ }
+}
+
+@media (max-width: 768px) {
+ .catalog-toolbar {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1rem;
+ }
+
+ .material-grid {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+}
+
+/* --- Contact Layout --- */
+.contact-layout {
+ display: grid;
+ grid-template-columns: 1fr 400px;
+ gap: 4rem;
+}
+
+.contact-card {
+ background: white;
+ padding: 3rem;
+ border-radius: 12px;
+ border: 1px solid var(--border);
+ box-shadow: var(--shadow-xl);
+}
+
+.card-heading {
+ margin-bottom: 3rem;
+}
+
+.contact-sidebar {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+}
+
+.map-card {
+ background: var(--bg-contrast);
+ color: white;
+ padding: 2.5rem;
+ border-radius: 12px;
+ text-align: center;
+}
+
+.map-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1.5rem;
+}
+
+.map-pin {
+ width: 60px;
+ height: 60px;
+ background: var(--primary);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 800;
+ font-size: 1.25rem;
+ box-shadow: 0 0 0 10px rgba(244, 127, 32, 0.2);
+}
+
+.details-grid {
+ display: grid;
+ gap: 1.5rem;
+}
+
+.detail-card {
+ padding: 1.5rem;
+ background: white;
+ border: 1px solid var(--border);
+ border-radius: 12px;
+}
+
+.detail-list {
+ list-style: none;
+ padding: 0;
+ margin: 1rem 0 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.detail-list li {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.9375rem;
+}
+
+.detail-list.stacked li {
+ flex-direction: column;
+ gap: 0.25rem;
+}
+
+/* --- Forms --- */
+.form-grid {
+ display: grid;
+ gap: 2rem;
+}
+
+.form-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 2rem;
+}
+
+.field {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.field label {
+ font-size: 0.875rem;
+ font-weight: 700;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.field input,
+.field select,
+.field textarea {
+ padding: 1rem;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ font-family: inherit;
+ font-size: 1rem;
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+}
+
+.field input:focus,
+.field select:focus,
+.field textarea:focus {
+ outline: none;
+ border-color: var(--primary);
+ box-shadow: 0 0 0 4px var(--primary-soft);
+}
+
+.field textarea {
+ min-height: 150px;
+ resize: vertical;
+}
+
+.field-error {
+ font-size: 0.75rem;
+ color: #dc3545;
+ font-weight: 600;
+}
+
+.form-status {
+ padding: 1rem;
+ border-radius: 8px;
+ font-size: 0.9375rem;
+ font-weight: 600;
+}
+
+.form-status.success {
+ background: #d4edda;
+ color: #155724;
+}
+
+.form-status.error {
+ background: #f8d7da;
+ color: #721c24;
+}
+
+@media (max-width: 1024px) {
+ .contact-layout {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 600px) {
+ .form-row {
+ grid-template-columns: 1fr;
+ }
+
+ .contact-card {
+ padding: 1.5rem;
+ }
+}
+
+/* --- Page Heroes --- */
+.page-hero {
+ padding: 6rem 0 5rem;
+ background-color: var(--bg-contrast);
+ color: white;
+ position: relative;
+ overflow: hidden;
+}
+
+.page-hero h1,
+.page-hero h2,
+.page-hero h3 {
+ color: white;
+}
+
+.page-hero p,
+.page-hero .hero-copy {
+ color: rgba(255, 255, 255, 0.82);
+}
+
+.page-hero .breadcrumbs {
+ color: rgba(255, 255, 255, 0.55);
+}
+
+.page-hero .breadcrumbs a {
+ color: rgba(255, 255, 255, 0.55);
+}
+
+.page-hero .breadcrumbs a:hover {
+ color: var(--primary);
+}
+
+.page-hero .page-hero-meta span {
+ color: rgba(255, 255, 255, 0.7);
+}
+
+.breadcrumb-strip {
+ background: var(--bg-soft);
+ border-bottom: 1px solid var(--border);
+ padding: 0.65rem 0;
+}
+
+.breadcrumb-strip .breadcrumbs {
+ margin-bottom: 0;
+ opacity: 1;
+ color: var(--text-muted);
+}
+
+.breadcrumb-strip .breadcrumbs a {
+ color: var(--text-muted);
+}
+
+.breadcrumb-strip .breadcrumbs a:hover {
+ color: var(--primary);
+}
+
+.page-hero::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(circle at 70% 30%, rgba(244, 127, 32, 0.15) 0%, transparent 70%);
+ pointer-events: none;
+}
+
+.page-hero-shell {
+ display: grid;
+ grid-template-columns: 1.2fr 0.8fr;
+ gap: 4rem;
+ align-items: center;
+}
+
+.page-hero-copy h1 {
+ font-size: clamp(2.5rem, 4vw, 3.5rem);
+ line-height: 1.1;
+ margin-bottom: 1.5rem;
+}
+
+.hero-copy {
+ font-size: 1.25rem;
+ opacity: 0.9;
+ max-width: 600px;
+ margin-bottom: 2rem;
+}
+
+.page-hero-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1.5rem;
+ font-size: 0.875rem;
+}
+
+.page-hero-meta span {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ opacity: 0.8;
+}
+
+.page-hero-meta span::before {
+ content: "→";
+ color: var(--primary);
+}
+
+.page-hero-visual {
+ position: relative;
+ height: 450px;
+ border-radius: 12px;
+ overflow: hidden;
+ box-shadow: var(--shadow-2xl);
+}
+
+.hero-visual-note {
+ position: absolute;
+ bottom: 1.5rem;
+ left: 1.5rem;
+ background: var(--primary);
+ color: white;
+ padding: 0.5rem 1rem;
+ font-size: 0.75rem;
+ font-weight: 800;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ border-radius: 4px;
+ z-index: 5;
+ box-shadow: var(--shadow-lg);
+}
+
+@media (max-width: 1024px) {
+ .page-hero-shell {
+ grid-template-columns: 1fr;
+ text-align: center;
+ gap: 3rem;
+ }
+
+ .page-hero-visual {
+ height: 400px;
+ }
+}
+
+/* --- Material Catalog --- */
+.catalog-intro {
+ margin-bottom: 4rem;
+ max-width: 800px;
+}
+
+.material-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 2.5rem;
+}
+
+.material-card {
+ background: white;
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ overflow: hidden;
+ transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
+}
+
+.material-card-media {
+ position: relative;
+ height: 240px;
+ background: #f8f9fa;
+ overflow: hidden;
+}
+
+.material-card-media img {
+ transition: transform 0.6s ease;
+}
+
+.material-card--catalog {
+ will-change: transform;
+}
+
+.material-card-content {
+ padding: 2rem;
+}
+
+.material-card-tag {
+ display: inline-block;
+ font-size: 0.75rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--primary);
+ margin-bottom: 0.75rem;
+}
+
+.material-card h3 {
+ font-size: 1.25rem;
+ margin-bottom: 1rem;
+}
+
+.material-card-meta {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-top: 1.5rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid var(--border);
+ font-size: 0.875rem;
+ font-weight: 600;
+}
+
+@media (hover: hover) and (pointer: fine) {
+ .material-card:hover {
+ transform: translateY(-8px);
+ box-shadow: var(--shadow-xl);
+ border-color: var(--primary-soft);
+ }
+
+ .material-card:hover .material-card-media img {
+ transform: scale(1.05);
+ }
+}
+
+/* --- Site Footer --- */
+.site-footer {
+ background-color: var(--bg-contrast);
+ color: white;
+ padding: 4rem 0 3rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.07);
+}
+
+.site-footer-top {
+ display: grid;
+ grid-template-columns: 1.5fr repeat(3, 1fr);
+ gap: 4rem;
+ margin-bottom: 4rem;
+}
+
+.footer-brand {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+.footer-description {
+ color: rgba(255, 255, 255, 0.72);
+ font-size: 0.9375rem;
+ line-height: 1.65;
+ max-width: 360px;
+}
+
+.footer-contact-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.footer-contact-item {
+ font-size: 0.875rem;
+ color: rgba(255, 255, 255, 0.78);
+}
+
+.footer-contact-item {
+ display: flex;
+ flex-direction: column;
+ gap: 0.2rem;
+}
+
+.footer-contact-item strong {
+ display: block;
+ font-size: 0.625rem;
+ text-transform: uppercase;
+ letter-spacing: 0.12em;
+ color: var(--primary);
+ font-weight: 700;
+}
+
+.footer-contact-item a {
+ color: inherit;
+ text-decoration: none;
+ font-weight: 600;
+ border-bottom: 1px solid transparent;
+ transition: all 0.3s ease;
+}
+
+.footer-contact-item a:hover {
+ color: var(--primary);
+ border-color: var(--primary);
+}
+
+.footer-group-title {
+ font-size: 0.8125rem;
+ text-transform: uppercase;
+ letter-spacing: 0.12em;
+ margin-bottom: 1.5rem;
+ color: rgba(255, 255, 255, 0.9);
+ font-weight: 700;
+}
+
+.footer-links {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.footer-links li {
+ margin-bottom: 1rem;
+}
+
+.footer-link {
+ color: white;
+ text-decoration: none;
+ opacity: 0.7;
+ font-size: 0.9375rem;
+ transition: all 0.3s ease;
+}
+
+.footer-link:hover {
+ opacity: 1;
+ color: var(--primary);
+ padding-left: 0.25rem;
+}
+
+.site-footer-bottom {
+ padding-top: 3rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+ font-size: 0.875rem;
+}
+
+.footer-bottom-inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.footer-meta {
+ opacity: 0.5;
+}
+
+.footer-socials {
+ display: flex;
+ gap: 1.5rem;
+}
+
+/* Decorative and Special Panels */
+.bg-layer {
+ background: var(--bg-soft);
+ position: relative;
+}
+
+.image-frame.decorative::before {
+ content: "";
+ position: absolute;
+ top: -20px;
+ left: -20px;
+ width: 100px;
+ height: 100px;
+ border-top: 4px solid var(--primary);
+ border-left: 4px solid var(--primary);
+ z-index: 1;
+}
+
+.image-frame.elevated {
+ transform: translateY(-20px);
+ box-shadow: var(--shadow-xl);
+}
+
+@media (max-width: 960px) {
+ .image-frame.elevated {
+ transform: none;
+ }
+}
+
+.glass-panel {
+ background: rgba(255, 255, 255, 0.7);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ padding: 3rem;
+ border-radius: 20px;
+}
+
+.text-display {
+ font-size: 2.5rem;
+ line-height: 1.1;
+ font-weight: 800;
+ letter-spacing: -0.03em;
+}
+
+.text-lg {
+ font-size: 1.25rem;
+ line-height: 1.6;
+}
+
+.home-hero {
+ position: relative;
+ padding: 8rem 0;
+ background: var(--secondary);
+ color: var(--white);
+ overflow: hidden;
+}
+
+.home-hero-bg {
+ position: absolute;
+ inset: 0;
+ opacity: 0.3;
+}
+
+.home-hero-inner {
+ position: relative;
+ z-index: 10;
+ height: 100%;
+ display: flex;
+ align-items: center;
+}
+
+/* Reviews Badge */
+.hero-reviews {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ margin-top: 1.5rem;
+ margin-bottom: 2.5rem;
+ padding: 0.5rem 0.25rem;
+ border-radius: 8px;
+}
+
+.hero-reviews .stars {
+ display: flex;
+ gap: 2px;
+ color: #FFB800;
+}
+
+.hero-reviews .stars svg {
+ width: 16px;
+ height: 16px;
+ fill: currentColor;
+}
+
+.hero-reviews span {
+ font-size: 0.9rem;
+ font-weight: 600;
+ color: rgba(255, 255, 255, 0.9);
+ letter-spacing: 0.01em;
+}
+
+.home-hero-copy h1 {
+ color: var(--white);
+ margin-bottom: 2rem;
+}
+
+.home-hero-copy p {
+ color: var(--accent);
+ font-size: 1.25rem;
+ line-height: 1.4;
+ margin-bottom: 3rem;
+}
+
+/* Service Band */
+.quick-service-band {
+ background: var(--primary);
+ padding: 2.5rem 0;
+ color: white;
+ box-shadow: 0 10px 30px rgba(244, 127, 32, 0.2);
+ position: relative;
+ z-index: 10;
+ margin-top: -3rem;
+}
+
+.quick-service-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 2rem;
+ max-width: 1000px;
+ margin: 0 auto;
+}
+
+.service-item {
+ text-align: center;
+}
+
+.service-item h4 {
+ font-size: 0.75rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ margin-bottom: 0.25rem;
+ opacity: 0.8;
+}
+
+.service-item span,
+.service-item a {
+ font-weight: 700;
+ font-size: 1.125rem;
+ display: block;
+}
+
+@media (max-width: 900px) {
+ .quick-service-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 2rem 1rem;
+ }
+}
+
+@media (max-width: 600px) {
+ .quick-service-grid {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+}
+
+/* --- Category Cards --- */
+.category-card {
+ transition: transform 0.4s cubic-bezier(0.165, 0.84, 0.44, 1),
+ box-shadow 0.4s ease;
+ cursor: pointer;
+}
+
+.category-card:hover {
+ transform: translateY(-8px);
+ box-shadow: var(--shadow-lg);
+}
+
+.category-card img {
+ transition: transform 0.6s ease;
+}
+
+.category-card:hover img {
+ transform: scale(1.05);
+}
+
+/* --- Reveal Animations --- */
+.reveal {
+ opacity: 0;
+ transform: translateY(30px);
+ transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.165, 0.84, 0.44, 1);
+}
+
+.reveal.active {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+.reveal-delay-1 {
+ transition-delay: 0.1s;
+}
+
+.reveal-delay-2 {
+ transition-delay: 0.2s;
+}
+
+.reveal-delay-3 {
+ transition-delay: 0.3s;
+}
+
+@media (max-width: 1024px) {
+ .home-hero-inner {
+ grid-template-columns: 1fr;
+ text-align: center;
+ gap: 4rem;
+ }
+
+ .site-footer-top {
+ grid-template-columns: 1fr 1fr;
+ gap: 3rem;
+ }
+}
+
+@media (max-width: 768px) {
+
+ .site-utility-bar,
+ .main-nav,
+ .header-actions {
+ display: none;
+ }
+
+ .mobile-menu-toggle {
+ display: flex;
+ }
+
+ .mobile-nav {
+ display: block;
+ }
+
+ .mobile-nav-overlay {
+ display: block;
+ }
+
+ .featured-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .featured-header {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1.25rem;
+ margin-bottom: 2rem;
+ }
+
+ .quick-service-grid {
+ grid-template-columns: 1fr 1fr;
+ }
+
+ .site-footer-top {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* ==============================
+ HERO SECTION — SPLIT LAYOUT
+ ============================== */
+
+.home-hero {
+ display: grid;
+ grid-template-columns: minmax(0, 60%) minmax(0, 40%);
+ min-height: 90vh;
+ overflow: hidden;
+ background: var(--secondary);
+ padding: 0 !important;
+ position: relative;
+ color: var(--white);
+}
+
+.home-hero-left {
+ background: var(--secondary);
+ display: flex;
+ align-items: center;
+ padding: 6rem max(2rem, calc((100vw - 1280px) / 2 + 1.5rem));
+ padding-right: 6rem;
+ position: relative;
+}
+
+.home-hero-left::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: -128px;
+ bottom: 0;
+ width: clamp(88px, 8vw, 128px);
+ background: rgba(var(--secondary-rgb), 0.78);
+ clip-path: ellipse(72% 156% at 18% 62%);
+ pointer-events: none;
+ z-index: 1;
+}
+
+.home-hero-left::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: -214px;
+ bottom: 0;
+ width: clamp(280px, 22vw, 392px);
+ background: linear-gradient(
+ to right,
+ var(--secondary) 0%,
+ var(--secondary) 40%,
+ rgba(13, 27, 42, 0.95) 55%,
+ rgba(13, 27, 42, 0.85) 65%,
+ rgba(13, 27, 42, 0.60) 75%,
+ rgba(13, 27, 42, 0.30) 86%,
+ rgba(13, 27, 42, 0.08) 94%,
+ transparent 100%
+ );
+ clip-path: ellipse(80% 158% at 12% 62%);
+ pointer-events: none;
+ z-index: 2;
+}
+
+.home-hero-visual {
+ position: relative;
+ overflow: hidden;
+ isolation: isolate;
+ min-height: 100%;
+ margin-left: -122px;
+ clip-path: ellipse(66% 154% at 100% 62%);
+}
+
+.home-hero-visual::before {
+ display: none;
+}
+
+.home-hero-visual img {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.home-hero-visual-overlay {
+ position: absolute;
+ inset: 0;
+ background:
+ linear-gradient(
+ 180deg,
+ rgba(13, 27, 42, 0.14) 0%,
+ rgba(13, 27, 42, 0.04) 38%,
+ rgba(13, 27, 42, 0.12) 100%
+ );
+ z-index: 1;
+}
+
+/* ── Hero Cinema ── */
+.hc-root {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+
+/* Full-coverage slide */
+.hc-slide-full {
+ position: absolute;
+ inset: 0;
+}
+
+/* Subtle overlay on left edge */
+.hc-overlay {
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(to right, rgba(13, 27, 42, 0.35) 0%, transparent 45%);
+ z-index: 2;
+ pointer-events: none;
+}
+
+/* Dot indicators */
+.hc-dots {
+ position: absolute;
+ bottom: 1.5rem;
+ left: 50%;
+ transform: translateX(-50%);
+ display: flex;
+ gap: 8px;
+ z-index: 10;
+}
+
+.hc-dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ border: none;
+ background: rgba(255, 255, 255, 0.4);
+ cursor: pointer;
+ padding: 0;
+ transition: background 0.3s, transform 0.3s;
+}
+
+.hc-dot-active {
+ background: var(--primary);
+ transform: scale(1.4);
+}
+
+/* ── Floating video card ── */
+.hc-video-card {
+ position: absolute;
+ bottom: 3rem;
+ right: 3rem;
+ z-index: 20;
+ width: clamp(280px, 24vw, 390px);
+ border-radius: 12px;
+ overflow: hidden;
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35), 0 0 0 1.5px rgba(255, 255, 255, 0.15);
+ background: #000;
+}
+
+.hc-video-small {
+ display: block;
+ width: 100%;
+ aspect-ratio: 16 / 9;
+ object-fit: cover;
+ opacity: 0.95;
+}
+
+.hc-video-shield {
+ position: absolute;
+ right: 0.75rem;
+ bottom: 0.75rem;
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.45rem 0.7rem;
+ border-radius: 999px;
+ background: linear-gradient(135deg, rgba(13, 27, 42, 0.92), rgba(13, 27, 42, 0.72));
+ color: rgba(255, 255, 255, 0.96);
+ font-family: 'Outfit', sans-serif;
+ font-size: 0.7rem;
+ font-weight: 700;
+ letter-spacing: 0.05em;
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.24);
+}
+
+.hc-video-shield-line {
+ width: 18px;
+ height: 2px;
+ border-radius: 999px;
+ background: var(--primary);
+}
+
+.hc-video-shield-text {
+ white-space: nowrap;
+}
+
+.hc-video-card-badge {
+ position: absolute;
+ bottom: 0.2rem;
+ right: 0.2rem;
+ font-size: 0.6rem;
+ font-weight: 800;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ color: #fff;
+ background: var(--primary);
+ padding: 3px 8px;
+ border-radius: 4px;
+ line-height: 1.4;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+}
+
+/* Override the old home-hero-bg and home-hero-inner since we restructured */
+.home-hero-bg {
+ display: none;
+}
+
+.home-hero-inner {
+ display: block;
+}
+
+.home-hero-copy {
+ max-width: 600px;
+ width: 100%;
+}
+
+.home-hero-copy h1 {
+ color: var(--white);
+ font-size: clamp(2.5rem, 3.5vw, 4rem);
+ line-height: 1.1;
+ margin-bottom: 1.5rem;
+}
+
+.home-hero-copy p {
+ color: rgba(224, 225, 221, 0.85);
+ font-size: 1.2rem;
+ line-height: 1.6;
+ margin-bottom: 2.5rem;
+}
+
+.hero-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ align-items: center;
+}
+
+@media (max-width: 1024px) {
+ .home-hero {
+ grid-template-columns: 1fr;
+ min-height: auto;
+ }
+
+ .home-hero-left {
+ padding: 5rem 1.5rem;
+ padding-right: 1.5rem;
+ }
+
+ .home-hero-left::after {
+ display: none;
+ }
+
+ .home-hero-left::before {
+ display: none;
+ }
+
+ .home-hero-visual {
+ height: 400px;
+ margin-left: 0;
+ clip-path: none;
+ }
+
+ .home-hero-visual::before {
+ display: none;
+ }
+
+ .home-hero-copy {
+ max-width: 100%;
+ text-align: center;
+ }
+
+ .hero-actions {
+ justify-content: center;
+ }
+
+ .hc-video-card {
+ width: 260px;
+ bottom: 1.5rem;
+ right: 1.5rem;
+ }
+
+ .hc-video-shield {
+ font-size: 0.58rem;
+ padding: 0.4rem 0.55rem;
+ }
+}
+
+@media (max-width: 600px) {
+ .home-hero-visual {
+ height: 280px;
+ }
+
+ .hc-video-card {
+ width: 200px;
+ right: 1rem;
+ bottom: 1rem;
+ }
+
+ .hc-video-shield {
+ gap: 0.35rem;
+ padding: 0.32rem 0.45rem;
+ font-size: 0.52rem;
+ }
+
+ .hc-video-shield-line {
+ width: 12px;
+ }
+}
+
+/* ==============================
+ PROCESS TIMELINE — ZIGZAG
+ ============================== */
+
+.process-timeline {
+ position: relative;
+ padding: 1rem 0 2rem;
+}
+
+/* Vertical rail line */
+.process-rail {
+ position: absolute;
+ left: calc(50% - 1.5px);
+ top: 0;
+ bottom: 0;
+ width: 3px;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.process-rail-track {
+ position: absolute;
+ inset: 0;
+ background: #dee2e8;
+ border-radius: 99px;
+}
+
+.process-rail-fill {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ background: var(--primary);
+ border-radius: 99px;
+ height: calc(var(--timeline-progress, 0) * 100%);
+ transition: height 0.06s linear;
+}
+
+/* Hide standalone markers — we use process-row-pin instead */
+.process-rail-markers {
+ display: none;
+}
+
+/* ---- rows ---- */
+.process-rows {
+ display: flex;
+ flex-direction: column;
+}
+
+.process-row {
+ display: grid;
+ grid-template-columns: 1fr 80px 1fr;
+ align-items: center;
+ padding: 3.5rem 0;
+ min-height: 200px;
+}
+
+/* is-right: [spacer col1] [pin col2] [card col3] */
+.process-row.is-right .process-row-spacer {
+ grid-column: 1;
+ grid-row: 1;
+}
+
+.process-row.is-right .process-row-pin {
+ grid-column: 2;
+ grid-row: 1;
+}
+
+.process-row.is-right .process-step-card {
+ grid-column: 3;
+ grid-row: 1;
+}
+
+/* is-left: [card col1] [pin col2] [spacer col3] */
+.process-row.is-left .process-step-card {
+ grid-column: 1;
+ grid-row: 1;
+}
+
+.process-row.is-left .process-row-pin {
+ grid-column: 2;
+ grid-row: 1;
+}
+
+.process-row.is-left .process-row-spacer {
+ grid-column: 3;
+ grid-row: 1;
+}
+
+/* The dot on the line */
+.process-row-pin {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: #dee2e8;
+ border: 4px solid #ffffff;
+ box-shadow: 0 0 0 2px #dee2e8;
+ margin: 0 auto;
+ position: relative;
+ z-index: 3;
+ transition: background 0.4s ease, box-shadow 0.4s ease;
+ flex-shrink: 0;
+}
+
+.process-row.is-active .process-row-pin {
+ background: var(--primary);
+ box-shadow: 0 0 0 3px rgba(244, 127, 32, 0.25);
+}
+
+/* Step card */
+.process-step-card {
+ background: var(--secondary);
+ color: white;
+ border-radius: 12px;
+ padding: 2rem 2.5rem;
+ opacity: 0;
+ transform: translateX(24px);
+ transition: opacity 0.55s ease, transform 0.55s cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.process-row.is-left .process-step-card {
+ transform: translateX(-24px);
+}
+
+.process-row.is-active .process-step-card {
+ opacity: 1;
+ transform: translateX(0);
+}
+
+.process-step-number {
+ display: block;
+ font-size: 2.25rem;
+ font-weight: 800;
+ color: var(--primary);
+ line-height: 1;
+ margin-bottom: 0.75rem;
+ font-family: 'Outfit', sans-serif;
+ letter-spacing: -0.02em;
+}
+
+.process-step-card h3 {
+ font-size: 1.125rem;
+ font-weight: 700;
+ color: white;
+ margin-bottom: 0.75rem;
+ line-height: 1.3;
+}
+
+.process-step-card p {
+ color: rgba(255, 255, 255, 0.65);
+ font-size: 0.9375rem;
+ margin-bottom: 0;
+ line-height: 1.65;
+}
+
+/* Mobile: stack vertically */
+@media (max-width: 768px) {
+ .process-rail {
+ left: 20px;
+ transform: none;
+ }
+
+ .process-row {
+ grid-template-columns: 44px 1fr;
+ grid-template-rows: auto;
+ padding: 1.5rem 0;
+ min-height: auto;
+ }
+
+ .process-row.is-right .process-row-spacer,
+ .process-row.is-left .process-row-spacer {
+ display: none;
+ }
+
+ .process-row.is-right .process-row-pin,
+ .process-row.is-left .process-row-pin {
+ grid-column: 1;
+ grid-row: 1;
+ }
+
+ .process-row.is-right .process-step-card,
+ .process-row.is-left .process-step-card {
+ grid-column: 2;
+ grid-row: 1;
+ transform: translateX(0) !important;
+ }
+}
+
+/* ==============================
+ ABOUT PAGE LAYOUTS
+ ============================== */
+
+.about-story {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 6rem;
+ align-items: start;
+}
+
+.about-story-copy {
+ display: flex;
+ flex-direction: column;
+ gap: 3rem;
+}
+
+.story-block h2 {
+ font-size: clamp(1.5rem, 2.5vw, 2rem);
+ margin-bottom: 1rem;
+}
+
+.about-story-media {
+ position: sticky;
+ top: 120px;
+}
+
+.image-frame {
+ position: relative;
+ border-radius: 12px;
+ overflow: hidden;
+ height: 500px;
+}
+
+.image-frame.wide {
+ height: 420px;
+}
+
+@media (max-width: 960px) {
+ .about-story {
+ grid-template-columns: 1fr;
+ gap: 3rem;
+ }
+
+ .about-story-media {
+ position: static;
+ }
+
+ .image-frame {
+ height: 320px;
+ }
+}
+
+/* Feature Grid */
+.feature-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 2rem;
+ margin-top: 3rem;
+}
+
+.feature-card {
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 12px;
+ padding: 2.5rem 2rem;
+ transition: background 0.3s ease;
+}
+
+.feature-card:hover {
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.feature-card h3 {
+ font-size: 1.125rem;
+ color: white;
+ margin-bottom: 0.75rem;
+}
+
+.feature-card p {
+ color: rgba(255, 255, 255, 0.65);
+ font-size: 0.9375rem;
+ margin-bottom: 0;
+}
+
+.feature-icon {
+ font-size: 1.75rem;
+ color: var(--primary);
+ margin-bottom: 1.25rem;
+ display: block;
+}
+
+@media (max-width: 768px) {
+ .feature-grid {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* Content Panel */
+.content-panel {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 5rem;
+ align-items: center;
+ border-radius: 20px;
+ padding: 4rem;
+}
+
+.content-panel-media {
+ position: relative;
+}
+
+.content-panel-copy h2 {
+ font-size: clamp(1.75rem, 3vw, 2.5rem);
+ margin-bottom: 1.5rem;
+}
+
+.inline-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ margin-top: 2.5rem;
+}
+
+@media (max-width: 960px) {
+ .content-panel {
+ grid-template-columns: 1fr;
+ gap: 3rem;
+ padding: 2.5rem;
+ }
+}
+
+/* CTA panel */
+.cta-panel {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 3rem;
+ background: var(--bg-soft);
+ padding: 3rem 3.5rem;
+ border-radius: 16px;
+ border: 1px solid var(--border);
+}
+
+.cta-panel h2 {
+ font-size: clamp(1.5rem, 2.5vw, 2rem);
+ margin-bottom: 0.5rem;
+}
+
+.cta-panel p {
+ margin-bottom: 0;
+}
+
+@media (max-width: 768px) {
+ .cta-panel {
+ flex-direction: column;
+ text-align: center;
+ padding: 2rem;
+ }
+}
+
+/* Utility */
+.align-center {
+ text-align: center;
+ margin-bottom: 0;
+}
+
+.align-center h2,
+.align-center p {
+ max-width: 700px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.section-header {
+ margin-bottom: 3rem;
+}
+
+.section-header.align-center {
+ text-align: center;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.bg-soft {
+ background: var(--bg-soft);
+}
+
+.bg-contrast {
+ background: var(--secondary);
+ color: white;
+}
+
+.section-contrast {
+ background: var(--secondary);
+ color: white;
+}
+
+.section-contrast h2,
+.section-contrast h3 {
+ color: white;
+}
+
+/* ==============================
+ WIDE SCREEN ENHANCEMENTS
+ ============================== */
+
+@media (min-width: 1440px) {
+ .container {
+ max-width: 1400px;
+ }
+
+ .home-hero-copy h1 {
+ font-size: 4.5rem;
+ }
+}
+
+@media (min-width: 1920px) {
+ .container {
+ max-width: 1600px;
+ }
+
+ .home-hero-left {
+ padding-right: 8rem;
+ }
+}
+
+/* ==============================
+ CATEGORY GRID RESPONSIVE
+ ============================== */
+
+@media (max-width: 900px) {
+ .category-grid {
+ grid-template-columns: 1fr !important;
+ }
+}
+
+@media (max-width: 1200px) {
+ .category-grid {
+ grid-template-columns: repeat(2, 1fr) !important;
+ }
+}
+
+/* ==============================
+ FOOTER — BRAND & MAP FIXES
+ ============================== */
+
+.brand-logo--footer {
+ filter: drop-shadow(0 14px 30px rgba(0, 0, 0, 0.28));
+}
+
+/* Footer map section */
+.footer-map-section {
+ margin-top: 3rem;
+ padding-top: 2.5rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.footer-map-label {
+ font-size: 0.8125rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.12em;
+ color: rgba(255, 255, 255, 0.9);
+ margin-bottom: 1rem;
+ display: block;
+}
+
+.footer-map-embed {
+ width: 100%;
+ height: 200px;
+ border-radius: 10px;
+ overflow: hidden;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.footer-map-embed iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+ display: block;
+}
+
+/* Footer layout — 5 columns when map is included */
+.site-footer-top {
+ grid-template-columns: 1.4fr repeat(3, 0.7fr) 1.2fr;
+}
+
+@media (max-width: 1200px) {
+ .site-footer-top {
+ grid-template-columns: 1fr 1fr;
+ }
+}
+
+@media (max-width: 640px) {
+ .site-footer-top {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* ==============================
+ CTA SECTION — SEAMLESS INTO FOOTER
+ ============================== */
+
+/* Remove ugly gap/stripe between bg-contrast sections */
+.bg-contrast+.site-footer {
+ border-top: none;
+ padding-top: 3rem;
+}
+
+/* ==============================
+ CONTACT PAGE — MAP EMBED
+ ============================== */
+
+.contact-map-embed {
+ width: 100%;
+ height: 300px;
+ border-radius: 12px;
+ overflow: hidden;
+ margin-bottom: 1.5rem;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+}
+
+.contact-map-embed iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+ display: block;
+}
+
+/* ==============================
+ STATS BAND
+ ============================== */
+
+.stats-band {
+ background: var(--secondary);
+ padding: 3.5rem 0;
+ border-top: 3px solid var(--primary);
+}
+
+.stats-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 2rem;
+ text-align: center;
+}
+
+.stat-item {
+ display: flex;
+ flex-direction: column;
+ gap: 0.4rem;
+ padding: 1.5rem 1rem;
+ border-right: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.stats-grid>div:last-child .stat-item {
+ border-right: none;
+}
+
+.stat-value {
+ font-family: 'Outfit', sans-serif;
+ font-size: clamp(2rem, 3.5vw, 3rem);
+ font-weight: 800;
+ color: var(--primary);
+ line-height: 1;
+}
+
+.stat-label {
+ font-size: 0.8125rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ color: rgba(255, 255, 255, 0.6);
+}
+
+@media (max-width: 768px) {
+ .stats-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ .stat-item {
+ border-right: none;
+ }
+}
+
+@media (max-width: 480px) {
+ .featured-grid {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* ==============================
+ TESTIMONIALS CAROUSEL
+ ============================== */
+
+.tc-wrapper {
+ position: relative;
+ overflow: visible;
+ padding: 0.5rem 0 2rem;
+}
+
+.tc-track-container {
+ overflow-x: clip;
+ overflow-y: visible;
+ padding: 0.85rem 0 1.5rem;
+ margin: -0.85rem 0 -1.5rem;
+}
+
+.tc-track {
+ display: flex;
+ gap: 1.75rem;
+ width: max-content;
+ animation: tc-scroll 40s linear infinite;
+}
+
+.tc-wrapper:hover .tc-track {
+ animation-play-state: paused;
+}
+
+@keyframes tc-scroll {
+ 0% {
+ transform: translateX(0);
+ }
+
+ 100% {
+ transform: translateX(calc(-33.333%));
+ }
+}
+
+.tc-slide {
+ width: 380px;
+ flex-shrink: 0;
+}
+
+@media (max-width: 600px) {
+ .tc-slide {
+ width: 300px;
+ }
+}
+
+.tc-card {
+ background: white;
+ border: 1px solid var(--border);
+ border-radius: 14px;
+ padding: 2rem;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ cursor: default;
+ transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+}
+
+.tc-card:hover {
+ border-color: var(--primary);
+}
+
+.tc-card-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.tc-stars {
+ display: flex;
+ gap: 2px;
+ font-size: 1.1rem;
+}
+
+.tc-star {
+ color: #d1d5db;
+}
+
+.tc-star.filled {
+ color: #f59e0b;
+}
+
+.tc-date {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ font-weight: 500;
+}
+
+.tc-quote {
+ font-size: 0.9375rem;
+ line-height: 1.65;
+ color: var(--text-main);
+ flex: 1;
+ font-style: normal;
+}
+
+.tc-author {
+ display: flex;
+ align-items: center;
+ gap: 0.875rem;
+ padding-top: 1rem;
+ border-top: 1px solid var(--border);
+}
+
+.tc-avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: var(--primary);
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 800;
+ font-size: 1rem;
+ flex-shrink: 0;
+}
+
+.tc-name {
+ display: block;
+ font-size: 0.9375rem;
+ font-weight: 700;
+ color: var(--secondary);
+}
+
+.tc-source {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-top: 0.1rem;
+}
+
+.tc-fade-left,
+.tc-fade-right {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 120px;
+ pointer-events: none;
+ z-index: 2;
+}
+
+.tc-fade-left {
+ left: 0;
+ background: linear-gradient(to right, var(--bg-soft), transparent);
+}
+
+.tc-fade-right {
+ right: 0;
+ background: linear-gradient(to left, var(--bg-soft), transparent);
+}
+
+/* ==============================
+ HOME CTA SECTION
+ ============================== */
+
+.home-cta-section {
+ background: var(--secondary);
+ padding: 6rem 0;
+ color: white;
+}
+
+.home-cta-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 5rem;
+ align-items: center;
+}
+
+.home-cta-copy h2 {
+ color: white;
+ font-size: clamp(1.75rem, 3vw, 2.75rem);
+ margin-bottom: 1.25rem;
+}
+
+.home-cta-copy>p {
+ color: rgba(255, 255, 255, 0.7);
+ font-size: 1.0625rem;
+ line-height: 1.7;
+ margin-bottom: 2rem;
+}
+
+.home-cta-contact-items {
+ display: flex;
+ flex-direction: column;
+ gap: 0.875rem;
+ margin-bottom: 2rem;
+}
+
+.home-cta-contact-item {
+ display: flex;
+ align-items: center;
+ gap: 0.875rem;
+ font-size: 0.9375rem;
+ color: rgba(255, 255, 255, 0.8);
+ text-decoration: none;
+ transition: color 0.2s ease;
+}
+
+a.home-cta-contact-item:hover {
+ color: var(--primary);
+}
+
+.home-cta-contact-icon {
+ font-size: 1rem;
+ flex-shrink: 0;
+}
+
+.home-cta-full-link {
+ border-color: rgba(255, 255, 255, 0.4);
+ color: rgba(255, 255, 255, 0.9);
+}
+
+.home-cta-full-link:hover {
+ border-color: white;
+ color: white;
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.home-cta-form-card {
+ background: white;
+ border-radius: 16px;
+ padding: 2.5rem;
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.2);
+}
+
+.home-cta-form-card h3 {
+ font-size: 1.375rem;
+ color: var(--secondary);
+ margin-bottom: 0.25rem;
+}
+
+.home-cta-form-card>p {
+ color: var(--text-muted);
+}
+
+.home-cta-form {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.home-cta-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1rem;
+}
+
+.home-cta-input {
+ width: 100%;
+ padding: 0.875rem 1rem;
+ border: 1.5px solid var(--border);
+ border-radius: 8px;
+ font-family: inherit;
+ font-size: 0.9375rem;
+ color: var(--text-main);
+ background: var(--bg-soft);
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+ outline: none;
+}
+
+.home-cta-input:focus {
+ border-color: var(--primary);
+ box-shadow: 0 0 0 3px var(--primary-soft);
+ background: white;
+}
+
+.home-cta-textarea {
+ resize: none;
+}
+
+.home-cta-error {
+ font-size: 0.8125rem;
+ color: #dc2626;
+ margin: 0;
+}
+
+.home-cta-success {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1rem;
+ padding: 2.5rem 1rem;
+ text-align: center;
+}
+
+.home-cta-success span {
+ font-size: 2.5rem;
+ color: #16a34a;
+}
+
+.home-cta-success p {
+ color: var(--text-muted);
+ font-size: 0.9375rem;
+ margin: 0;
+}
+
+@media (max-width: 900px) {
+ .home-cta-grid {
+ grid-template-columns: 1fr;
+ gap: 3rem;
+ }
+
+ .home-cta-row {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* ==============================
+ PRODUCTS OVERVIEW
+ ============================== */
+
+.inventory-overview-header {
+ max-width: 760px;
+ margin: 0 auto 3rem;
+ text-align: center;
+}
+
+.inventory-overview-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 2rem;
+}
+
+.inventory-overview-card {
+ display: grid;
+ grid-template-columns: 1fr;
+ background: white;
+ border: 1px solid var(--border);
+ border-radius: 18px;
+ overflow: hidden;
+ box-shadow: var(--shadow-xl);
+}
+
+.inventory-overview-media {
+ position: relative;
+ min-height: 280px;
+}
+
+.inventory-overview-copy {
+ padding: 2rem;
+}
+
+.inventory-overview-copy h2 {
+ margin-bottom: 1rem;
+}
+
+.inventory-chip-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ margin: 1.5rem 0 2rem;
+}
+
+.inventory-chip {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.55rem 0.9rem;
+ border-radius: 999px;
+ background: var(--bg-soft);
+ color: var(--secondary);
+ font-size: 0.8125rem;
+ font-weight: 700;
+}
+
+/* ==============================
+ NOT FOUND
+ ============================== */
+
+.not-found-page {
+ position: relative;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at top left, rgba(244, 127, 32, 0.2), transparent 30%),
+ linear-gradient(135deg, #f8f9fa 0%, #eef2f5 100%);
+}
+
+.not-found-shell {
+ display: grid;
+ grid-template-columns: minmax(0, 1.15fr) minmax(320px, 0.85fr);
+ gap: 2rem;
+ align-items: stretch;
+ padding: 1rem 0;
+}
+
+.not-found-copy,
+.not-found-card-grid {
+ position: relative;
+ z-index: 1;
+}
+
+.not-found-copy {
+ background: rgba(255, 255, 255, 0.82);
+ border: 1px solid rgba(255, 255, 255, 0.7);
+ border-radius: 24px;
+ padding: 3rem;
+ box-shadow: var(--shadow-2xl);
+ backdrop-filter: blur(10px);
+}
+
+.not-found-copy h1 {
+ max-width: 12ch;
+ margin-bottom: 1rem;
+}
+
+.not-found-copy p {
+ max-width: 54ch;
+ font-size: 1.05rem;
+}
+
+.not-found-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ margin-top: 2rem;
+}
+
+.not-found-card-grid {
+ display: grid;
+ gap: 1rem;
+}
+
+.not-found-card {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ gap: 0.8rem;
+ min-height: 180px;
+ padding: 1.75rem;
+ border-radius: 20px;
+ background: linear-gradient(180deg, rgba(13, 27, 42, 0.98), rgba(27, 38, 59, 0.96));
+ box-shadow: var(--shadow-xl);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.not-found-card strong {
+ color: white;
+ font-family: 'Outfit', 'Inter', sans-serif;
+ font-size: 1.35rem;
+ line-height: 1.2;
+}
+
+.not-found-card span:last-child {
+ color: rgba(255, 255, 255, 0.72);
+ font-size: 0.95rem;
+}
+
+.not-found-card:hover {
+ transform: translateY(-4px);
+ border-color: rgba(244, 127, 32, 0.5);
+}
+
+.not-found-card-label {
+ display: inline-flex;
+ align-items: center;
+ width: fit-content;
+ padding: 0.45rem 0.7rem;
+ border-radius: 999px;
+ background: rgba(244, 127, 32, 0.14);
+ color: var(--primary);
+ font-size: 0.75rem;
+ font-weight: 800;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+@media (max-width: 980px) {
+
+ .inventory-overview-grid,
+ .not-found-shell {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 640px) {
+ .not-found-copy {
+ padding: 2rem;
+ }
+
+ .not-found-actions .button {
+ width: 100%;
+ }
+
+ .inventory-overview-media {
+ min-height: 220px;
+ }
+}
+/* ─── 404 Not Found ──────────────────────────────────────── */
+
+.nf-hero {
+ position: relative;
+ min-height: calc(100vh - 72px);
+ background: var(--secondary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ padding: 5rem 1.5rem;
+}
+
+/* Subtle brick-grid line texture */
+.nf-bg-grid {
+ position: absolute;
+ inset: 0;
+ background-image:
+ repeating-linear-gradient(0deg, transparent, transparent 39px, rgba(255, 255, 255, 0.03) 39px, rgba(255, 255, 255, 0.03) 40px),
+ repeating-linear-gradient(90deg, transparent, transparent 79px, rgba(255, 255, 255, 0.03) 79px, rgba(255, 255, 255, 0.03) 80px);
+ pointer-events: none;
+}
+
+/* Radial teal glow sitting behind the 404 number */
+.nf-glow {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -55%);
+ width: 700px;
+ height: 500px;
+ background: radial-gradient(ellipse at center, rgba(26, 140, 140, 0.18) 0%, transparent 70%);
+ pointer-events: none;
+}
+
+/* Content container */
+.nf-inner {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ max-width: 860px;
+ width: 100%;
+}
+
+/* "ERROR" eyebrow */
+.nf-eyebrow {
+ display: inline-block;
+ font-family: 'Outfit', sans-serif;
+ font-size: 0.7rem;
+ font-weight: 700;
+ letter-spacing: 0.25em;
+ text-transform: uppercase;
+ color: var(--primary);
+ background: rgba(244, 127, 32, 0.12);
+ padding: 4px 14px;
+ border-radius: 20px;
+ margin-bottom: 1.25rem;
+ border: 1px solid rgba(244, 127, 32, 0.25);
+}
+
+/* Giant "404" with gradient */
+.nf-number {
+ font-family: 'Outfit', sans-serif;
+ font-size: clamp(7rem, 20vw, 14rem);
+ font-weight: 800;
+ line-height: 0.9;
+ letter-spacing: -4px;
+ background: linear-gradient(135deg, #1a8c8c 0%, #f47f20 55%, #e0a060 100%);
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+ color: transparent;
+ margin-bottom: 1.75rem;
+ animation: nf-pop 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) both;
+}
+
+@keyframes nf-pop {
+ from {
+ opacity: 0;
+ transform: scale(0.88);
+ }
+
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+/* Heading */
+.nf-heading {
+ font-family: 'Outfit', sans-serif;
+ font-size: clamp(1.4rem, 3vw, 2.1rem);
+ font-weight: 700;
+ color: var(--white);
+ max-width: 500px;
+ line-height: 1.3;
+ margin: 0 auto 1rem;
+ animation: nf-fade-up 0.5s 0.15s ease both;
+}
+
+/* Subtext */
+.nf-sub {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 1.05rem;
+ line-height: 1.75;
+ max-width: 420px;
+ margin: 0 auto 2.5rem;
+ animation: nf-fade-up 0.5s 0.25s ease both;
+}
+
+@keyframes nf-fade-up {
+ from {
+ opacity: 0;
+ transform: translateY(14px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* CTA row */
+.nf-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ justify-content: center;
+ margin-bottom: 3.5rem;
+ animation: nf-fade-up 0.5s 0.35s ease both;
+}
+
+/* Ghost button for dark background */
+.nf-btn-ghost {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1.6rem;
+ border-radius: 6px;
+ border: 1px solid rgba(255, 255, 255, 0.25);
+ color: rgba(255, 255, 255, 0.8);
+ font-size: 0.9rem;
+ font-weight: 600;
+ text-decoration: none;
+ transition: border-color 0.2s, color 0.2s, background 0.2s;
+}
+
+.nf-btn-ghost:hover {
+ border-color: rgba(255, 255, 255, 0.5);
+ color: var(--white);
+ background: rgba(255, 255, 255, 0.07);
+}
+
+/* Glasscard grid */
+.nf-cards {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1.25rem;
+ justify-content: center;
+ width: 100%;
+ animation: nf-fade-up 0.5s 0.45s ease both;
+}
+
+.nf-card {
+ flex: 1 1 260px;
+ max-width: 360px;
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ padding: 1.75rem 1.75rem 1.5rem;
+ border-radius: 14px;
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ text-align: left;
+ text-decoration: none;
+ color: var(--white);
+ position: relative;
+ overflow: hidden;
+ transition: transform 0.25s ease, background 0.25s ease, border-color 0.25s ease;
+}
+
+/* Teal-to-orange top accent slides in on hover */
+.nf-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background: linear-gradient(90deg, #1a8c8c, var(--primary));
+ transform: scaleX(0);
+ transform-origin: left;
+ transition: transform 0.3s ease;
+}
+
+.nf-card:hover::before {
+ transform: scaleX(1);
+}
+
+.nf-card:hover {
+ transform: translateY(-5px);
+ background: rgba(255, 255, 255, 0.09);
+ border-color: rgba(255, 255, 255, 0.2);
+}
+
+/* Pill label */
+.nf-card-label {
+ display: inline-block;
+ font-size: 0.65rem;
+ font-weight: 700;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ color: var(--primary);
+ background: rgba(244, 127, 32, 0.12);
+ border: 1px solid rgba(244, 127, 32, 0.2);
+ padding: 3px 10px;
+ border-radius: 20px;
+ align-self: flex-start;
+}
+
+.nf-card-title {
+ display: block;
+ font-size: 1.05rem;
+ font-weight: 700;
+ line-height: 1.35;
+ color: var(--white);
+}
+
+.nf-card-cta {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 0.8rem;
+ color: rgba(255, 255, 255, 0.45);
+ transition: color 0.2s ease;
+ margin-top: auto;
+}
+
+.nf-card:hover .nf-card-cta {
+ color: var(--primary);
+}
+
+/* Mobile */
+@media (max-width: 540px) {
+ .nf-number {
+ letter-spacing: -2px;
+ margin-bottom: 1.25rem;
+ }
+
+ .nf-actions {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .nf-btn-ghost,
+ .nf-actions .button {
+ text-align: center;
+ justify-content: center;
+ }
+
+ .nf-cards {
+ flex-direction: column;
+ }
+
+ .nf-card {
+ max-width: 100%;
+ }
+}
diff --git a/app/icon.png b/app/icon.png
new file mode 100644
index 0000000..210ab0d
Binary files /dev/null and b/app/icon.png differ
diff --git a/app/icon.svg b/app/icon.svg
new file mode 100644
index 0000000..e70270e
--- /dev/null
+++ b/app/icon.svg
@@ -0,0 +1,14 @@
+
+
+
+ SM
+
diff --git a/app/landscaping-supplies/page.tsx b/app/landscaping-supplies/page.tsx
new file mode 100644
index 0000000..22e761c
--- /dev/null
+++ b/app/landscaping-supplies/page.tsx
@@ -0,0 +1,121 @@
+import NextImage from "next/image";
+import { Breadcrumbs } from "@/components/breadcrumbs";
+import { JsonLd } from "@/components/json-ld";
+import { MaterialCatalog } from "@/components/material-catalog";
+import {
+ landscapingCategory,
+ siteConfig,
+} from "@/data/site-content";
+import { breadcrumbSchema, buildPageMetadata, itemListSchema } from "@/lib/seo";
+import { landscapingMaterials } from "@/data/site-content";
+import { FadeUp, FadeIn } from "@/components/page-hero-motion";
+
+export const metadata = buildPageMetadata({
+ title: "Landscaping Supplies in Corpus Christi, TX",
+ description:
+ "Browse flagstone, sand & gravel, boulders & stone, and Mexico Beach Pebbles from Southern Masonry Supply in Corpus Christi, TX.",
+ path: "/landscaping-supplies",
+ image: "/images/hero_landscaping.png",
+});
+
+export default function LandscapingSuppliesPage() {
+ const breadcrumbs = [
+ { name: "Home", path: "/" },
+ { name: "Landscaping Supplies", path: "/landscaping-supplies" },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ Landscaping supplies
+
+
+
+ {landscapingCategory.title}
+
+
+
+
+ {landscapingCategory.description}
+
+
+
+
+ {siteConfig.cityRegion}
+ Bulk bags and by-the-yard options
+ Delivery available
+
+
+
+
+
+
+
+ Flagstone, pebbles, aggregates, and boulders
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..60aeebf
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,73 @@
+import type { Metadata } from "next";
+import "./globals.css";
+import { SiteFooter } from "@/components/site-footer";
+import { SiteHeader } from "@/components/site-header";
+import { ScrollReveal } from "@/components/scroll-reveal";
+import { JsonLd } from "@/components/json-ld";
+import {
+ buildMetadataBase,
+ businessSchema,
+ websiteSchema,
+} from "@/lib/seo";
+import { siteConfig } from "@/data/site-content";
+
+export const metadata: Metadata = {
+ metadataBase: buildMetadataBase(),
+ title: {
+ default: `${siteConfig.name} | Masonry & Landscaping Supplies`,
+ template: `%s | ${siteConfig.name}`,
+ },
+ description: siteConfig.description,
+ alternates: {
+ canonical: "/",
+ },
+ openGraph: {
+ type: "website",
+ title: `${siteConfig.name} | Masonry & Landscaping Supplies`,
+ description: siteConfig.description,
+ siteName: siteConfig.name,
+ images: [
+ {
+ url: siteConfig.defaultOgImage,
+ alt: siteConfig.name,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `${siteConfig.name} | Masonry & Landscaping Supplies`,
+ description: siteConfig.description,
+ images: [siteConfig.defaultOgImage],
+ },
+ icons: {
+ icon: "/icon.png",
+ shortcut: "/icon.png",
+ apple: "/icon.png",
+ },
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/app/masonry-supplies/page.tsx b/app/masonry-supplies/page.tsx
new file mode 100644
index 0000000..1e1b9a1
--- /dev/null
+++ b/app/masonry-supplies/page.tsx
@@ -0,0 +1,101 @@
+import NextImage from "next/image";
+import { Breadcrumbs } from "@/components/breadcrumbs";
+import { JsonLd } from "@/components/json-ld";
+import { MaterialCatalog } from "@/components/material-catalog";
+import {
+ masonryCategory,
+ siteConfig,
+} from "@/data/site-content";
+import { breadcrumbSchema, buildPageMetadata, itemListSchema } from "@/lib/seo";
+import { masonryMaterials } from "@/data/site-content";
+import { FadeUp, FadeIn } from "@/components/page-hero-motion";
+
+export const metadata = buildPageMetadata({
+ title: "Masonry Supplies in Corpus Christi, TX",
+ description:
+ "Browse masonry tools and bagged cement from Southern Masonry Supply in Corpus Christi, TX.",
+ path: "/masonry-supplies",
+ image: "/images/hero_masonry.png",
+});
+
+export default function MasonrySuppliesPage() {
+ const breadcrumbs = [
+ { name: "Home", path: "/" },
+ { name: "Masonry Supplies", path: "/masonry-supplies" },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ Masonry supplies
+
+
+ {masonryCategory.title}
+
+
+
+ {masonryCategory.description}
+
+
+
+
+ {siteConfig.cityRegion}
+ Quote-first service
+ Delivery available
+
+
+
+
+
+
+
+ Tools, cement, and fast follow-up quoting
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/not-found.tsx b/app/not-found.tsx
new file mode 100644
index 0000000..dab8689
--- /dev/null
+++ b/app/not-found.tsx
@@ -0,0 +1,62 @@
+import Link from "next/link";
+
+export default function NotFound() {
+ return (
+
+ {/* subtle brick grid overlay */}
+
+
+ {/* radial glow behind 404 */}
+
+
+
+
ERROR
+
+
404
+
+
+ That page is not part of the current yard layout.
+
+
+
+ Head back to the homepage, check our material catalogs,
+ or contact the yard — we'll find what you're looking for.
+
+
+
+
+ ← Back home
+
+
+ Contact the yard
+
+
+
+
+
+
Masonry Catalog
+
+ Brick, mortar, cement & tools
+
+
+ Open masonry inventory
+
+
+
+
+
+
Natural Stone
+
+ Flagstone, gravel & decorative rock
+
+
+ Browse landscaping materials
+
+
+
+
+
+
+ );
+}
+
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..71538a5
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,491 @@
+import Image from "next/image";
+import Link from "next/link";
+import { siteConfig, processSteps, faqs, featuredMaterials, googleReviews, homeStats } from "@/data/site-content";
+import { JsonLd } from "@/components/json-ld";
+import { ProcessTimeline } from "@/components/process-timeline";
+import { Breadcrumbs } from "@/components/breadcrumbs";
+import { buildPageMetadata, breadcrumbSchema, faqPageSchema } from "@/lib/seo";
+import { TestimonialsCarousel } from "@/components/testimonials-carousel";
+import { HomeCTASection } from "@/components/home-cta-section";
+import { MotionSection } from "@/components/motion-section";
+import { HeroCinema } from "@/components/hero-cinema";
+import { CountUpStat } from "@/components/count-up-stat";
+
+export const metadata = buildPageMetadata({
+ title: "South Texas's Most Trusted Masonry Supply",
+ description:
+ "Providing premium brick, stone, and landscaping materials to Corpus Christi's contractors and homeowners since 1990.",
+ path: "/",
+});
+
+export default function Home() {
+ return (
+
+
+
+
+ {/* Hero Section */}
+
+
+
+
+ SINCE 1990
+
+
South Texas's Most Trusted Masonry Supply
+
+ Providing premium brick, stone, and landscaping materials to
+ Corpus Christi's contractors and homeowners with dependable
+ on-site delivery.
+
+
+
+
+ {[...Array(5)].map((_, i) => (
+
+
+
+ ))}
+
+
4.9 Stars (14 Google Reviews)
+
+
+
+
+ GET A FREE QUOTE
+
+
+ VIEW INVENTORY
+
+
+
+
+
+
+
+
+
+ {/* Quick Service Band */}
+
+
+
+
+
Phone
+ {siteConfig.phoneDisplay}
+
+
+
Address
+ {siteConfig.address.street}
+
+
+
Hours
+ Mon - Fri 8 AM - 5 PM
+
+
+
+
+
+ {/* Stats Band */}
+
+
+
+ {homeStats.map((stat, i) => (
+
+
+
+ ))}
+
+
+
+
+ {/* Product Categories */}
+
+
+
+
OUR PRODUCTS
+
Premium Materials for Any Project
+
+ From foundation to finish, we carry the materials you need for
+ professional masonry and landscaping results.
+
+
+
+
+
+
+
+
+
+
Masonry Supplies
+
+ Brick, concrete blocks, mortar, and lintels for structural and
+ aesthetic projects.
+
+
+ LEARN MORE →
+
+
+
+
+
+
+
+
+
Natural Stone
+
+ Flagstone, limestone, and decorative rock to elevate your
+ landscape and architecture.
+
+
+ LEARN MORE →
+
+
+
+
+
+
+
+
+
Tools & Materials
+
+ High-quality masonry tools, expansion joints, and sealers to
+ get the job done right.
+
+
+ LEARN MORE →
+
+
+
+
+
+
+
+ {/* Featured Products */}
+
+
+
+
+ IN STOCK NOW
+
Featured Masonry Products
+
+
+ VIEW FULL INVENTORY
+
+
+
+
+ {featuredMaterials.slice(0, 4).map((product, i) => (
+
+
+
+
+
+
+ {product.name}
+
+
+ Available for delivery
+
+
+
+ ))}
+
+
+
+
+ {/* Why Choose Us */}
+
+
+
+
+
THE SMS DIFFERENCE
+
Professional Supply, Personal Service
+
+ We aren't just a yard; we're your project partner. With over
+ 34 years of experience serving South Texas, we know our
+ materials and we know our customers.
+
+
+
+
+ 34+ YEARS
+
+ Experience in the Corpus Christi area.
+
+
+
+ RELIABLE DELIVERY
+
+ Dependable site drops when you need them.
+
+
+
+ OPEN TO PUBLIC
+
+ Serving both contractors and homeowners.
+
+
+
+ LOCAL EXPERTISE
+
+ Knowledgeable staff for all project types.
+
+
+
+
+
+
RELIABLE ON-SITE DELIVERY
+
+
+
+
+
+ {/* Process Section */}
+
+
+
+ OUR PROCESS
+
How to Get Your Materials
+
+
+
+
+
+ {/* Testimonials */}
+
+
+
+
+ WHAT CUSTOMERS SAY
+
Trusted by Corpus Christi
+
+
+
+
+
+
+ {/* FAQ Section */}
+
+
+
+ COMMON QUESTIONS
+
Frequently Asked Questions
+
+
+ {faqs.map((faq) => (
+
+
+ {faq.question}
+
+
+ {faq.answer}
+
+
+ ))}
+
+
+
+
+ {/* Call to Action with inline form */}
+
+
+ );
+}
diff --git a/app/products/page.tsx b/app/products/page.tsx
new file mode 100644
index 0000000..28bd391
--- /dev/null
+++ b/app/products/page.tsx
@@ -0,0 +1,169 @@
+import Image from "next/image";
+import Link from "next/link";
+import { redirect } from "next/navigation";
+import { Breadcrumbs } from "@/components/breadcrumbs";
+import { JsonLd } from "@/components/json-ld";
+import { breadcrumbSchema, buildPageMetadata, itemListSchema } from "@/lib/seo";
+
+export const metadata = buildPageMetadata({
+ title: "Masonry & Landscaping Supplies in Corpus Christi, TX",
+ description:
+ "Browse masonry supplies and landscaping supplies from Southern Masonry Supply in Corpus Christi, TX.",
+ path: "/products",
+ image: "/images/hero_main.png",
+});
+
+type ProductsPageProps = {
+ searchParams: Promise>;
+};
+
+function firstValue(value: string | string[] | undefined) {
+ return Array.isArray(value) ? value[0] : value;
+}
+
+export default async function ProductsPage({
+ searchParams,
+}: ProductsPageProps) {
+ const params = await searchParams;
+ const category = firstValue(params.category)?.toLowerCase();
+
+ if (category === "masonry" || category === "tools") {
+ redirect("/masonry-supplies#catalog");
+ }
+
+ if (
+ category === "stone" ||
+ category === "natural-stone" ||
+ category === "landscaping"
+ ) {
+ redirect("/landscaping-supplies#catalog");
+ }
+
+ const breadcrumbs = [
+ { name: "Home", path: "/" },
+ { name: "Products", path: "/products" },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
Masonry & Landscaping Supplies
+
Masonry & Landscaping Supplies
+
+ Southern Masonry Supply offers masonry supplies and landscaping
+ supplies in Corpus Christi, TX and surrounding cities. Browse the
+ catalog that matches your project and get in touch for delivery
+ information.
+
+
+
+
+
+
+
+
+
+
Masonry supplies
+
Masonry tools and bagged cement.
+
+ Browse masonry tools and bagged cement from Southern Masonry
+ Supply.
+
+
+ Masonry Tools
+ Bagged Cement
+ Get in Touch
+
+
+ Open masonry catalog
+
+
+
+
+
+
+
+
+
+
Natural stone
+
Flagstone, gravel, pebbles, and boulders.
+
+ Browse Mexico Beach Pebbles, Sand & Gravel, Flagstone,
+ and Boulders & Stone from Southern Masonry Supply.
+
+
+ Mexico Beach Pebbles
+ Flagstone
+ Sand & Gravel
+ Boulders & Stone
+
+
+ Open landscaping catalog
+
+
+
+
+
+
+
+ Delivery is also available and quoted at time of purchase. For
+ flagstone there is a minimum of one ton, and for landscaping
+ aggregates there is a 3 yard minimum.
+
+
+ Contact us
+
+
+
+
+ >
+ );
+}
diff --git a/app/robots.ts b/app/robots.ts
new file mode 100644
index 0000000..c8dc1d2
--- /dev/null
+++ b/app/robots.ts
@@ -0,0 +1,12 @@
+import type { MetadataRoute } from "next";
+import { buildAbsoluteUrl } from "@/lib/seo";
+
+export default function robots(): MetadataRoute.Robots {
+ return {
+ rules: {
+ userAgent: "*",
+ allow: "/",
+ },
+ sitemap: buildAbsoluteUrl("/sitemap.xml"),
+ };
+}
diff --git a/app/sitemap.ts b/app/sitemap.ts
new file mode 100644
index 0000000..db46a1f
--- /dev/null
+++ b/app/sitemap.ts
@@ -0,0 +1,20 @@
+import type { MetadataRoute } from "next";
+import { buildAbsoluteUrl } from "@/lib/seo";
+
+const routes = [
+ "/",
+ "/about",
+ "/products",
+ "/masonry-supplies",
+ "/landscaping-supplies",
+ "/contact",
+];
+
+export default function sitemap(): MetadataRoute.Sitemap {
+ return routes.map((route) => ({
+ url: buildAbsoluteUrl(route),
+ lastModified: new Date(),
+ changeFrequency: route === "/" ? "weekly" : "monthly",
+ priority: route === "/" ? 1 : 0.8,
+ }));
+}
diff --git a/components/brand-logo.tsx b/components/brand-logo.tsx
new file mode 100644
index 0000000..374fba1
--- /dev/null
+++ b/components/brand-logo.tsx
@@ -0,0 +1,12 @@
+export function BrandLogo({ className = "" }: { className?: string }) {
+ return (
+
+ Southern Masonry Supply
+
+
+ CORPUS CHRISTI, TX
+
+
+
+ );
+}
diff --git a/components/breadcrumbs.tsx b/components/breadcrumbs.tsx
new file mode 100644
index 0000000..e379ed6
--- /dev/null
+++ b/components/breadcrumbs.tsx
@@ -0,0 +1,24 @@
+import Link from "next/link";
+
+type BreadcrumbItem = {
+ name: string;
+ path: string;
+};
+
+export function Breadcrumbs({ items }: { items: BreadcrumbItem[] }) {
+ return (
+
+
+ {items.map((item, index) => {
+ const isLast = index === items.length - 1;
+
+ return (
+
+ {isLast ? {item.name} : {item.name}}
+
+ );
+ })}
+
+
+ );
+}
diff --git a/components/contact-form.tsx b/components/contact-form.tsx
new file mode 100644
index 0000000..9e69b53
--- /dev/null
+++ b/components/contact-form.tsx
@@ -0,0 +1,176 @@
+"use client";
+
+import { useSearchParams } from "next/navigation";
+import { FormEvent, useState } from "react";
+
+type ContactResponse = {
+ success: boolean;
+ message: string;
+ fieldErrors?: Record;
+};
+
+const projectOptions = [
+ { value: "", label: "Select a project type" },
+ { value: "masonry-supplies", label: "Masonry supplies" },
+ { value: "landscaping-supplies", label: "Landscaping supplies" },
+ { value: "delivery-quote", label: "Delivery quote" },
+ { value: "bulk-order", label: "Bulk order" },
+ { value: "general-question", label: "General question" },
+];
+
+export function ContactForm() {
+ const searchParams = useSearchParams();
+ const materialInterest = searchParams.get("material") ?? "";
+ const [formData, setFormData] = useState({
+ name: "",
+ phone: "",
+ email: "",
+ projectType: "",
+ message: "",
+ });
+ const [fieldErrors, setFieldErrors] = useState>({});
+ const [status, setStatus] = useState(null);
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ async function handleSubmit(event: FormEvent) {
+ event.preventDefault();
+ setIsSubmitting(true);
+ setStatus(null);
+ setFieldErrors({});
+
+ try {
+ const response = await fetch("/api/contact", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ ...formData,
+ materialInterest,
+ }),
+ });
+
+ const payload = (await response.json()) as ContactResponse;
+ setStatus(payload);
+ setFieldErrors(payload.fieldErrors ?? {});
+
+ if (payload.success) {
+ setFormData({
+ name: "",
+ phone: "",
+ email: "",
+ projectType: "",
+ message: "",
+ });
+ }
+ } catch {
+ setStatus({
+ success: false,
+ message: "Something went wrong while sending the form. Please call the yard directly.",
+ });
+ } finally {
+ setIsSubmitting(false);
+ }
+ }
+
+ return (
+
+ );
+}
diff --git a/components/count-up-stat.tsx b/components/count-up-stat.tsx
new file mode 100644
index 0000000..b047be5
--- /dev/null
+++ b/components/count-up-stat.tsx
@@ -0,0 +1,86 @@
+"use client";
+
+import { animate, useInView, useReducedMotion } from "framer-motion";
+import { useEffect, useMemo, useRef, useState } from "react";
+
+type CountUpStatProps = {
+ value: string;
+ label: string;
+};
+
+type ParsedValue = {
+ prefix: string;
+ target: number;
+ suffix: string;
+};
+
+const smoothEase = [0.22, 1, 0.36, 1] as const;
+
+function parseValue(value: string): ParsedValue | null {
+ const match = value.match(/^([^0-9]*)([\d,]+)(.*)$/);
+
+ if (!match) {
+ return null;
+ }
+
+ const [, prefix, rawNumber, suffix] = match;
+ const target = Number.parseInt(rawNumber.replace(/,/g, ""), 10);
+
+ if (Number.isNaN(target)) {
+ return null;
+ }
+
+ return { prefix, target, suffix };
+}
+
+function formatValue(parsed: ParsedValue, current: number) {
+ return `${parsed.prefix}${new Intl.NumberFormat("en-US").format(current)}${parsed.suffix}`;
+}
+
+export function CountUpStat({ value, label }: CountUpStatProps) {
+ const ref = useRef(null);
+ const isInView = useInView(ref, { once: true, amount: 0.45 });
+ const shouldReduceMotion = useReducedMotion();
+ const parsed = useMemo(() => parseValue(value), [value]);
+ const [displayValue, setDisplayValue] = useState(() =>
+ parsed ? formatValue(parsed, 0) : value,
+ );
+ const hasAnimated = useRef(false);
+
+ useEffect(() => {
+ if (!parsed) {
+ setDisplayValue(value);
+ return;
+ }
+
+ if (!isInView || hasAnimated.current) {
+ return;
+ }
+
+ hasAnimated.current = true;
+
+ if (shouldReduceMotion) {
+ setDisplayValue(formatValue(parsed, parsed.target));
+ return;
+ }
+
+ const controls = animate(0, parsed.target, {
+ duration: 1.4,
+ ease: smoothEase,
+ onUpdate(latest) {
+ setDisplayValue(formatValue(parsed, Math.round(latest)));
+ },
+ });
+
+ return () => {
+ controls.stop();
+ };
+ }, [isInView, parsed, shouldReduceMotion, value]);
+
+ return (
+
+ {displayValue}
+ {label}
+
+ );
+}
diff --git a/components/hero-cinema.tsx b/components/hero-cinema.tsx
new file mode 100644
index 0000000..b60ca86
--- /dev/null
+++ b/components/hero-cinema.tsx
@@ -0,0 +1,130 @@
+"use client";
+
+import { useEffect, useRef, useState } from "react";
+import Image from "next/image";
+import { siteConfig } from "@/data/site-content";
+
+const slides = [
+ {
+ src: "/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.webp",
+ alt: "Masonry Supply Yard",
+ },
+ {
+ src: "/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.webp",
+ alt: "Premium Masonry Materials",
+ },
+ {
+ src: "/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.webp",
+ alt: "Professional Masonry Project",
+ },
+ {
+ src: "/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.webp",
+ alt: "Contemporary Stone Architecture",
+ },
+];
+
+export function HeroCinema() {
+ const [current, setCurrent] = useState(0);
+ const [previous, setPrevious] = useState(null);
+ const currentRef = useRef(0);
+ const clearPreviousTimerRef = useRef(null);
+
+ function transitionTo(nextIndex: number) {
+ if (nextIndex === currentRef.current) {
+ return;
+ }
+
+ setPrevious(currentRef.current);
+ setCurrent(nextIndex);
+ currentRef.current = nextIndex;
+
+ if (clearPreviousTimerRef.current) {
+ window.clearTimeout(clearPreviousTimerRef.current);
+ }
+
+ clearPreviousTimerRef.current = window.setTimeout(() => {
+ setPrevious(null);
+ clearPreviousTimerRef.current = null;
+ }, 1400);
+ }
+
+ useEffect(() => {
+ const timer = window.setInterval(() => {
+ transitionTo((currentRef.current + 1) % slides.length);
+ }, 4500);
+
+ return () => {
+ window.clearInterval(timer);
+ if (clearPreviousTimerRef.current) {
+ window.clearTimeout(clearPreviousTimerRef.current);
+ }
+ };
+ }, []);
+
+ const renderedSlides =
+ previous === null
+ ? [current]
+ : [previous, current].filter(
+ (index, position, values) => values.indexOf(index) === position,
+ );
+
+ return (
+
+ {renderedSlides.map((index) => {
+ const slide = slides[index];
+ const isCurrent = index === current;
+
+ return (
+
+
+
+ );
+ })}
+
+
+
+
+ {slides.map((_, i) => (
+ transitionTo(i)}
+ aria-label={`Show image ${i + 1}`}
+ />
+ ))}
+
+
+
+
+
+
+
+
LIVE FROM THE YARD
+
+
+ );
+}
diff --git a/components/home-cta-section.tsx b/components/home-cta-section.tsx
new file mode 100644
index 0000000..ec9f250
--- /dev/null
+++ b/components/home-cta-section.tsx
@@ -0,0 +1,136 @@
+"use client";
+
+import { FormEvent, useState } from "react";
+import Link from "next/link";
+import { motion } from "framer-motion";
+import { siteConfig } from "@/data/site-content";
+
+type Status = { success: boolean; message: string } | null;
+
+export function HomeCTASection() {
+ const [formData, setFormData] = useState({ name: "", phone: "", message: "" });
+ const [status, setStatus] = useState(null);
+ const [submitting, setSubmitting] = useState(false);
+
+ async function handleSubmit(e: FormEvent) {
+ e.preventDefault();
+ setSubmitting(true);
+ setStatus(null);
+ try {
+ const res = await fetch("/api/contact", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ ...formData, email: "", projectType: "general-question" }),
+ });
+ const data = await res.json() as { success: boolean; message: string };
+ setStatus(data);
+ if (data.success) setFormData({ name: "", phone: "", message: "" });
+ } catch {
+ setStatus({ success: false, message: "Something went wrong. Please call us directly." });
+ } finally {
+ setSubmitting(false);
+ }
+ }
+
+ return (
+
+
+
+ {/* Left — copy */}
+
+ GET STARTED
+ Ready to Start Your Project?
+
+ Visit our yard or drop us a message. We'll get back to you with the right
+ materials, quantities, and delivery details.
+
+
+
+ Full Contact Page
+
+
+
+ {/* Right — quick form */}
+
+
+
Send a Quick Message
+
+ We'll respond during business hours.
+
+
+ {status?.success ? (
+
+ ) : (
+
+
+ setFormData((p) => ({ ...p, name: e.target.value }))}
+ className="home-cta-input"
+ />
+ setFormData((p) => ({ ...p, phone: e.target.value }))}
+ className="home-cta-input"
+ />
+
+ setFormData((p) => ({ ...p, message: e.target.value }))}
+ className="home-cta-input home-cta-textarea"
+ />
+ {status && !status.success && (
+ {status.message}
+ )}
+
+ {submitting ? "Sending…" : "Send Message →"}
+
+
+ )}
+
+
+
+
+
+ );
+}
diff --git a/components/json-ld.tsx b/components/json-ld.tsx
new file mode 100644
index 0000000..22a1387
--- /dev/null
+++ b/components/json-ld.tsx
@@ -0,0 +1,15 @@
+export function JsonLd({
+ id,
+ data,
+}: {
+ id: string;
+ data: Record;
+}) {
+ return (
+
+ );
+}
diff --git a/components/material-catalog.tsx b/components/material-catalog.tsx
new file mode 100644
index 0000000..1250a1c
--- /dev/null
+++ b/components/material-catalog.tsx
@@ -0,0 +1,159 @@
+"use client";
+
+import Image from "next/image";
+import Link from "next/link";
+import { useState } from "react";
+import type { MaterialItem } from "@/data/site-content";
+
+type MaterialCatalogProps = {
+ heroImage: string;
+ intro: string;
+ deliveryNote: string;
+ materials: MaterialItem[];
+};
+
+export function MaterialCatalog({
+ heroImage,
+ intro,
+ deliveryNote,
+ materials,
+}: MaterialCatalogProps) {
+ const [selectedSubcategories, setSelectedSubcategories] = useState(
+ [],
+ );
+
+ const subcategories = Array.from(
+ new Set(materials.map((material) => material.subcategory)),
+ ).sort((left, right) => left.localeCompare(right));
+
+ const filteredMaterials =
+ selectedSubcategories.length === 0
+ ? materials
+ : materials.filter((material) =>
+ selectedSubcategories.includes(material.subcategory),
+ );
+
+ function toggleFilter(subcategory: string) {
+ setSelectedSubcategories((current) =>
+ current.includes(subcategory)
+ ? current.filter((value) => value !== subcategory)
+ : [...current, subcategory],
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
Project-ready inventory
+
Materials organized for faster quoting.
+
{intro}
+
+
+
+
+
+ Showing {filteredMaterials.length}{" "}
+ {filteredMaterials.length === 1 ? "material" : "materials"}
+
+
+ {selectedSubcategories.map((subcategory) => (
+
+ {subcategory}
+
+ ))}
+
+
+
+ {filteredMaterials.length > 0 ? (
+
+ {filteredMaterials.map((material) => (
+
+
+
+
+
+
{material.subcategory}
+
{material.name}
+
{material.description}
+
+
+ {material.purchaseUnit}
+
+
+ Request quote
+
+
+
+
+ ))}
+
+ ) : (
+
+
No materials match that filter yet.
+
Clear the filters to see the full inventory list again.
+
+ )}
+
+
+
+ );
+}
diff --git a/components/motion-section.tsx b/components/motion-section.tsx
new file mode 100644
index 0000000..c191fab
--- /dev/null
+++ b/components/motion-section.tsx
@@ -0,0 +1,35 @@
+"use client";
+
+import { motion } from "framer-motion";
+import type { ReactNode } from "react";
+
+type Props = {
+ children: ReactNode;
+ className?: string;
+ delay?: number;
+ direction?: "up" | "left" | "right" | "none";
+};
+
+const smoothEase = [0.16, 1, 0.3, 1] as const;
+
+const variants = {
+ up: { hidden: { opacity: 0, y: 32 }, visible: { opacity: 1, y: 0 } },
+ left: { hidden: { opacity: 0, x: -32 }, visible: { opacity: 1, x: 0 } },
+ right: { hidden: { opacity: 0, x: 32 }, visible: { opacity: 1, x: 0 } },
+ none: { hidden: { opacity: 0 }, visible: { opacity: 1 } },
+};
+
+export function MotionSection({ children, className = "", delay = 0, direction = "up" }: Props) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/components/page-hero-motion.tsx b/components/page-hero-motion.tsx
new file mode 100644
index 0000000..f52df29
--- /dev/null
+++ b/components/page-hero-motion.tsx
@@ -0,0 +1,76 @@
+"use client";
+
+import { motion } from "framer-motion";
+import type { ReactNode } from "react";
+
+const smoothEase = [0.16, 1, 0.3, 1] as const;
+
+const fadeUp = (delay = 0) => ({
+ initial: { opacity: 0, y: 28 },
+ animate: { opacity: 1, y: 0 },
+ transition: { duration: 0.6, ease: smoothEase, delay },
+});
+
+export function PageHeroMotion({ children }: { children: ReactNode }) {
+ return <>{children}>;
+}
+
+export function FadeUp({
+ children,
+ delay = 0,
+ className = "",
+}: {
+ children: ReactNode;
+ delay?: number;
+ className?: string;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function FadeIn({
+ children,
+ delay = 0,
+ className = "",
+}: {
+ children: ReactNode;
+ delay?: number;
+ className?: string;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function SlideIn({
+ children,
+ delay = 0,
+ direction = "left",
+ className = "",
+}: {
+ children: ReactNode;
+ delay?: number;
+ direction?: "left" | "right";
+ className?: string;
+}) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/components/process-timeline.tsx b/components/process-timeline.tsx
new file mode 100644
index 0000000..c3a082a
--- /dev/null
+++ b/components/process-timeline.tsx
@@ -0,0 +1,133 @@
+"use client";
+
+import type { CSSProperties } from "react";
+import { useEffect, useMemo, useRef, useState } from "react";
+import type { ProcessStep } from "@/data/site-content";
+
+type ProcessTimelineProps = {
+ steps: ProcessStep[];
+};
+
+function clamp(value: number, min: number, max: number) {
+ return Math.min(Math.max(value, min), max);
+}
+
+export function ProcessTimeline({ steps }: ProcessTimelineProps) {
+ const sectionRef = useRef(null);
+ const stepRefs = useRef>([]);
+ const [activeIndex, setActiveIndex] = useState(0);
+ const [progress, setProgress] = useState(0);
+
+ const markers = useMemo(() => steps.map((step) => step.step), [steps]);
+
+ useEffect(() => {
+ function updateTimeline() {
+ const section = sectionRef.current;
+
+ if (!section) {
+ return;
+ }
+
+ const sectionRect = section.getBoundingClientRect();
+ const viewportAnchor = window.innerHeight * 0.42;
+ const rawProgress =
+ (viewportAnchor - sectionRect.top) /
+ Math.max(sectionRect.height - window.innerHeight * 0.3, 1);
+
+ setProgress(clamp(rawProgress, 0, 1));
+
+ let closestIndex = 0;
+ let closestDistance = Number.POSITIVE_INFINITY;
+
+ stepRefs.current.forEach((stepNode, index) => {
+ if (!stepNode) {
+ return;
+ }
+
+ const rect = stepNode.getBoundingClientRect();
+ const center = rect.top + rect.height / 2;
+ const distance = Math.abs(center - viewportAnchor);
+
+ if (distance < closestDistance) {
+ closestDistance = distance;
+ closestIndex = index;
+ }
+ });
+
+ setActiveIndex(closestIndex);
+ }
+
+ updateTimeline();
+
+ let frame = 0;
+
+ function onScrollOrResize() {
+ cancelAnimationFrame(frame);
+ frame = window.requestAnimationFrame(updateTimeline);
+ }
+
+ window.addEventListener("scroll", onScrollOrResize, { passive: true });
+ window.addEventListener("resize", onScrollOrResize);
+
+ return () => {
+ cancelAnimationFrame(frame);
+ window.removeEventListener("scroll", onScrollOrResize);
+ window.removeEventListener("resize", onScrollOrResize);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+ {markers.map((marker, index) => (
+
+ ))}
+
+
+
+
+ {steps.map((step, index) => {
+ const sideClass = index % 2 === 0 ? "is-right" : "is-left";
+ const isActive = index <= activeIndex;
+
+ return (
+
{
+ stepRefs.current[index] = node;
+ }}
+ className={`process-row ${sideClass} ${
+ isActive ? "is-active" : ""
+ }`}
+ >
+
+
+
+ {step.step}
+ {step.title}
+ {step.description}
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/components/scroll-reveal.tsx b/components/scroll-reveal.tsx
new file mode 100644
index 0000000..5cfe8d8
--- /dev/null
+++ b/components/scroll-reveal.tsx
@@ -0,0 +1,29 @@
+"use client";
+
+import { useEffect } from "react";
+
+export function ScrollReveal() {
+ useEffect(() => {
+ const observerOptions = {
+ threshold: 0.1,
+ rootMargin: "0px 0px -50px 0px",
+ };
+
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ if (entry.isIntersecting) {
+ entry.target.classList.add("active");
+ }
+ });
+ }, observerOptions);
+
+ const revealElements = document.querySelectorAll(".reveal");
+ revealElements.forEach((el) => observer.observe(el));
+
+ return () => {
+ revealElements.forEach((el) => observer.unobserve(el));
+ };
+ }, []);
+
+ return null;
+}
diff --git a/components/site-footer.tsx b/components/site-footer.tsx
new file mode 100644
index 0000000..e15cb22
--- /dev/null
+++ b/components/site-footer.tsx
@@ -0,0 +1,98 @@
+import Link from "next/link";
+import { siteConfig } from "@/data/site-content";
+import { BrandLogo } from "@/components/brand-logo";
+
+export function SiteFooter() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ South Texas's premier masonry and landscaping supply yard. Providing
+ dependable stock, expert advice, and professional delivery since 1990.
+
+
+
+ ADDRESS
+ {siteConfig.address.street}, {siteConfig.address.cityStateZip}
+
+
+
+ HOURS
+ Mon – Fri 8 AM – 5 PM
+
+
+
+
+ {siteConfig.footerGroups.map((group) => (
+
+
{group.title}
+
+ {group.links.map((link) => (
+
+
+ {link.label}
+
+
+ ))}
+
+
+ ))}
+
+ {/* Map column */}
+
+
Find Us
+
+
+
+
+ Open in Google Maps →
+
+
+
+
+
+
+
+ © {new Date().getFullYear()} {siteConfig.name}. All Rights Reserved.
+
+
+ {siteConfig.socials.map((social) => (
+
+ {social.label}
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/components/site-header.tsx b/components/site-header.tsx
new file mode 100644
index 0000000..1f0432d
--- /dev/null
+++ b/components/site-header.tsx
@@ -0,0 +1,100 @@
+"use client";
+
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import { siteConfig } from "@/data/site-content";
+import { BrandLogo } from "@/components/brand-logo";
+
+export function SiteHeader() {
+ const [menuOpen, setMenuOpen] = useState(false);
+ const [scrolled, setScrolled] = useState(false);
+ const close = () => setMenuOpen(false);
+
+ useEffect(() => {
+ const handler = () => setScrolled(window.scrollY > 60);
+ window.addEventListener("scroll", handler, { passive: true });
+ return () => window.removeEventListener("scroll", handler);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+ DELIVERY QUOTED AT PURCHASE
+
+ OPEN MAP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {siteConfig.nav.map((item) => (
+
+ {item.label}
+
+ ))}
+
+
+
+
+ REQUEST A QUOTE
+
+
+
+
setMenuOpen((o) => !o)}
+ >
+
+
+
+
+
+
+
+
+
+ {/* Mobile drawer */}
+
+
+ {siteConfig.nav.map((item) => (
+
+ {item.label}
+
+ ))}
+
+ REQUEST A QUOTE
+
+
+
+
+ {/* Backdrop */}
+ {menuOpen && (
+
+ )}
+ >
+ );
+}
diff --git a/components/testimonials-carousel.tsx b/components/testimonials-carousel.tsx
new file mode 100644
index 0000000..e0c5df6
--- /dev/null
+++ b/components/testimonials-carousel.tsx
@@ -0,0 +1,76 @@
+"use client";
+
+import { motion } from "framer-motion";
+
+type Review = {
+ name: string;
+ rating: string;
+ dateLabel: string;
+ quote: string;
+};
+
+type Props = {
+ reviews: Review[];
+};
+
+function StarRating({ rating }: { rating: string }) {
+ const score = parseFloat(rating);
+ const full = Math.floor(score);
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ★
+
+ ))}
+
+ );
+}
+
+function ReviewCard({ review }: { review: Review }) {
+ return (
+
+
+
+ {review.dateLabel}
+
+ "{review.quote}"
+
+
+ );
+}
+
+export function TestimonialsCarousel({ reviews }: Props) {
+ // Triple the items for a seamless infinite loop at any scroll speed
+ const tripled = [...reviews, ...reviews, ...reviews];
+
+ return (
+
+
+
+ {tripled.map((review, i) => (
+
+
+
+ ))}
+
+
+
+ {/* Edge fade overlays */}
+
+
+
+ );
+}
diff --git a/content_audit.md b/content_audit.md
new file mode 100644
index 0000000..ec4d478
--- /dev/null
+++ b/content_audit.md
@@ -0,0 +1,15 @@
+# Content Accuracy Audit: Southern Masonry Supply
+
+## Comparison: `info.md` vs. Current Website
+
+| Category | Source of Truth (`info.md`) | Current Website / Code | Match? |
+| :--- | :--- | :--- | :--- |
+| **Location** | 5205 Agnes St, Corpus Christi, TX 78405 | [TBD] | [TBD] |
+| **Phone** | (361) 289-1074 | [TBD] | [TBD] |
+| **Years of Service** | Since 1990 (36 years as of 2026) | [TBD] | [TBD] |
+| **Service Area** | Corpus Christi, TX and surroundings | [TBD] | [TBD] |
+| **Owner** | Sid Smith Jr. | [TBD] | [TBD] |
+
+## Discrepancies Found
+- [ ] Verify "Upstate South Carolina" claim.
+- [ ] Verify "30+ years" claim on website.
diff --git a/data/site-content.ts b/data/site-content.ts
new file mode 100644
index 0000000..b2086a9
--- /dev/null
+++ b/data/site-content.ts
@@ -0,0 +1,1225 @@
+export type NavItem = {
+ label: string;
+ href: string;
+};
+
+export type FooterGroup = {
+ title: string;
+ links: NavItem[];
+};
+
+export type MaterialItem = {
+ slug: string;
+ name: string;
+ category: "masonry" | "landscaping";
+ subcategory: string;
+ image: string;
+ description: string;
+ purchaseUnit: string;
+ availabilityNote?: string;
+ featured: boolean;
+ tags: string[];
+};
+
+export type ReviewItem = {
+ name: string;
+ rating: string;
+ dateLabel: string;
+ quote: string;
+};
+
+export type ProcessStep = {
+ step: string;
+ title: string;
+ description: string;
+};
+
+export const siteConfig = {
+ name: "Southern Masonry Supply",
+ siteUrl: "https://www.southernmasonrysupply.com",
+ description:
+ "Southern Masonry Supply is a family-owned-and-operated business serving Corpus Christi, TX and its surrounding cities since 1990.",
+ cityRegion: "Corpus Christi, TX",
+ brand: {
+ primaryLogo: "/logo_v2.png",
+ alt: "Southern Masonry Supply, Corpus Christi, TX",
+ },
+ heroMedia: {
+ featureCardVideo: "/herosection/Flow_delpmaspu_.mp4",
+ featureCardImage:
+ "/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.webp",
+ featureCardAlt: "Southern Masonry Supply yard overview",
+ },
+ phoneDisplay: "(361) 289-1074",
+ phoneHref: "tel:+13612891074",
+ defaultOgImage: "/images/hero_main.png",
+ mapUrl:
+ "https://www.google.com/maps/search/?api=1&query=5205+Agnes+St+Corpus+Christi+TX+78405",
+ address: {
+ street: "5205 Agnes St",
+ cityStateZip: "Corpus Christi, TX 78405",
+ },
+ hours: [
+ { label: "Monday - Friday", value: "8 AM - 5 PM" },
+ { label: "Saturday", value: "Closed" },
+ { label: "Sunday", value: "Closed" },
+ ],
+ socials: [
+ {
+ label: "Facebook",
+ href: "https://www.facebook.com/southernmasonrysupply/",
+ },
+ {
+ label: "Instagram",
+ href: "https://www.instagram.com/southernmasonrysupply/",
+ },
+ ],
+ nav: [
+ { label: "Home", href: "/" },
+ { label: "Products", href: "/products" },
+ { label: "Masonry Supplies", href: "/masonry-supplies" },
+ { label: "Landscaping Supplies", href: "/landscaping-supplies" },
+ { label: "About", href: "/about" },
+ { label: "Contact", href: "/contact" },
+ ] satisfies NavItem[],
+ footerGroups: [
+ {
+ title: "Explore",
+ links: [
+ { label: "Home", href: "/" },
+ { label: "Products", href: "/products" },
+ { label: "About", href: "/about" },
+ { label: "Contact", href: "/contact" },
+ ],
+ },
+ {
+ title: "Products",
+ links: [
+ { label: "Masonry Supplies", href: "/masonry-supplies" },
+ { label: "Landscaping Supplies", href: "/landscaping-supplies" },
+ { label: "Delivery Information", href: "/contact" },
+ ],
+ },
+ {
+ title: "Follow",
+ links: [
+ {
+ label: "Facebook",
+ href: "https://www.facebook.com/southernmasonrysupply/",
+ },
+ {
+ label: "Instagram",
+ href: "https://www.instagram.com/southernmasonrysupply/",
+ },
+ ],
+ },
+ ] satisfies FooterGroup[],
+};
+
+export const homeStats = [
+ { value: "34+", label: "Years Serving South Texas" },
+ { value: "1,000+", label: "Satisfied Customers" },
+ { value: "Large", label: "Product Selection" },
+ { value: "Fast & Direct", label: "Quote Turnaround" },
+];
+
+export const trustPillars = [
+ {
+ icon: "◎",
+ title: "Local sourcing insight",
+ description:
+ "We stock materials sourced in the United States and Mexico to keep quality high and selections practical.",
+ },
+ {
+ icon: "▲",
+ title: "Expert project advice",
+ description:
+ "Our team helps you choose from masonry tools, flagstone, pebbles, and aggregates based on application and finish.",
+ },
+ {
+ icon: "↗",
+ title: "Reliable delivery support",
+ description:
+ "Delivery is available and quoted at time of purchase, with clear minimums for flagstone and landscaping aggregates.",
+ },
+];
+
+export const categoryHighlights = [
+ {
+ eyebrow: "Masonry",
+ title: "Tools, cement, and the essentials that keep crews moving.",
+ description:
+ "Bagged cement, masonry tools, and ready-to-quote supply options for project phases that cannot afford downtime.",
+ href: "/masonry-supplies",
+ image: "/images/masonry_tools_display_png_1773134531475.webp",
+ },
+ {
+ eyebrow: "Landscaping",
+ title: "Flagstone, pebbles, aggregates, and natural stone with range.",
+ description:
+ "Landscape material options from decomposed granite to Mexico pebbles and Arkansas or Oklahoma flagstone.",
+ href: "/landscaping-supplies",
+ image: "/images/flagstone_pathway_garden_png_1773134755795.webp",
+ },
+];
+
+export const serviceHighlights = [
+ {
+ title: "Masonry tools and cement",
+ description:
+ "Bagged cement, core tools, and quote-ready materials for jobs that need dependable turnaround.",
+ },
+ {
+ title: "Landscape stone and aggregates",
+ description:
+ "Pebbles, decomposed granite, sand, gravel, flagstone, and statement stone for outdoor projects.",
+ },
+ {
+ title: "Contractor-friendly support",
+ description:
+ "We keep the conversation practical around finish, quantity, and timing instead of generic product talk.",
+ },
+ {
+ title: "Clear delivery thresholds",
+ description:
+ "Flagstone starts at one ton and landscaping aggregates start at three yards for delivery.",
+ },
+ {
+ title: "Helpful yard pickup guidance",
+ description:
+ "Homeowners and crews both get straightforward advice on what to load, how much to buy, and what to expect.",
+ },
+];
+
+export const googleReviews: ReviewItem[] = [
+ {
+ name: "Josh Jimenez",
+ rating: "5/5",
+ dateLabel: "9 months ago",
+ quote:
+ "Very professional. My second time using them and I highly recommend the business. Questions were answered quickly and delivery was exactly as promised.",
+ },
+ {
+ name: "Dana",
+ rating: "5/5",
+ dateLabel: "3 years ago",
+ quote:
+ "I highly recommend this establishment. Alfonso went above and beyond helping find the right rocks for the project.",
+ },
+ {
+ name: "Deborah Pena",
+ rating: "5/5",
+ dateLabel: "4 years ago",
+ quote:
+ "My son had been looking all over town for brick. The sales rep was great, the prices were amazing, and they came back for more materials to finish the project.",
+ },
+ {
+ name: "Patty Beasley",
+ rating: "5/5",
+ dateLabel: "5 years ago",
+ quote:
+ "A wonderful place with assortments of beautiful stone that are hard to find at other local or regional landscapers.",
+ },
+ {
+ name: "Lucy",
+ rating: "4/5",
+ dateLabel: "4 months ago",
+ quote:
+ "A bit expensive compared to other places, but the workers were really nice and helpful.",
+ },
+ {
+ name: "Joe Helgerson",
+ rating: "5/5",
+ dateLabel: "2 years ago",
+ quote:
+ "Wide selection of landscaping stone. Easy to work with and competitive pricing.",
+ },
+];
+
+export const processSteps: ProcessStep[] = [
+ {
+ step: "01",
+ title: "Tell us what the job needs",
+ description:
+ "Call, stop by, or send a request with the material type, approximate quantity, and whether pickup or delivery makes more sense.",
+ },
+ {
+ step: "02",
+ title: "Get material guidance",
+ description:
+ "We help narrow the options based on application, finish, and load size so you are not guessing between similar products.",
+ },
+ {
+ step: "03",
+ title: "Confirm quantity and routing",
+ description:
+ "The team confirms purchase units, delivery minimums, and destination-based freight details before anything is scheduled.",
+ },
+ {
+ step: "04",
+ title: "Load out or dispatch delivery",
+ description:
+ "Yard pickups move quickly and delivery orders are staged for the timing and thresholds discussed at purchase.",
+ },
+ {
+ step: "05",
+ title: "Finish with confidence",
+ description:
+ "You leave with the right material, a clear plan for the next phase, and a local yard you can call back when the scope grows.",
+ },
+];
+
+export const deliveryHighlights = [
+ {
+ title: "Flagstone delivery",
+ description:
+ "Delivery service for flagstone starts at a one-ton minimum.",
+ },
+ {
+ title: "Landscaping aggregates",
+ description:
+ "Aggregates require a three-yard minimum for delivery service.",
+ },
+ {
+ title: "Quoted by destination",
+ description:
+ "Delivery charges depend on where materials need to go and are quoted at time of purchase.",
+ },
+];
+
+export const buildStory = [
+ {
+ eyebrow: "What we do",
+ title: "A yard built for masonry and landscaping work.",
+ copy:
+ "Southern Masonry Supply is a family-owned-and-operated business that offers a large selection of masonry products and tools. We have proudly served Corpus Christi and surrounding cities since 1990.",
+ },
+ {
+ eyebrow: "How we operate",
+ title: "Fast stock support and dependable service.",
+ copy:
+ "We take pride in customer service and do our best to keep products in stock for fast delivery, smoother pickups, and fewer surprises once your project is underway.",
+ },
+ {
+ eyebrow: "Why it matters",
+ title: "Materials chosen for durability, not guesswork.",
+ copy:
+ "We offer products sourced in the United States and Mexico so contractors, designers, and homeowners can choose materials with confidence and get practical guidance during the purchase process.",
+ },
+];
+
+export const aboutHighlights = [
+ {
+ icon: "◌",
+ title: "Family-owned attention",
+ description:
+ "The yard runs with a hands-on, local-business mindset focused on helpful service instead of anonymous transactions.",
+ },
+ {
+ icon: "✦",
+ title: "Strong regional selection",
+ description:
+ "Core categories include masonry tools, flagstone, decomposed granite, pebbles, sand, gravel, and boulders.",
+ },
+ {
+ icon: "↺",
+ title: "Flexible buying formats",
+ description:
+ "Ground cover can be purchased by the shovel, by the pound, by the yard, or by bulk bag depending on the material.",
+ },
+];
+
+export const masonryCategory = {
+ title: "Masonry supplies for work that needs to stay on schedule.",
+ description:
+ "From bagged cement to core tools, our masonry catalog keeps the essentials organized for fast quoting and easy follow-up.",
+ intro:
+ "Use the filters to narrow down masonry tools and cement options. Every product card points directly into the contact flow for quoting.",
+ deliveryNote:
+ "Need delivery? Reach out with the material, quantity, and job timing so we can confirm availability and routing.",
+ heroImage: "/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.webp",
+};
+
+export const landscapingCategory = {
+ title: "Landscaping supplies with natural color, texture, and buying flexibility.",
+ description:
+ "Browse pebbles, flagstone, granite, sand, gravel, and boulders suited for both decorative and hardscape applications.",
+ intro:
+ "The landscaping catalog is structured by material type so you can quickly move from inspiration to a concrete quote request.",
+ deliveryNote:
+ "Landscaping aggregate delivery starts at three yards, and destination-based delivery pricing is quoted at purchase time.",
+ heroImage: "/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.webp",
+};
+
+export const masonryMaterials: MaterialItem[] = [
+ {
+ slug: "jag-clamp-line-stretcher",
+ name: "JAG Clamp Line Stretcher",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/2-1024x5771.jpg",
+ description:
+ "Award-winning line stretcher system that clamps directly to brick or block for safe, accurate course layout.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current tool availability.",
+ featured: true,
+ tags: ["tools"],
+ },
+ {
+ slug: "crick-level",
+ name: "Crick Level",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_083544-1024x5762.jpg",
+ description:
+ "Professional wood-frame mason's level built for accurate plumb and level readings on block and brick work.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current tool availability.",
+ featured: true,
+ tags: ["tools", "levels"],
+ },
+ {
+ slug: "hard-hats",
+ name: "Hard Hats",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_083757-1024x5763.jpg",
+ description:
+ "OSHA-compliant jobsite hard hats including Texas and American flag styles for crew safety on every project.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current availability.",
+ featured: false,
+ tags: ["tools", "safety"],
+ },
+ {
+ slug: "masons-line",
+ name: "Mason's Line",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_083933-1024x5764.jpg",
+ description:
+ "Braided nylon mason's line for course layout and alignment — available in high-visibility colors from W. Rose.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current availability.",
+ featured: true,
+ tags: ["tools", "line"],
+ },
+ {
+ slug: "marking-chalk",
+ name: "Marking Chalk",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_095116-1024x5765.jpg",
+ description:
+ "Keson ultra-fine marking chalk in red and blue for snapping precise layout lines on masonry and concrete surfaces.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current availability.",
+ featured: false,
+ tags: ["tools", "marking"],
+ },
+ {
+ slug: "torpedo-level",
+ name: "Torpedo Level",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_095340-1024x5766.jpg",
+ description:
+ "Magnetic torpedo levels for quick horizontal and vertical checks — available in 8 in. and 9 in. sizes.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current availability.",
+ featured: false,
+ tags: ["tools", "levels"],
+ },
+ {
+ slug: "carpenter-pencils",
+ name: "Carpenter Pencils",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_100250-1024x5767.jpg",
+ description:
+ "Bon flat carpenter pencils with strong flat lead — stocked in both red and black lead for jobsite marking.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current availability.",
+ featured: false,
+ tags: ["tools", "marking"],
+ },
+ {
+ slug: "marking-crayons-accessories",
+ name: "Marking Crayons & Accessories",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20191106_100308-1024x5768.jpg",
+ description:
+ "Col-Erase pencils, pencil clips, and marking crayons in red, blue, and yellow for all layout and field marking needs.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current availability.",
+ featured: false,
+ tags: ["tools", "marking"],
+ },
+ {
+ slug: "crick-level-full-size",
+ name: "Crick Level — Full Size",
+ category: "masonry",
+ subcategory: "Masonry Tools",
+ image: "/masonrytools/thumbnail_20210913_0953139.jpg",
+ description:
+ "Full-size Crick mason's levels stocked in multiple lengths for every stage of block and brick installation.",
+ purchaseUnit: "Quoted by item",
+ availabilityNote: "Call for current tool availability.",
+ featured: true,
+ tags: ["tools", "levels"],
+ },
+ // ── Bagged Cement ──────────────────────────────────────────────────────────
+ {
+ slug: "alamo-masonry-cement-pallet",
+ name: "Alamo Masonry Cement — Pallet Stack",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/124621322_1044010109369867_1789124923342669301_n-1024x760.jpg",
+ description:
+ "Full palletized stack of Alamo masonry cement. Reliable base mix for block and brick construction across San Antonio.",
+ purchaseUnit: "Quoted by pallet or bag",
+ availabilityNote: "Call for current stock and pricing.",
+ featured: true,
+ tags: ["cement", "bagged", "alamo"],
+ },
+ {
+ slug: "alamo-masonry-cement-type-s-orange",
+ name: "Alamo Masonry Cement — Type S (Orange Bag)",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/124633699_794688728042730_8896789977779663103_n-1024x926.jpg",
+ description:
+ "High-strength Type S masonry cement in the distinctive orange bag. Preferred for structural load-bearing walls and below-grade work.",
+ purchaseUnit: "Quoted by bag or pallet",
+ availabilityNote: "Call for current stock and pricing.",
+ featured: true,
+ tags: ["cement", "bagged", "alamo", "type-s"],
+ },
+ {
+ slug: "alamo-white-portland-cement",
+ name: "Alamo White Portland Cement",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/341181804_751803226560427_305481664816712952_n.jpg",
+ description:
+ "Alamo White Portland cement for architectural concrete and decorative masonry where a bright, white finish is required.",
+ purchaseUnit: "Quoted by bag or pallet",
+ availabilityNote: "Call for current stock and pricing.",
+ featured: false,
+ tags: ["cement", "bagged", "alamo", "white", "portland"],
+ },
+ {
+ slug: "alamo-masonry-cement-bag",
+ name: "Alamo Masonry Cement — Single Bag",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/341230370_168526982801018_5550882254119213617_n.jpg",
+ description:
+ "Standard 70lb Alamo masonry cement bag. The reliable standard for masonry projects in the San Antonio area.",
+ purchaseUnit: "Quoted by bag",
+ availabilityNote: "In-stock for immediate pickup.",
+ featured: false,
+ tags: ["cement", "bagged", "alamo"],
+ },
+ {
+ slug: "alamo-white-masonry-cement",
+ name: "Alamo White Masonry Cement",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/341646099_182080524652887_1302135867891546997_n.jpg",
+ description:
+ "Alamo specialty white masonry cement (Type N) for light-colored mortar joints and architectural block applications.",
+ purchaseUnit: "Quoted by bag or pallet",
+ availabilityNote: "Call for color-matching and bulk orders.",
+ featured: true,
+ tags: ["cement", "bagged", "alamo", "white", "masonry"],
+ },
+ {
+ slug: "alamo-portland-limestone-type-il",
+ name: "Alamo Portland-Limestone Cement — Type IL",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/thumbnail_20220811_103223.jpg",
+ description:
+ "Type IL Portland-Limestone cement (92.6 lb). A blended cement eco-alternative providing strong set performance with reduced CO2 footprint.",
+ purchaseUnit: "Quoted by bag or pallet",
+ availabilityNote: "Call for availability.",
+ featured: true,
+ tags: ["cement", "bagged", "alamo", "type-il", "ecofriendly"],
+ },
+ {
+ slug: "alamo-masonry-cement-stock",
+ name: "Alamo Masonry Cement — Large Stock",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/thumbnail_20220811_103245.jpg",
+ description:
+ "Extended yard stock of Alamo masonry cement. We maintain high inventory levels for large commercial projects.",
+ purchaseUnit: "Quoted by pallet",
+ availabilityNote: "Large orders always welcome.",
+ featured: false,
+ tags: ["cement", "bagged", "alamo"],
+ },
+ {
+ slug: "alamo-white-portland-type-1",
+ name: "Alamo White Portland Cement — Type 1",
+ category: "masonry",
+ subcategory: "Bagged Cement",
+ image: "/baggedcement/thumbnail_20220811_103305.jpg",
+ description:
+ "Alamo White Portland Cement Type 1. Premium high-purity architectural cement for custom precast, cast-in-place, and decorative work.",
+ purchaseUnit: "Quoted by bag or pallet",
+ availabilityNote: "Call for commercial volume pricing.",
+ featured: true,
+ tags: ["cement", "bagged", "alamo", "white-portland", "type-1"],
+ },
+];
+
+export const landscapingMaterials: MaterialItem[] = [
+ // ── Mexico Beach Pebbles ───────────────────────────────────────────────────
+ {
+ slug: "mexico-beach-pebbles-multicolor-1-2",
+ name: "1\" - 2\" Mexico Beach Pebbles Multicolor",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/280782259_3262766134007984_7989147786748639370_n.jpg",
+ description:
+ "Rounded 1\"–2\" multicolor pebbles in natural tones of tan, purple, gray, and red. Ideal for decorative beds and hardscape borders.",
+ purchaseUnit: "Quoted by pound, yard, or bulk bag",
+ featured: true,
+ tags: ["pebbles", "mexico-pebbles", "multicolor"],
+ },
+ {
+ slug: "mexico-beach-pebbles-large-multicolor",
+ name: "Mexico Beach Pebbles — Large Multicolor",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/thumbnail_20200819_135939.jpg",
+ description:
+ "Larger-sized Mexico Beach pebbles in a full range of natural colors. Adds bold texture to landscape features and accent zones.",
+ purchaseUnit: "Quoted by pound, yard, or bulk bag",
+ featured: false,
+ tags: ["pebbles", "mexico-pebbles", "multicolor"],
+ },
+ {
+ slug: "mexico-beach-pebbles-slim-blend",
+ name: "Mexico Beach Pebbles — Slim Blend",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/thumbnail_20200716_135254.jpg",
+ description:
+ "Elongated mixed-color Mexico Beach pebbles for a softer, more natural-looking ground cover with varied shape and tone.",
+ purchaseUnit: "Quoted by pound, yard, or bulk bag",
+ featured: false,
+ tags: ["pebbles", "mexico-pebbles", "multicolor"],
+ },
+ {
+ slug: "mexico-beach-pebbles-black-40lb",
+ name: "Mexico Beach Pebbles — Black 40 lb. Bag",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/thumbnail_20210615_141826-rotated.jpg",
+ description:
+ "Dark black Mexico Beach pebbles sold in 40 lb. mesh bags for targeted installs and touch-up work.",
+ purchaseUnit: "40 lb. bag",
+ featured: false,
+ tags: ["pebbles", "mexico-pebbles", "black", "bagged"],
+ },
+ {
+ slug: "mexico-beach-pebbles-2ton-basket",
+ name: "Mexico Beach Pebbles 2 Ton Basket",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/20220829_090518-scaled.jpg",
+ description:
+ "2-ton pallet baskets of Mexico Beach pebbles for large-volume installs. Multiple color varieties available — call to check stock.",
+ purchaseUnit: "2 ton basket",
+ featured: true,
+ tags: ["pebbles", "mexico-pebbles", "bulk", "basket"],
+ },
+ {
+ slug: "mexico-beach-pebbles-black-bulk",
+ name: "Mexico Beach Pebbles — Black Bulk",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/247999000_3110885482529384_6726596750678107116_n.jpg",
+ description:
+ "Bulk black Mexico Beach pebbles in large-volume baskets. Deep, consistent dark color for bold landscape contrast.",
+ purchaseUnit: "Quoted by ton or basket",
+ featured: false,
+ tags: ["pebbles", "mexico-pebbles", "black", "bulk"],
+ },
+ {
+ slug: "mexico-beach-pebbles-40lb-bags",
+ name: "Mexico Beach Pebbles 40 lb. Bags",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/188500405_2993718674246066_2933173565393514824_n.jpg",
+ description:
+ "Mexico Beach pebbles in standard 40 lb. mesh bags for smaller jobs, touch-ups, and retail pickup.",
+ purchaseUnit: "40 lb. bag",
+ featured: false,
+ tags: ["pebbles", "mexico-pebbles", "bagged"],
+ },
+ {
+ slug: "mexico-beach-pebbles-black-2ton",
+ name: "Mexico Beach Pebbles — Black 2 Ton Basket",
+ category: "landscaping",
+ subcategory: "Mexico Beach Pebbles",
+ image: "/mexicobeachpebbles/280754678_3262764467341484_1718282480469990117_n.jpg",
+ description:
+ "Large outdoor-stacked 2-ton baskets of dark black Mexico Beach pebbles ready for commercial or large residential projects.",
+ purchaseUnit: "2 ton basket",
+ featured: false,
+ tags: ["pebbles", "mexico-pebbles", "black", "bulk", "basket"],
+ },
+ // ── Sand & Gravel ──────────────────────────────────────────────────────────
+ {
+ slug: "mason-sand",
+ name: "Mason Sand",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/thumbnail_20200115_154703.jpg",
+ description:
+ "Fine mason sand for mortar mixing, bedding, and leveling applications.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: true,
+ tags: ["sand", "aggregates"],
+ },
+ {
+ slug: "masonry-sand-mix",
+ name: "Masonry Sand Mix",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/thumbnail_20200218_104001.jpg",
+ description:
+ "Blended sand and fine gravel mix for base layers, fill, and general masonry support work.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["sand", "gravel", "aggregates"],
+ },
+ {
+ slug: "pea-gravel",
+ name: "Pea Gravel",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/Pea-Gravel.jpg",
+ description:
+ "Small, smooth-edged pea gravel for drainage beds, walkways, and decorative ground cover.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates"],
+ },
+ {
+ slug: "decomposed-granite",
+ name: "Decomposed Granite",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/Decomposed-Granite-2.jpg",
+ description:
+ "Compacted decomposed granite for pathways, driveways, and natural-finish ground cover.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["granite", "aggregates"],
+ },
+ {
+ slug: "crushed-gravel",
+ name: "Crushed Gravel",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/thumbnail_20230523_105335.jpg",
+ description:
+ "Angular crushed gravel for drainage, base compaction, and utility fill.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates"],
+ },
+ {
+ slug: "mixed-gravel",
+ name: "Mixed Gravel",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/thumbnail_20191004_084419.jpg",
+ description:
+ "Mixed-size gravel blend for drainage, fill, and general landscape use.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates"],
+ },
+ {
+ slug: "bull-rock",
+ name: "Bull Rock",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/thumbnail_20200218_103916.jpg",
+ description:
+ "Rounded tan bull rock for drainage, retaining walls, and decorative landscape borders.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates", "bull-rock"],
+ },
+ {
+ slug: "bull-rock-1-2",
+ name: "Bull Rock 1-2\"",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/Bull-Rock-1-2.jpg",
+ description:
+ "1\"–2\" bull rock with warm tan color for drainage beds, creek features, and erosion control.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates", "bull-rock"],
+ },
+ {
+ slug: "white-marble",
+ name: "White Marble",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/White-Marble.jpg",
+ description:
+ "Bright white marble chips for high-contrast decorative beds, borders, and modern landscape features.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates", "white-marble"],
+ },
+ {
+ slug: "black-star-5-8",
+ name: "5/8\" Black Star",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/5-8-Black-Star-2.jpg",
+ description:
+ "5/8\" crushed black star granite for driveways, drainage, and bold dark ground cover.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates", "black-star"],
+ },
+ {
+ slug: "black-star",
+ name: "Black Star",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/Black-Star-2.jpg",
+ description:
+ "Standard black star crushed granite for utility fill, base layers, and dark decorative coverage.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates", "black-star"],
+ },
+ {
+ slug: "river-gravel",
+ name: "River Gravel",
+ category: "landscaping",
+ subcategory: "Sand & Gravel",
+ image: "/sandgravel/thumbnail_20231003_112820.jpg",
+ description:
+ "Smooth-worn mixed river gravel for natural-looking drainage, creek beds, and landscape accents.",
+ purchaseUnit: "Quoted by shovel or yard",
+ featured: false,
+ tags: ["gravel", "aggregates", "river-gravel"],
+ },
+ // ── Flagstone ─────────────────────────────────────────────────────────────
+ {
+ slug: "oklahoma-1in",
+ name: "1\" Oklahoma",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/Oklahoma-scaled.jpg",
+ description:
+ "Classic 1\" Oklahoma flagstone in natural gray-green tones. A go-to choice for patios, paths, and stepping stone installations.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: true,
+ tags: ["flagstone", "oklahoma"],
+ },
+ {
+ slug: "oklahoma-silver-mist-1in",
+ name: "1\" Oklahoma Silver Mist",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/thumbnail_20210413_072014.jpg",
+ description:
+ "1\" Oklahoma Silver Mist flagstone with a cool silver-gray tone. Consistent flat surface ideal for clean, contemporary hardscape.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "oklahoma", "silver"],
+ },
+ {
+ slug: "arkansas-chestnut-1in",
+ name: "1\" Arkansas Chestnut",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/20200406_152513-scaled.jpg",
+ description:
+ "1\" Arkansas Chestnut flagstone with warm brown and tan tones. Natural color variation adds character to patios and walkways.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "arkansas", "chestnut"],
+ },
+ {
+ slug: "arkansas-blue-half-in",
+ name: "1/2\" Arkansas Blue",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/ark-blue-1-scaled.jpg",
+ description:
+ "Thin 1/2\" Arkansas Blue flagstone for layered installs and projects where a lighter, slate-blue profile is preferred.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "arkansas", "blue"],
+ },
+ {
+ slug: "arkansas-blue-1in",
+ name: "1\" Arkansas Blue",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/20200604_103356-scaled.jpg",
+ description:
+ "1\" Arkansas Blue flagstone with a deep blue-gray color. Durable and versatile for patios, pool decks, and garden paths.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: true,
+ tags: ["flagstone", "arkansas", "blue"],
+ },
+ {
+ slug: "arkansas-blue-2in",
+ name: "2\" Arkansas Blue",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/20200318_083229-1-scaled.jpg",
+ description:
+ "Heavier 2\" Arkansas Blue flagstone for bold, substantial hardscape presence and high-traffic areas.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "arkansas", "blue"],
+ },
+ {
+ slug: "arkansas-brown-half-in",
+ name: "1/2\" Arkansas Brown",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/Ark-Brown-12-scaled.jpg",
+ description:
+ "Thin 1/2\" Arkansas Brown flagstone with rich orange and rust tones. Great for layered installs and warm-palette designs.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "arkansas", "brown"],
+ },
+ {
+ slug: "arkansas-brown-1in",
+ name: "1\" Arkansas Brown",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/Ark-Brown-1-scaled.jpg",
+ description:
+ "1\" Arkansas Brown flagstone in warm orange and rust tones. A popular choice for patios with a natural earthy look.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "arkansas", "brown"],
+ },
+ {
+ slug: "arkansas-brown-2in",
+ name: "2\" Arkansas Brown",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/20200406_152327-scaled.jpg",
+ description:
+ "Substantial 2\" Arkansas Brown flagstone with large warm tan and golden slabs for bold hardscape installations.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "arkansas", "brown"],
+ },
+ {
+ slug: "mexico-white-1-5in",
+ name: "1-1/2\" Mexico White",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/thumbnail_20230413_105458.jpg",
+ description:
+ "1-1/2\" Mexico White flagstone with a clean, bright white surface. Ideal for high-contrast hardscape and modern outdoor designs.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "mexico", "white"],
+ },
+ {
+ slug: "mexico-creama-1-5in",
+ name: "1-1/2\" Mexico Creama",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/Mexico-Cream-Flagstone.jpg",
+ description:
+ "1-1/2\" Mexico Creama flagstone in warm cream and beige tones. A classic neutral for patios and natural stone pathways.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "mexico", "cream"],
+ },
+ {
+ slug: "mexico-rosa-1-5in",
+ name: "1-1/2\" Mexico Rosa Flagstone",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/thumbnail_20250418_081648.jpg",
+ description:
+ "1-1/2\" Mexico Rosa flagstone with rich salmon and rose tones. Thicker profile for heavier patio and hardscape work.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "mexico", "rosa"],
+ },
+ {
+ slug: "mexico-gray-1-5in",
+ name: "1-1/2\" Mexico Gray Flagstone",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/thumbnail_20240508_150416.jpg",
+ description:
+ "1-1/2\" Mexico Gray flagstone with a light gray and white mottled surface. Clean, understated tone for contemporary hardscape.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "mexico", "gray"],
+ },
+ {
+ slug: "mexico-cafe-1-5in",
+ name: "1-1/2\" Mexico Cafe Flagstone",
+ category: "landscaping",
+ subcategory: "Flagstone",
+ image: "/flagstone/thumbnail_20240508_150322-1.jpg",
+ description:
+ "1-1/2\" Mexico Cafe flagstone in warm buff and cream tones. A versatile neutral that complements most exterior palettes.",
+ purchaseUnit: "Quoted by pound or ton",
+ availabilityNote: "One-ton delivery minimum.",
+ featured: false,
+ tags: ["flagstone", "mexico", "cafe"],
+ },
+ // ── Boulderstone ──────────────────────────────────────────────────────────
+ {
+ slug: "cream-limestone-block",
+ name: "Cream Limestone Block",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/thumbnail_20200618_083606.jpg",
+ description:
+ "Cream-colored limestone blocks for retaining walls, garden borders, and structural landscape features.",
+ purchaseUnit: "Quoted by load",
+ featured: true,
+ tags: ["boulders", "limestone", "block"],
+ },
+ {
+ slug: "limestone-building-stone",
+ name: "Limestone Building Stone",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/thumbnail_20200618_083624.jpg",
+ description:
+ "Rough-cut tan limestone building stone for walls, steps, and natural-look structural applications.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "limestone", "building-stone"],
+ },
+ {
+ slug: "white-limestone-block",
+ name: "White Limestone Block",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103114-scaled.jpg",
+ description:
+ "Light white-gray limestone blocks with textured faces for retaining walls and large-scale landscape structure.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "limestone", "block", "white"],
+ },
+ {
+ slug: "tan-limestone-block",
+ name: "Tan Limestone Block",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103105-scaled.jpg",
+ description:
+ "Large-format tan limestone blocks for heavy retaining walls, raised beds, and structural garden features.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "limestone", "block"],
+ },
+ {
+ slug: "sandstone-building-block",
+ name: "Sandstone Building Block",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103013-scaled.jpg",
+ description:
+ "Warm tan sandstone blocks with smooth tops and rough sides for walls, steps, and accent features.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "sandstone", "block"],
+ },
+ {
+ slug: "sandstone-block-warm-tan",
+ name: "Sandstone Block — Warm Tan",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103028_HDR-scaled.jpg",
+ description:
+ "Warm golden-tan sandstone blocks for retaining walls and raised border features with natural earthy color.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "sandstone", "block"],
+ },
+ {
+ slug: "cream-limestone-boulder",
+ name: "Cream Limestone Boulder",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200406_152023-scaled.jpg",
+ description:
+ "Large individual cream limestone boulders for focal points, natural retaining features, and landscape accents.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "limestone"],
+ },
+ {
+ slug: "limestone-slab-boulder",
+ name: "Limestone Slab Boulder",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200406_152000-scaled.jpg",
+ description:
+ "Extra-large limestone slab boulders for dramatic landscape statements, benches, and feature walls.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "limestone"],
+ },
+ {
+ slug: "hill-country-boulders",
+ name: "Hill Country Boulders",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103334-scaled.jpg",
+ description:
+ "Natural orange and rust-toned Hill Country boulders for rugged landscape features and retaining accents.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "hill-country"],
+ },
+ {
+ slug: "mixed-boulders",
+ name: "Mixed Boulders",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103544-scaled.jpg",
+ description:
+ "Mixed large boulders in a variety of colors and stone types. Call to discuss what's available in the yard.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "mixed"],
+ },
+ {
+ slug: "river-rock-4-6",
+ name: "River Rock 4-6\"",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/4-6-scaled.jpg",
+ description:
+ "Large 4–6\" rounded river rock boulders in wire cages, ideal for drainage features, creek beds, and accent walls.",
+ purchaseUnit: "Quoted by cage or load",
+ featured: true,
+ tags: ["boulders", "river-rock"],
+ },
+ {
+ slug: "mixed-river-rock",
+ name: "Mixed River Rock",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/20200604_103254-scaled.jpg",
+ description:
+ "Large mixed river rock boulders in a range of shapes and colors for natural water features and landscape accents.",
+ purchaseUnit: "Quoted by cage or load",
+ featured: false,
+ tags: ["boulders", "river-rock"],
+ },
+ {
+ slug: "white-river-rock",
+ name: "White River Rock",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/thumbnail_20191024_100314.jpg",
+ description:
+ "Large smooth white-gray river rock boulders for striking decorative features and clean modern landscapes.",
+ purchaseUnit: "Quoted by cage or load",
+ featured: false,
+ tags: ["boulders", "river-rock", "white"],
+ },
+ {
+ slug: "sandstone-boulders",
+ name: "Sandstone Boulders",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/thumbnail_20210908_095544.jpg",
+ description:
+ "Large tan and orange sandstone boulders for statement landscape features, retaining walls, and natural focal points.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "sandstone"],
+ },
+ {
+ slug: "fieldstone-boulders",
+ name: "Fieldstone Boulders",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/thumbnail_20210908_095716.jpg",
+ description:
+ "Mixed fieldstone boulders in gray, tan, and brown for natural-looking retaining features and landscape accents.",
+ purchaseUnit: "Quoted by load",
+ featured: false,
+ tags: ["boulders", "fieldstone"],
+ },
+ {
+ slug: "white-marble-boulders",
+ name: "White Marble Boulders",
+ category: "landscaping",
+ subcategory: "Boulderstone",
+ image: "/boulderstone/thumbnail_20230413_105417.jpg",
+ description:
+ "Pure white marble boulders for high-contrast decorative features, water gardens, and modern landscape statements.",
+ purchaseUnit: "Quoted by cage or load",
+ featured: false,
+ tags: ["boulders", "marble", "white"],
+ },
+];
+
+export const featuredMaterials = [
+ masonryMaterials[0],
+ masonryMaterials[1],
+ landscapingMaterials[0],
+ landscapingMaterials[4],
+ landscapingMaterials[8],
+ landscapingMaterials[11],
+];
+
+export const faqs = [
+ {
+ question: "Do you offer delivery?",
+ answer:
+ "Yes. Delivery is available and quoted at time of purchase. Flagstone has a minimum of one ton, and landscaping aggregates have a 3 yard minimum.",
+ },
+ {
+ question: "How can materials be purchased?",
+ answer:
+ "Ground cover can be purchased by the shovel, by the pound, by the yard or by bulk bag. Flagstone can be purchased by the pound or ton.",
+ },
+ {
+ question: "Who do you serve?",
+ answer:
+ "We are committed to providing building professionals and the general public with the tools, service and support they need for projects large or small, including landscape architects, designers, and contractors.",
+ },
+];
diff --git a/devserver.err.log b/devserver.err.log
new file mode 100644
index 0000000..acaea30
--- /dev/null
+++ b/devserver.err.log
@@ -0,0 +1,9 @@
+⨯ Failed to start server
+Error: listen EADDRINUSE: address already in use 127.0.0.1:3000
+ at (Error: listen EADDRINUSE: address already in use 127.0.0.1:3000) {
+ code: 'EADDRINUSE',
+ errno: -4091,
+ syscall: 'listen',
+ address: '127.0.0.1',
+ port: 3000
+}
diff --git a/devserver.out.log b/devserver.out.log
new file mode 100644
index 0000000..314010e
Binary files /dev/null and b/devserver.out.log differ
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..05c81b0
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ web:
+ build:
+ context: .
+ target: dev
+ ports:
+ - "3000:3000"
+ environment:
+ NEXT_PUBLIC_SITE_URL: http://localhost:3000
+ volumes:
+ - .:/app
+ - /app/node_modules
+ - /app/.next
diff --git a/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.png b/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.png
new file mode 100644
index 0000000..9ee8ebd
Binary files /dev/null and b/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.png differ
diff --git a/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.png b/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.png
new file mode 100644
index 0000000..f17a5cf
Binary files /dev/null and b/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.png differ
diff --git a/herosection/Flow_delpmaspu_.mp4 b/herosection/Flow_delpmaspu_.mp4
new file mode 100644
index 0000000..b8ddf8d
Binary files /dev/null and b/herosection/Flow_delpmaspu_.mp4 differ
diff --git a/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.png b/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.png
new file mode 100644
index 0000000..de4483f
Binary files /dev/null and b/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.png differ
diff --git a/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.png b/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.png
new file mode 100644
index 0000000..6d0614d
Binary files /dev/null and b/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.png differ
diff --git a/info.md b/info.md
new file mode 100644
index 0000000..e4fcf9c
--- /dev/null
+++ b/info.md
@@ -0,0 +1,331 @@
+Skip to content
+Southern Masonry Supply
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Masonry &
+Landscaping Supplies
+Masonry Tools • Flagstone • Aggregates
+
+Get in Touch
+Corpus Christi's #1
+Masonry Supply Store
+Southern Masonry Supply is a family-owned-and-operated business that offers a large selection of masonry products and tools. For more than 30 years, we have been proudly serving clients in Corpus Christi, TX and its surrounding cities.
+
+We take pride in providing exceptional customer service and do our best to make sure our products are always in stock for fast delivery.
+
+What We Offer
+Our products are sourced in the United States & Mexico to provide top quality materials to our clients. We offer a variety of ground cover, including decomposed granite and Mexico pebbles, along with a variety of flagstones including Arkansas and Oklahoma. Ground cover can be purchased by the shovel, by the pound, by the yard or by bulk bag. Flagstone can be purchased by the pound or ton. Delivery is also available and quoted at time of purchase.
+
+
+
+Delivery Information
+
+Our delivery service for flagstone has a minimum of one ton. For landscaping aggregates there is a 3 yard minimum.
+
+The delivery charge depends on where you want your purchases delivered. If you have any questions, please do not hesitate to reach out to us.
+
+
+Site Links
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Get In Touch!
+5205 Agnes St,
+Corpus Christi, TX 78405
+
+(361) 289-1074
+Monday-Friday 8 AM to 5 PM
+Closed Saturday & Sunday
+
+Follow Us on Facebook
+© 2026 Southern Masonry Supply
+
+GoDaddy Web Design
+Apollo
+
+
+
+
+
+
+
+
+
+
+
+Skip to content
+Southern Masonry Supply
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Providing You With
+Landscaping Supplies & Masonry Materials
+Southern Masonry Supply has been serving clients in Corpus Christi, TX and its surrounding cities since 1990. We offer high-quality groundskeeping and masonry supplies for any building project.
+
+As our client, we are proud to share your successful work featuring our products. We strive to exceed your expectations and make sure all your landscaping and masonry needs are met.
+
+Our Mission
+We are committed to providing building professionals and the general public with the tools, service and support they need for all their projects large or small.
+
+What Sets Us Apart
+Southern Masonry Supply is owned by Sid Smith Jr. His years of experience in masonry work have made him one of our best resources. He is also well versed in landscaping work. With his expertise, we aim to become one of the best businesses in the industry.
+
+We are committed to offering building material products of exceptional quality to all, including landscape architects, designers, and contractors. Our dedication to excellence is reflected in the materials we supply and customer service we provide.
+
+
+Site Links
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Get In Touch!
+5205 Agnes St,
+Corpus Christi, TX 78405
+
+(361) 289-1074
+Monday-Friday 8 AM to 5 PM
+Closed Saturday & Sunday
+
+Follow Us on Facebook
+© 2026 Southern Masonry Supply
+
+GoDaddy Web Design
+Apollo
+
+
+
+
+
+
+
+Skip to content
+Southern Masonry Supply
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Masonry Tools
+
+
+
+
+
+
+
+
+
+Bagged Cement
+
+Alamo Type N Masonry Cement
+
+Alamo White Portland Cement
+Alamo White Masonry Cement
+Alamo Portland Cement Type IL
+Alamo Masonry Cement Type N
+Alamo White Portland Cement
+
+Site Links
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Get In Touch!
+5205 Agnes St,
+Corpus Christi, TX 78405
+
+(361) 289-1074
+Monday-Friday 8 AM to 5 PM
+Closed Saturday & Sunday
+
+Follow Us on Facebook
+© 2026 Southern Masonry Supply
+
+GoDaddy Web Design
+Apollo
+
+
+
+
+
+
+
+
+
+
+Skip to content
+Southern Masonry Supply
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Check Out Our
+Landscaping Supplies
+
+Mexico Beach Pebbles
+1" - 2" Mexico Beach Pebbles Multicolor
+
+
+
+
+
+Mexico Beach Pebbles 40 lb. Bags
+Mexico Beach Pebbles 2 Ton Basket
+Sand & Gravel
+
+
+
+
+
+
+
+
+
+
+
+
+
+Flagstone
+
+
+1" Oklahoma
+
+1" Oklahoma Silver Mist
+
+1" Arkansas Chestnut
+
+1/2" Arkansas Blue
+
+1" Arkansas Blue
+
+2" Arkansas Blue
+
+1/2" Arkansas Brown
+
+1" Arkansas Brown
+
+2" Arkansas Brown
+
+1-1/2" Mexico White
+
+1-1/2" Mexico Creama
+1" Mexico Rosa Flagstone
+1-1/2" Mexico Rosa Flagstone
+1-1/2" Mexico Gray Flagstone
+1-1/2" Mexico Gray Flagstone
+1-1/2" Mexico Cafe Flagstone
+1-1/2" Mexico Cafe Flagstone
+Boulders & Stone
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Site Links
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Get In Touch!
+5205 Agnes St,
+Corpus Christi, TX 78405
+
+(361) 289-1074
+Monday-Friday 8 AM to 5 PM
+Closed Saturday & Sunday
+
+Follow Us on Facebook
+© 2026 Southern Masonry Supply
+
+GoDaddy Web Design
+
+
+
+
+
+
+
+
+
+
+Skip to content
+Southern Masonry Supply
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Reach Out to Us
+Have questions? We have answers. Fill in your info below and one of our representatives will contact you directly.
+
+First Name*
+Last Name*
+Phone Number*
+Email Address*
+Inquiry/Message
+
+Site Links
+Home
+About
+Masonry Supplies
+Landscaping Supplies
+Contact Us
+Get In Touch!
+5205 Agnes St,
+Corpus Christi, TX 78405
+
+(361) 289-1074
+Monday-Friday 8 AM to 5 PM
+Closed Saturday & Sunday
+
+Follow Us on Facebook
+© 2026 Southern Masonry Supply
+
+GoDaddy Web Design
+Apollo
+
+
+
+
+
+
+
+
+socials
+https://www.facebook.com/southernmasonrysupply/
+https://www.instagram.com/southernmasonrysupply/
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/seo.ts b/lib/seo.ts
new file mode 100644
index 0000000..c8bf265
--- /dev/null
+++ b/lib/seo.ts
@@ -0,0 +1,166 @@
+import type { Metadata } from "next";
+import { siteConfig } from "@/data/site-content";
+
+type PageMetadataInput = {
+ title: string;
+ description: string;
+ path: string;
+ image?: string;
+};
+
+type FaqEntry = {
+ question: string;
+ answer: string;
+};
+
+type ItemListEntry = {
+ name: string;
+ path?: string;
+};
+
+export function buildMetadataBase() {
+ const rawUrl = process.env.NEXT_PUBLIC_SITE_URL || siteConfig.siteUrl;
+
+ return new URL(rawUrl.endsWith("/") ? rawUrl : `${rawUrl}/`);
+}
+
+export function buildAbsoluteUrl(path: string) {
+ return new URL(path, buildMetadataBase()).toString();
+}
+
+export function buildPageMetadata({
+ title,
+ description,
+ path,
+ image = siteConfig.defaultOgImage,
+}: PageMetadataInput): Metadata {
+ return {
+ title,
+ description,
+ alternates: {
+ canonical: path,
+ },
+ openGraph: {
+ title,
+ description,
+ url: path,
+ images: [
+ {
+ url: image,
+ alt: title,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title,
+ description,
+ images: [image],
+ },
+ };
+}
+
+export function websiteSchema() {
+ return {
+ "@type": "WebSite",
+ name: siteConfig.name,
+ url: buildAbsoluteUrl("/"),
+ };
+}
+
+export function businessSchema() {
+ return {
+ "@type": "LocalBusiness",
+ name: siteConfig.name,
+ url: buildAbsoluteUrl("/"),
+ description: siteConfig.description,
+ logo: buildAbsoluteUrl(siteConfig.brand.primaryLogo),
+ image: buildAbsoluteUrl(siteConfig.defaultOgImage),
+ telephone: siteConfig.phoneDisplay,
+ address: {
+ "@type": "PostalAddress",
+ streetAddress: siteConfig.address.street,
+ addressLocality: "Corpus Christi",
+ addressRegion: "TX",
+ postalCode: "78405",
+ addressCountry: "US",
+ },
+ sameAs: siteConfig.socials.map((social) => social.href),
+ contactPoint: [
+ {
+ "@type": "ContactPoint",
+ telephone: siteConfig.phoneDisplay,
+ contactType: "customer service",
+ areaServed: "Corpus Christi, TX",
+ },
+ ],
+ openingHoursSpecification: [
+ {
+ "@type": "OpeningHoursSpecification",
+ dayOfWeek: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
+ opens: "08:00",
+ closes: "17:00",
+ },
+ ],
+ };
+}
+
+export function localBusinessSchema() {
+ return {
+ "@context": "https://schema.org",
+ ...businessSchema(),
+ };
+}
+
+export function breadcrumbSchema(items: { name: string; path: string }[]) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: items.map((item, index) => ({
+ "@type": "ListItem",
+ position: index + 1,
+ name: item.name,
+ item: buildAbsoluteUrl(item.path),
+ })),
+ };
+}
+
+export function faqPageSchema(items: FaqEntry[]) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: items.map((item) => ({
+ "@type": "Question",
+ name: item.question,
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: item.answer,
+ },
+ })),
+ };
+}
+
+export function itemListSchema({
+ name,
+ path,
+ items,
+}: {
+ name: string;
+ path: string;
+ items: ItemListEntry[];
+}) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "ItemList",
+ name,
+ url: buildAbsoluteUrl(path),
+ numberOfItems: items.length,
+ itemListOrder: "https://schema.org/ItemListOrderAscending",
+ itemListElement: items.map((item, index) => ({
+ "@type": "ListItem",
+ position: index + 1,
+ name: item.name,
+ url: item.path ? buildAbsoluteUrl(item.path) : undefined,
+ })),
+ };
+}
diff --git a/next-env.d.ts b/next-env.d.ts
new file mode 100644
index 0000000..c4b7818
--- /dev/null
+++ b/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+import "./.next/dev/types/routes.d.ts";
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.ts b/next.config.ts
new file mode 100644
index 0000000..1edc700
--- /dev/null
+++ b/next.config.ts
@@ -0,0 +1,11 @@
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+ output: "standalone",
+ images: {
+ formats: ["image/avif", "image/webp"],
+ minimumCacheTTL: 60 * 60 * 24 * 30,
+ },
+};
+
+export default nextConfig;
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..e9053b5
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1019 @@
+{
+ "name": "southern-masonry-supply",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "southern-masonry-supply",
+ "version": "1.0.0",
+ "dependencies": {
+ "framer-motion": "^12.35.2",
+ "next": "16.1.6",
+ "react": "19.0.0",
+ "react-dom": "19.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "22.13.10",
+ "@types/react": "19.0.10",
+ "@types/react-dom": "19.0.4",
+ "typescript": "5.8.2"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
+ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
+ "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==",
+ "license": "MIT"
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz",
+ "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz",
+ "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz",
+ "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz",
+ "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz",
+ "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz",
+ "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz",
+ "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz",
+ "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.13.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
+ "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz",
+ "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz",
+ "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
+ "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001777",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
+ "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "12.35.2",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.35.2.tgz",
+ "integrity": "sha512-dhfuEMaNo0hc+AEqyHiIfiJRNb9U9UQutE9FoKm5pjf7CMitp9xPEF1iWZihR1q86LBmo6EJ7S8cN8QXEy49AA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.35.2",
+ "motion-utils": "^12.29.2",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.35.2",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.35.2.tgz",
+ "integrity": "sha512-pWXFMTwvGDbx1Fe9YL5HZebv2NhvGBzRtiNUv58aoK7+XrsuaydQ0JGRKK2r+bTKlwgSWwWxHbP5249Qr/BNpg==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.29.2"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.29.2",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/next": {
+ "version": "16.1.6",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz",
+ "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "16.1.6",
+ "@swc/helpers": "0.5.15",
+ "baseline-browser-mapping": "^2.8.3",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "16.1.6",
+ "@next/swc-darwin-x64": "16.1.6",
+ "@next/swc-linux-arm64-gnu": "16.1.6",
+ "@next/swc-linux-arm64-musl": "16.1.6",
+ "@next/swc-linux-x64-gnu": "16.1.6",
+ "@next/swc-linux-x64-musl": "16.1.6",
+ "@next/swc-win32-arm64-msvc": "16.1.6",
+ "@next/swc-win32-x64-msvc": "16.1.6",
+ "sharp": "^0.34.4"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
+ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.25.0"
+ },
+ "peerDependencies": {
+ "react": "^19.0.0"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/typescript": {
+ "version": "5.8.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
+ "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "dev": true,
+ "license": "MIT"
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..6c2aff7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "southern-masonry-supply",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "framer-motion": "^12.35.2",
+ "next": "16.1.6",
+ "react": "19.0.0",
+ "react-dom": "19.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "22.13.10",
+ "@types/react": "19.0.10",
+ "@types/react-dom": "19.0.4",
+ "typescript": "5.8.2"
+ }
+}
diff --git a/plan.md b/plan.md
new file mode 100644
index 0000000..3607d2b
--- /dev/null
+++ b/plan.md
@@ -0,0 +1,99 @@
+ # Southern Masonry Supply Next.js Rebuild Plan
+
+ ## Summary
+
+ Build a production-ready Next.js site in TypeScript with App Router, using the provided screenshots as structural
+ inspiration, info.md as content source, and public/images as the visual asset base. The v1 will ship as a 5-page
+ marketing/catalog site with strong local SEO, reusable content-driven sections, a placeholder-ready contact API,
+ and Dockerized local/dev deployment so npm run dev works immediately.
+
+ ## Key Changes
+
+ - Initialize a new Next.js App Router project in TypeScript with a clean component/content structure, responsive
+ layout system, shared header/footer, global theme tokens, and SEO-safe metadata defaults.
+ - Create these routes with preserved slugs:
+ - /
+ - /about
+ - /masonry-supplies
+ - /landscaping-supplies
+ - /contact
+ - Implement a strong local-business visual direction rather than a generic template:
+ - warm stone/terracotta/sand palette
+ - editorial serif display + refined body font
+ - real masonry/landscaping imagery from public/images
+ - clear quote-first CTA treatment
+ - Model content in static TypeScript data modules for v1:
+ - siteConfig for business identity, address, phone, hours, socials, CTAs
+ - materials dataset for masonry and landscaping items with category, subcategory, image, description, purchase
+ unit, tags, featured flag
+ - page-specific hero, trust, delivery, and FAQ content
+ - Home page behavior:
+ - local SEO hero with Corpus Christi positioning
+ - split entry cards for masonry vs landscaping
+ - trust/value section
+ - featured materials
+ - delivery minimums and service summary
+ - direct links into contact/quote flow
+ - About page behavior:
+ - family-owned story and 30+ year credibility
+ - mission/service philosophy
+ - sourcing and expertise differentiators
+ - no invented team bios or fake history beyond info.md
+ - Supplies pages behavior:
+ - hero/banner
+ - filterable client-side product grid by subcategory/tags
+ - quote CTA on every card
+ - delivery/purchase-unit notes surfaced in-page
+ - breadcrumb support and internal links between supply pages and contact
+ - Contact page behavior:
+ - business info, hours, address, phone, social links
+ - delivery rules from info.md
+ - contact form with client validation and a Next.js API placeholder endpoint returning structured success/error
+ responses
+ - map section as external Google Maps link/embed placeholder, not a hard dependency
+ - SEO and schema:
+ - route-level metadata, titles, descriptions, canonical defaults, Open Graph/Twitter cards
+ - JSON-LD for LocalBusiness/Organization, WebSite, and BreadcrumbList
+ - semantic headings, accessible nav, internal linking, crawl-friendly page structure
+ - Delivery/runtime assets:
+ - Dockerfile for containerized app build/run
+ - docker-compose.yml for local container startup
+ - .dockerignore
+ - README updates with npm install, npm run dev, docker compose up instructions
+
+ ## Public Interfaces and Data Contracts
+
+ - Route contract:
+ - /contact submits to /api/contact
+ - Contact API response contract:
+ - success: { success: true, message: string }
+ - validation/server error: { success: false, message: string, fieldErrors?: Record }
+ - Material data contract:
+ - slug
+ - name
+ - category
+ - subcategory
+ - image
+ - description
+ - purchaseUnit
+ - availabilityNote?
+ - featured
+ - tags
+ - Shared config contract:
+ - business name, tagline, NAP, hours, socials, delivery notes, nav items, footer groups, default SEO fields
+
+ ## Test Plan
+
+ - Verify header nav, footer links, breadcrumbs, and CTA flows between pages.
+ - Verify /api/contact handles valid submission, missing required fields, and invalid email/phone formats.
+ - Verify metadata and JSON-LD render per page and match visible content.
+ - Verify images load through Next.js without layout shift regressions.
+ - Verify Docker build succeeds and docker compose up serves the app successfully.
+
+ - Preserve the existing English content direction from info.md, even though the planning conversation is in German.
+ - Keep the classic page slugs: /about, /masonry-supplies, /landscaping-supplies, /contact.
+ - Contact form will be implementation-ready but not wired to real email delivery yet; the placeholder API is the
+ accepted v1 behavior.
+ - No cart, checkout, pricing engine, CMS, or live inventory in v1.
+ - Only provided assets in public/images are used unless implementation reveals a missing critical visual, in which
+ case the design falls back to text-first sections rather than invented media.
\ No newline at end of file
diff --git a/public/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.png b/public/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.png
new file mode 100644
index 0000000..10af31c
Binary files /dev/null and b/public/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.png differ
diff --git a/public/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.webp b/public/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.webp
new file mode 100644
index 0000000..f65806f
Binary files /dev/null and b/public/Closeup_macro_shot_of_a_weathered_brick_wall_under_delpmaspu.webp differ
diff --git a/public/Kannst_du_mir_das_logo_bitte_recreaten_und_ohne_hi_delpmaspu.png b/public/Kannst_du_mir_das_logo_bitte_recreaten_und_ohne_hi_delpmaspu.png
new file mode 100644
index 0000000..b727626
Binary files /dev/null and b/public/Kannst_du_mir_das_logo_bitte_recreaten_und_ohne_hi_delpmaspu.png differ
diff --git a/public/Logo_mit_weiem_hintergrund_07ac20053d.jpeg b/public/Logo_mit_weiem_hintergrund_07ac20053d.jpeg
new file mode 100644
index 0000000..bbdd680
Binary files /dev/null and b/public/Logo_mit_weiem_hintergrund_07ac20053d.jpeg differ
diff --git a/public/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.png b/public/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.png
new file mode 100644
index 0000000..93541b3
Binary files /dev/null and b/public/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.png differ
diff --git a/public/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.webp b/public/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.webp
new file mode 100644
index 0000000..0f3e340
Binary files /dev/null and b/public/Low_angle_shot_of_smooth_multicolor_river_pebbles__delpmaspu.webp differ
diff --git a/public/baggedcement/124621322_1044010109369867_1789124923342669301_n-1024x760.jpg b/public/baggedcement/124621322_1044010109369867_1789124923342669301_n-1024x760.jpg
new file mode 100644
index 0000000..107db37
Binary files /dev/null and b/public/baggedcement/124621322_1044010109369867_1789124923342669301_n-1024x760.jpg differ
diff --git a/public/baggedcement/124633699_794688728042730_8896789977779663103_n-1024x926.jpg b/public/baggedcement/124633699_794688728042730_8896789977779663103_n-1024x926.jpg
new file mode 100644
index 0000000..b604d66
Binary files /dev/null and b/public/baggedcement/124633699_794688728042730_8896789977779663103_n-1024x926.jpg differ
diff --git a/public/baggedcement/341181804_751803226560427_305481664816712952_n.jpg b/public/baggedcement/341181804_751803226560427_305481664816712952_n.jpg
new file mode 100644
index 0000000..6138b7f
Binary files /dev/null and b/public/baggedcement/341181804_751803226560427_305481664816712952_n.jpg differ
diff --git a/public/baggedcement/341230370_168526982801018_5550882254119213617_n.jpg b/public/baggedcement/341230370_168526982801018_5550882254119213617_n.jpg
new file mode 100644
index 0000000..bcecad0
Binary files /dev/null and b/public/baggedcement/341230370_168526982801018_5550882254119213617_n.jpg differ
diff --git a/public/baggedcement/341646099_182080524652887_1302135867891546997_n.jpg b/public/baggedcement/341646099_182080524652887_1302135867891546997_n.jpg
new file mode 100644
index 0000000..3497278
Binary files /dev/null and b/public/baggedcement/341646099_182080524652887_1302135867891546997_n.jpg differ
diff --git a/public/baggedcement/thumbnail_20220811_103223.jpg b/public/baggedcement/thumbnail_20220811_103223.jpg
new file mode 100644
index 0000000..40cff9b
Binary files /dev/null and b/public/baggedcement/thumbnail_20220811_103223.jpg differ
diff --git a/public/baggedcement/thumbnail_20220811_103245.jpg b/public/baggedcement/thumbnail_20220811_103245.jpg
new file mode 100644
index 0000000..adba0db
Binary files /dev/null and b/public/baggedcement/thumbnail_20220811_103245.jpg differ
diff --git a/public/baggedcement/thumbnail_20220811_103305.jpg b/public/baggedcement/thumbnail_20220811_103305.jpg
new file mode 100644
index 0000000..a8661ee
Binary files /dev/null and b/public/baggedcement/thumbnail_20220811_103305.jpg differ
diff --git a/public/boulderstone/20200406_152000-scaled.jpg b/public/boulderstone/20200406_152000-scaled.jpg
new file mode 100644
index 0000000..4d401bd
Binary files /dev/null and b/public/boulderstone/20200406_152000-scaled.jpg differ
diff --git a/public/boulderstone/20200406_152023-scaled.jpg b/public/boulderstone/20200406_152023-scaled.jpg
new file mode 100644
index 0000000..b5fd547
Binary files /dev/null and b/public/boulderstone/20200406_152023-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103013-scaled.jpg b/public/boulderstone/20200604_103013-scaled.jpg
new file mode 100644
index 0000000..88a5a3e
Binary files /dev/null and b/public/boulderstone/20200604_103013-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103028_HDR-scaled.jpg b/public/boulderstone/20200604_103028_HDR-scaled.jpg
new file mode 100644
index 0000000..54e99df
Binary files /dev/null and b/public/boulderstone/20200604_103028_HDR-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103105-scaled.jpg b/public/boulderstone/20200604_103105-scaled.jpg
new file mode 100644
index 0000000..e7a00ac
Binary files /dev/null and b/public/boulderstone/20200604_103105-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103114-scaled.jpg b/public/boulderstone/20200604_103114-scaled.jpg
new file mode 100644
index 0000000..76a8150
Binary files /dev/null and b/public/boulderstone/20200604_103114-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103254-scaled.jpg b/public/boulderstone/20200604_103254-scaled.jpg
new file mode 100644
index 0000000..f81c616
Binary files /dev/null and b/public/boulderstone/20200604_103254-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103334-scaled.jpg b/public/boulderstone/20200604_103334-scaled.jpg
new file mode 100644
index 0000000..78206df
Binary files /dev/null and b/public/boulderstone/20200604_103334-scaled.jpg differ
diff --git a/public/boulderstone/20200604_103544-scaled.jpg b/public/boulderstone/20200604_103544-scaled.jpg
new file mode 100644
index 0000000..e26a9e7
Binary files /dev/null and b/public/boulderstone/20200604_103544-scaled.jpg differ
diff --git a/public/boulderstone/4-6-scaled.jpg b/public/boulderstone/4-6-scaled.jpg
new file mode 100644
index 0000000..e462332
Binary files /dev/null and b/public/boulderstone/4-6-scaled.jpg differ
diff --git a/public/boulderstone/thumbnail_20191024_100314.jpg b/public/boulderstone/thumbnail_20191024_100314.jpg
new file mode 100644
index 0000000..72c0b51
Binary files /dev/null and b/public/boulderstone/thumbnail_20191024_100314.jpg differ
diff --git a/public/boulderstone/thumbnail_20200618_083606.jpg b/public/boulderstone/thumbnail_20200618_083606.jpg
new file mode 100644
index 0000000..b51381a
Binary files /dev/null and b/public/boulderstone/thumbnail_20200618_083606.jpg differ
diff --git a/public/boulderstone/thumbnail_20200618_083624.jpg b/public/boulderstone/thumbnail_20200618_083624.jpg
new file mode 100644
index 0000000..f6f24ba
Binary files /dev/null and b/public/boulderstone/thumbnail_20200618_083624.jpg differ
diff --git a/public/boulderstone/thumbnail_20210908_095544.jpg b/public/boulderstone/thumbnail_20210908_095544.jpg
new file mode 100644
index 0000000..d282be8
Binary files /dev/null and b/public/boulderstone/thumbnail_20210908_095544.jpg differ
diff --git a/public/boulderstone/thumbnail_20210908_095716.jpg b/public/boulderstone/thumbnail_20210908_095716.jpg
new file mode 100644
index 0000000..37b0d65
Binary files /dev/null and b/public/boulderstone/thumbnail_20210908_095716.jpg differ
diff --git a/public/boulderstone/thumbnail_20230413_105417.jpg b/public/boulderstone/thumbnail_20230413_105417.jpg
new file mode 100644
index 0000000..f48d7e6
Binary files /dev/null and b/public/boulderstone/thumbnail_20230413_105417.jpg differ
diff --git a/public/flagstone/20200318_083229-1-scaled.jpg b/public/flagstone/20200318_083229-1-scaled.jpg
new file mode 100644
index 0000000..be34ae4
Binary files /dev/null and b/public/flagstone/20200318_083229-1-scaled.jpg differ
diff --git a/public/flagstone/20200406_152327-scaled.jpg b/public/flagstone/20200406_152327-scaled.jpg
new file mode 100644
index 0000000..859a71b
Binary files /dev/null and b/public/flagstone/20200406_152327-scaled.jpg differ
diff --git a/public/flagstone/20200406_152513-scaled.jpg b/public/flagstone/20200406_152513-scaled.jpg
new file mode 100644
index 0000000..9e389a8
Binary files /dev/null and b/public/flagstone/20200406_152513-scaled.jpg differ
diff --git a/public/flagstone/20200604_103356-scaled.jpg b/public/flagstone/20200604_103356-scaled.jpg
new file mode 100644
index 0000000..325fb24
Binary files /dev/null and b/public/flagstone/20200604_103356-scaled.jpg differ
diff --git a/public/flagstone/Ark-Brown-1-scaled.jpg b/public/flagstone/Ark-Brown-1-scaled.jpg
new file mode 100644
index 0000000..16da8b3
Binary files /dev/null and b/public/flagstone/Ark-Brown-1-scaled.jpg differ
diff --git a/public/flagstone/Ark-Brown-12-scaled.jpg b/public/flagstone/Ark-Brown-12-scaled.jpg
new file mode 100644
index 0000000..022c1de
Binary files /dev/null and b/public/flagstone/Ark-Brown-12-scaled.jpg differ
diff --git a/public/flagstone/Mexico-Cream-Flagstone.jpg b/public/flagstone/Mexico-Cream-Flagstone.jpg
new file mode 100644
index 0000000..3fa843b
Binary files /dev/null and b/public/flagstone/Mexico-Cream-Flagstone.jpg differ
diff --git a/public/flagstone/Oklahoma-scaled.jpg b/public/flagstone/Oklahoma-scaled.jpg
new file mode 100644
index 0000000..e8d8e08
Binary files /dev/null and b/public/flagstone/Oklahoma-scaled.jpg differ
diff --git a/public/flagstone/ark-blue-1-scaled.jpg b/public/flagstone/ark-blue-1-scaled.jpg
new file mode 100644
index 0000000..fd28895
Binary files /dev/null and b/public/flagstone/ark-blue-1-scaled.jpg differ
diff --git a/public/flagstone/thumbnail_20210413_072014.jpg b/public/flagstone/thumbnail_20210413_072014.jpg
new file mode 100644
index 0000000..8b91b14
Binary files /dev/null and b/public/flagstone/thumbnail_20210413_072014.jpg differ
diff --git a/public/flagstone/thumbnail_20230413_105458.jpg b/public/flagstone/thumbnail_20230413_105458.jpg
new file mode 100644
index 0000000..8a869a0
Binary files /dev/null and b/public/flagstone/thumbnail_20230413_105458.jpg differ
diff --git a/public/flagstone/thumbnail_20240508_150322-1.jpg b/public/flagstone/thumbnail_20240508_150322-1.jpg
new file mode 100644
index 0000000..dde10f7
Binary files /dev/null and b/public/flagstone/thumbnail_20240508_150322-1.jpg differ
diff --git a/public/flagstone/thumbnail_20240508_150416.jpg b/public/flagstone/thumbnail_20240508_150416.jpg
new file mode 100644
index 0000000..7e4b36d
Binary files /dev/null and b/public/flagstone/thumbnail_20240508_150416.jpg differ
diff --git a/public/flagstone/thumbnail_20250418_081648.jpg b/public/flagstone/thumbnail_20250418_081648.jpg
new file mode 100644
index 0000000..33621c1
Binary files /dev/null and b/public/flagstone/thumbnail_20250418_081648.jpg differ
diff --git a/public/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.png b/public/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.png
new file mode 100644
index 0000000..9ee8ebd
Binary files /dev/null and b/public/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.png differ
diff --git a/public/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.webp b/public/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.webp
new file mode 100644
index 0000000..1199cc8
Binary files /dev/null and b/public/herosection/A_massive_perfectly_organized_masonry_supply_yard__delpmaspu.webp differ
diff --git a/public/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.png b/public/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.png
new file mode 100644
index 0000000..f17a5cf
Binary files /dev/null and b/public/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.png differ
diff --git a/public/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.webp b/public/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.webp
new file mode 100644
index 0000000..bdb03c7
Binary files /dev/null and b/public/herosection/Closeup_cinematic_macro_shot_of_a_stack_of_premium_delpmaspu.webp differ
diff --git a/public/herosection/Flow_delpmaspu_.mp4 b/public/herosection/Flow_delpmaspu_.mp4
new file mode 100644
index 0000000..b8ddf8d
Binary files /dev/null and b/public/herosection/Flow_delpmaspu_.mp4 differ
diff --git a/public/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.png b/public/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.png
new file mode 100644
index 0000000..de4483f
Binary files /dev/null and b/public/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.png differ
diff --git a/public/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.webp b/public/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.webp
new file mode 100644
index 0000000..c46e874
Binary files /dev/null and b/public/herosection/Ultrarealistic_cinematic_wide_shot_for_a_professio_delpmaspu.webp differ
diff --git a/public/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.png b/public/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.png
new file mode 100644
index 0000000..6d0614d
Binary files /dev/null and b/public/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.png differ
diff --git a/public/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.webp b/public/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.webp
new file mode 100644
index 0000000..1cb08b6
Binary files /dev/null and b/public/herosection/Wide_angle_architectural_shot_of_a_contemporary_st_delpmaspu.webp differ
diff --git a/public/images/aggregate_sand_gravel_piles_png_1773134775186.png b/public/images/aggregate_sand_gravel_piles_png_1773134775186.png
new file mode 100644
index 0000000..798f794
Binary files /dev/null and b/public/images/aggregate_sand_gravel_piles_png_1773134775186.png differ
diff --git a/public/images/aggregate_sand_gravel_piles_png_1773134775186.webp b/public/images/aggregate_sand_gravel_piles_png_1773134775186.webp
new file mode 100644
index 0000000..ba0c7b0
Binary files /dev/null and b/public/images/aggregate_sand_gravel_piles_png_1773134775186.webp differ
diff --git a/public/images/boulders_landscaping_set_png_1773134585140.png b/public/images/boulders_landscaping_set_png_1773134585140.png
new file mode 100644
index 0000000..d9e7ea3
Binary files /dev/null and b/public/images/boulders_landscaping_set_png_1773134585140.png differ
diff --git a/public/images/boulders_landscaping_set_png_1773134585140.webp b/public/images/boulders_landscaping_set_png_1773134585140.webp
new file mode 100644
index 0000000..677a0b7
Binary files /dev/null and b/public/images/boulders_landscaping_set_png_1773134585140.webp differ
diff --git a/public/images/delivery_truck_logistics_png_1773134721043.png b/public/images/delivery_truck_logistics_png_1773134721043.png
new file mode 100644
index 0000000..8c76174
Binary files /dev/null and b/public/images/delivery_truck_logistics_png_1773134721043.png differ
diff --git a/public/images/delivery_truck_logistics_png_1773134721043.webp b/public/images/delivery_truck_logistics_png_1773134721043.webp
new file mode 100644
index 0000000..6286d7e
Binary files /dev/null and b/public/images/delivery_truck_logistics_png_1773134721043.webp differ
diff --git a/public/images/flagstone_pathway_garden_png_1773134755795.png b/public/images/flagstone_pathway_garden_png_1773134755795.png
new file mode 100644
index 0000000..4a6f842
Binary files /dev/null and b/public/images/flagstone_pathway_garden_png_1773134755795.png differ
diff --git a/public/images/flagstone_pathway_garden_png_1773134755795.webp b/public/images/flagstone_pathway_garden_png_1773134755795.webp
new file mode 100644
index 0000000..52ba1af
Binary files /dev/null and b/public/images/flagstone_pathway_garden_png_1773134755795.webp differ
diff --git a/public/images/flagstone_stack_premium_png_1773134568102.png b/public/images/flagstone_stack_premium_png_1773134568102.png
new file mode 100644
index 0000000..6785b40
Binary files /dev/null and b/public/images/flagstone_stack_premium_png_1773134568102.png differ
diff --git a/public/images/flagstone_stack_premium_png_1773134568102.webp b/public/images/flagstone_stack_premium_png_1773134568102.webp
new file mode 100644
index 0000000..5139348
Binary files /dev/null and b/public/images/flagstone_stack_premium_png_1773134568102.webp differ
diff --git a/public/images/hero_about.png b/public/images/hero_about.png
new file mode 100644
index 0000000..ba7015a
Binary files /dev/null and b/public/images/hero_about.png differ
diff --git a/public/images/hero_about.webp b/public/images/hero_about.webp
new file mode 100644
index 0000000..b9120fe
Binary files /dev/null and b/public/images/hero_about.webp differ
diff --git a/public/images/hero_landscaping.png b/public/images/hero_landscaping.png
new file mode 100644
index 0000000..b970b44
Binary files /dev/null and b/public/images/hero_landscaping.png differ
diff --git a/public/images/hero_landscaping.webp b/public/images/hero_landscaping.webp
new file mode 100644
index 0000000..53515c7
Binary files /dev/null and b/public/images/hero_landscaping.webp differ
diff --git a/public/images/hero_main.png b/public/images/hero_main.png
new file mode 100644
index 0000000..cc873ac
Binary files /dev/null and b/public/images/hero_main.png differ
diff --git a/public/images/hero_main.webp b/public/images/hero_main.webp
new file mode 100644
index 0000000..370dbc4
Binary files /dev/null and b/public/images/hero_main.webp differ
diff --git a/public/images/hero_masonry.png b/public/images/hero_masonry.png
new file mode 100644
index 0000000..4bd32e3
Binary files /dev/null and b/public/images/hero_masonry.png differ
diff --git a/public/images/hero_masonry.webp b/public/images/hero_masonry.webp
new file mode 100644
index 0000000..172d825
Binary files /dev/null and b/public/images/hero_masonry.webp differ
diff --git a/public/images/hero_masonry_landscaping_png_1773134515262.png b/public/images/hero_masonry_landscaping_png_1773134515262.png
new file mode 100644
index 0000000..7daf328
Binary files /dev/null and b/public/images/hero_masonry_landscaping_png_1773134515262.png differ
diff --git a/public/images/hero_masonry_landscaping_png_1773134515262.webp b/public/images/hero_masonry_landscaping_png_1773134515262.webp
new file mode 100644
index 0000000..e700043
Binary files /dev/null and b/public/images/hero_masonry_landscaping_png_1773134515262.webp differ
diff --git a/public/images/landscaping_pebbles_bulk_png_1773134548796.png b/public/images/landscaping_pebbles_bulk_png_1773134548796.png
new file mode 100644
index 0000000..b10aebd
Binary files /dev/null and b/public/images/landscaping_pebbles_bulk_png_1773134548796.png differ
diff --git a/public/images/landscaping_pebbles_bulk_png_1773134548796.webp b/public/images/landscaping_pebbles_bulk_png_1773134548796.webp
new file mode 100644
index 0000000..df3c6eb
Binary files /dev/null and b/public/images/landscaping_pebbles_bulk_png_1773134548796.webp differ
diff --git a/public/images/masonry_cement_pallets_png_1773134601636.png b/public/images/masonry_cement_pallets_png_1773134601636.png
new file mode 100644
index 0000000..75b6717
Binary files /dev/null and b/public/images/masonry_cement_pallets_png_1773134601636.png differ
diff --git a/public/images/masonry_cement_pallets_png_1773134601636.webp b/public/images/masonry_cement_pallets_png_1773134601636.webp
new file mode 100644
index 0000000..9205066
Binary files /dev/null and b/public/images/masonry_cement_pallets_png_1773134601636.webp differ
diff --git a/public/images/masonry_tools_display_png_1773134531475.png b/public/images/masonry_tools_display_png_1773134531475.png
new file mode 100644
index 0000000..d7411fa
Binary files /dev/null and b/public/images/masonry_tools_display_png_1773134531475.png differ
diff --git a/public/images/masonry_tools_display_png_1773134531475.webp b/public/images/masonry_tools_display_png_1773134531475.webp
new file mode 100644
index 0000000..3983de0
Binary files /dev/null and b/public/images/masonry_tools_display_png_1773134531475.webp differ
diff --git a/public/images/mexico_pebbles_black_png_1773134740198.png b/public/images/mexico_pebbles_black_png_1773134740198.png
new file mode 100644
index 0000000..4201f6c
Binary files /dev/null and b/public/images/mexico_pebbles_black_png_1773134740198.png differ
diff --git a/public/images/mexico_pebbles_black_png_1773134740198.webp b/public/images/mexico_pebbles_black_png_1773134740198.webp
new file mode 100644
index 0000000..a1050f0
Binary files /dev/null and b/public/images/mexico_pebbles_black_png_1773134740198.webp differ
diff --git a/public/images/product_alamo_type_n.png b/public/images/product_alamo_type_n.png
new file mode 100644
index 0000000..4fc82e8
Binary files /dev/null and b/public/images/product_alamo_type_n.png differ
diff --git a/public/images/product_alamo_type_n.webp b/public/images/product_alamo_type_n.webp
new file mode 100644
index 0000000..18c8b3d
Binary files /dev/null and b/public/images/product_alamo_type_n.webp differ
diff --git a/public/images/product_alamo_white_portland.png b/public/images/product_alamo_white_portland.png
new file mode 100644
index 0000000..02a52c9
Binary files /dev/null and b/public/images/product_alamo_white_portland.png differ
diff --git a/public/images/product_alamo_white_portland.webp b/public/images/product_alamo_white_portland.webp
new file mode 100644
index 0000000..71fed77
Binary files /dev/null and b/public/images/product_alamo_white_portland.webp differ
diff --git a/public/images/product_mexico_pebbles_multi.png b/public/images/product_mexico_pebbles_multi.png
new file mode 100644
index 0000000..7590d34
Binary files /dev/null and b/public/images/product_mexico_pebbles_multi.png differ
diff --git a/public/images/product_mexico_pebbles_multi.webp b/public/images/product_mexico_pebbles_multi.webp
new file mode 100644
index 0000000..ba54a85
Binary files /dev/null and b/public/images/product_mexico_pebbles_multi.webp differ
diff --git a/public/logo-clean.png b/public/logo-clean.png
new file mode 100644
index 0000000..abfec42
Binary files /dev/null and b/public/logo-clean.png differ
diff --git a/public/logo-clean1.png b/public/logo-clean1.png
new file mode 100644
index 0000000..3623bdb
Binary files /dev/null and b/public/logo-clean1.png differ
diff --git a/public/logo_v2.png b/public/logo_v2.png
new file mode 100644
index 0000000..d6229b3
Binary files /dev/null and b/public/logo_v2.png differ
diff --git a/public/masonrytools/2-1024x5771.jpg b/public/masonrytools/2-1024x5771.jpg
new file mode 100644
index 0000000..fef2258
Binary files /dev/null and b/public/masonrytools/2-1024x5771.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_083544-1024x5762.jpg b/public/masonrytools/thumbnail_20191106_083544-1024x5762.jpg
new file mode 100644
index 0000000..5228ef7
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_083544-1024x5762.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_083757-1024x5763.jpg b/public/masonrytools/thumbnail_20191106_083757-1024x5763.jpg
new file mode 100644
index 0000000..0c929a8
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_083757-1024x5763.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_083933-1024x5764.jpg b/public/masonrytools/thumbnail_20191106_083933-1024x5764.jpg
new file mode 100644
index 0000000..8594188
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_083933-1024x5764.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_095116-1024x5765.jpg b/public/masonrytools/thumbnail_20191106_095116-1024x5765.jpg
new file mode 100644
index 0000000..c6071fa
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_095116-1024x5765.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_095340-1024x5766.jpg b/public/masonrytools/thumbnail_20191106_095340-1024x5766.jpg
new file mode 100644
index 0000000..70fcd8d
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_095340-1024x5766.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_100250-1024x5767.jpg b/public/masonrytools/thumbnail_20191106_100250-1024x5767.jpg
new file mode 100644
index 0000000..7fe50ba
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_100250-1024x5767.jpg differ
diff --git a/public/masonrytools/thumbnail_20191106_100308-1024x5768.jpg b/public/masonrytools/thumbnail_20191106_100308-1024x5768.jpg
new file mode 100644
index 0000000..cfac085
Binary files /dev/null and b/public/masonrytools/thumbnail_20191106_100308-1024x5768.jpg differ
diff --git a/public/masonrytools/thumbnail_20210913_0953139.jpg b/public/masonrytools/thumbnail_20210913_0953139.jpg
new file mode 100644
index 0000000..56eaf6a
Binary files /dev/null and b/public/masonrytools/thumbnail_20210913_0953139.jpg differ
diff --git a/public/mexicobeachpebbles/188500405_2993718674246066_2933173565393514824_n.jpg b/public/mexicobeachpebbles/188500405_2993718674246066_2933173565393514824_n.jpg
new file mode 100644
index 0000000..5f770e0
Binary files /dev/null and b/public/mexicobeachpebbles/188500405_2993718674246066_2933173565393514824_n.jpg differ
diff --git a/public/mexicobeachpebbles/20220829_090518-scaled.jpg b/public/mexicobeachpebbles/20220829_090518-scaled.jpg
new file mode 100644
index 0000000..f9eda44
Binary files /dev/null and b/public/mexicobeachpebbles/20220829_090518-scaled.jpg differ
diff --git a/public/mexicobeachpebbles/247999000_3110885482529384_6726596750678107116_n.jpg b/public/mexicobeachpebbles/247999000_3110885482529384_6726596750678107116_n.jpg
new file mode 100644
index 0000000..c5f3abd
Binary files /dev/null and b/public/mexicobeachpebbles/247999000_3110885482529384_6726596750678107116_n.jpg differ
diff --git a/public/mexicobeachpebbles/280754678_3262764467341484_1718282480469990117_n.jpg b/public/mexicobeachpebbles/280754678_3262764467341484_1718282480469990117_n.jpg
new file mode 100644
index 0000000..10b577a
Binary files /dev/null and b/public/mexicobeachpebbles/280754678_3262764467341484_1718282480469990117_n.jpg differ
diff --git a/public/mexicobeachpebbles/280782259_3262766134007984_7989147786748639370_n.jpg b/public/mexicobeachpebbles/280782259_3262766134007984_7989147786748639370_n.jpg
new file mode 100644
index 0000000..676f747
Binary files /dev/null and b/public/mexicobeachpebbles/280782259_3262766134007984_7989147786748639370_n.jpg differ
diff --git a/public/mexicobeachpebbles/thumbnail_20200716_135254.jpg b/public/mexicobeachpebbles/thumbnail_20200716_135254.jpg
new file mode 100644
index 0000000..06a1967
Binary files /dev/null and b/public/mexicobeachpebbles/thumbnail_20200716_135254.jpg differ
diff --git a/public/mexicobeachpebbles/thumbnail_20200819_135939.jpg b/public/mexicobeachpebbles/thumbnail_20200819_135939.jpg
new file mode 100644
index 0000000..1c71168
Binary files /dev/null and b/public/mexicobeachpebbles/thumbnail_20200819_135939.jpg differ
diff --git a/public/mexicobeachpebbles/thumbnail_20210615_141826-rotated.jpg b/public/mexicobeachpebbles/thumbnail_20210615_141826-rotated.jpg
new file mode 100644
index 0000000..5204015
Binary files /dev/null and b/public/mexicobeachpebbles/thumbnail_20210615_141826-rotated.jpg differ
diff --git a/public/sandgravel/5-8-Black-Star-2.jpg b/public/sandgravel/5-8-Black-Star-2.jpg
new file mode 100644
index 0000000..fe436b2
Binary files /dev/null and b/public/sandgravel/5-8-Black-Star-2.jpg differ
diff --git a/public/sandgravel/Black-Star-2.jpg b/public/sandgravel/Black-Star-2.jpg
new file mode 100644
index 0000000..a645c42
Binary files /dev/null and b/public/sandgravel/Black-Star-2.jpg differ
diff --git a/public/sandgravel/Bull-Rock-1-2.jpg b/public/sandgravel/Bull-Rock-1-2.jpg
new file mode 100644
index 0000000..e268515
Binary files /dev/null and b/public/sandgravel/Bull-Rock-1-2.jpg differ
diff --git a/public/sandgravel/Decomposed-Granite-2.jpg b/public/sandgravel/Decomposed-Granite-2.jpg
new file mode 100644
index 0000000..1bbd7bf
Binary files /dev/null and b/public/sandgravel/Decomposed-Granite-2.jpg differ
diff --git a/public/sandgravel/Pea-Gravel.jpg b/public/sandgravel/Pea-Gravel.jpg
new file mode 100644
index 0000000..3bee1fa
Binary files /dev/null and b/public/sandgravel/Pea-Gravel.jpg differ
diff --git a/public/sandgravel/White-Marble.jpg b/public/sandgravel/White-Marble.jpg
new file mode 100644
index 0000000..100390a
Binary files /dev/null and b/public/sandgravel/White-Marble.jpg differ
diff --git a/public/sandgravel/thumbnail_20191004_084419.jpg b/public/sandgravel/thumbnail_20191004_084419.jpg
new file mode 100644
index 0000000..af439f4
Binary files /dev/null and b/public/sandgravel/thumbnail_20191004_084419.jpg differ
diff --git a/public/sandgravel/thumbnail_20200115_154703.jpg b/public/sandgravel/thumbnail_20200115_154703.jpg
new file mode 100644
index 0000000..001057e
Binary files /dev/null and b/public/sandgravel/thumbnail_20200115_154703.jpg differ
diff --git a/public/sandgravel/thumbnail_20200218_103916.jpg b/public/sandgravel/thumbnail_20200218_103916.jpg
new file mode 100644
index 0000000..61a9700
Binary files /dev/null and b/public/sandgravel/thumbnail_20200218_103916.jpg differ
diff --git a/public/sandgravel/thumbnail_20200218_104001.jpg b/public/sandgravel/thumbnail_20200218_104001.jpg
new file mode 100644
index 0000000..606db1b
Binary files /dev/null and b/public/sandgravel/thumbnail_20200218_104001.jpg differ
diff --git a/public/sandgravel/thumbnail_20230523_105335.jpg b/public/sandgravel/thumbnail_20230523_105335.jpg
new file mode 100644
index 0000000..f76bfda
Binary files /dev/null and b/public/sandgravel/thumbnail_20230523_105335.jpg differ
diff --git a/public/sandgravel/thumbnail_20231003_112820.jpg b/public/sandgravel/thumbnail_20231003_112820.jpg
new file mode 100644
index 0000000..f3034f8
Binary files /dev/null and b/public/sandgravel/thumbnail_20231003_112820.jpg differ
diff --git a/reference/Screenshot 2026-03-10 131036.png b/reference/Screenshot 2026-03-10 131036.png
new file mode 100644
index 0000000..b084192
Binary files /dev/null and b/reference/Screenshot 2026-03-10 131036.png differ
diff --git a/reference/Screenshot 2026-03-10 131118.png b/reference/Screenshot 2026-03-10 131118.png
new file mode 100644
index 0000000..d25803b
Binary files /dev/null and b/reference/Screenshot 2026-03-10 131118.png differ
diff --git a/reference/Screenshot 2026-03-10 131133.png b/reference/Screenshot 2026-03-10 131133.png
new file mode 100644
index 0000000..6ebffc1
Binary files /dev/null and b/reference/Screenshot 2026-03-10 131133.png differ
diff --git a/reference/Screenshot 2026-03-10 131147.png b/reference/Screenshot 2026-03-10 131147.png
new file mode 100644
index 0000000..398f155
Binary files /dev/null and b/reference/Screenshot 2026-03-10 131147.png differ
diff --git a/screen.png b/screen.png
new file mode 100644
index 0000000..ae249f5
Binary files /dev/null and b/screen.png differ
diff --git a/screen2.png b/screen2.png
new file mode 100644
index 0000000..66eb9eb
Binary files /dev/null and b/screen2.png differ
diff --git a/screen3.png b/screen3.png
new file mode 100644
index 0000000..562e994
Binary files /dev/null and b/screen3.png differ
diff --git a/screen4.png b/screen4.png
new file mode 100644
index 0000000..fde5904
Binary files /dev/null and b/screen4.png differ
diff --git a/screen5.png b/screen5.png
new file mode 100644
index 0000000..cf4f621
Binary files /dev/null and b/screen5.png differ
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..45cc6eb
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,41 @@
+{
+ "compilerOptions": {
+ "target": "ES2017",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ }
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
new file mode 100644
index 0000000..9d48a5f
--- /dev/null
+++ b/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/entry-constants.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/lib/bundler.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/debug-channel.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/client/components/readonly-url-search-params.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/app-router-types.d.ts","./node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","./node_modules/next/dist/client/components/segment-cache/types.d.ts","./node_modules/next/dist/client/components/segment-cache/navigation.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","./node_modules/next/dist/server/load-default-error-components.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/staged-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/server/request/search-params.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/shared/lib/size-limit.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/build/adapter/build-complete.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/unrecognized-action-error.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./.next/types/routes.d.ts","./next-env.d.ts","./next.config.ts","./data/site-content.ts","./lib/seo.ts","./app/robots.ts","./app/sitemap.ts","./app/api/contact/route.ts","./components/brand-logo.tsx","./components/site-footer.tsx","./components/site-header.tsx","./components/scroll-reveal.tsx","./components/json-ld.tsx","./app/layout.tsx","./app/not-found.tsx","./components/process-timeline.tsx","./components/breadcrumbs.tsx","./node_modules/motion-utils/dist/index.d.ts","./node_modules/motion-dom/dist/index.d.ts","./node_modules/framer-motion/dist/types.d-docc-kzb.d.ts","./node_modules/framer-motion/dist/types/index.d.ts","./components/testimonials-carousel.tsx","./components/home-cta-section.tsx","./components/motion-section.tsx","./components/hero-cinema.tsx","./components/count-up-stat.tsx","./app/page.tsx","./components/page-hero-motion.tsx","./app/about/page.tsx","./components/contact-form.tsx","./app/contact/page.tsx","./components/material-catalog.tsx","./app/landscaping-supplies/page.tsx","./app/masonry-supplies/page.tsx","./app/products/page.tsx","./.next/types/validator.ts","./.next/dev/types/cache-life.d.ts","./.next/dev/types/routes.d.ts","./.next/dev/types/validator.ts"],"fileIdsList":[[95,137,455,456,457,458],[95,137],[95,137,265,499,502,512,518,531,533,535,537,538,539,542],[95,137,265,499,502,505,512,518,531,533,535,537,538,539],[95,137,265,475,477,508,509,517,521,528,532],[95,137,265,499],[83,95,137,265,475,477,508,509,517,521,528,532,534],[95,137,265,475,508,509,517,521,532,536],[95,137,265,503,508,509,514,515,516,517],[95,137,265,477],[95,137,265,475,477,508,509,517,520,521,526,527,528,529,530],[95,137,265,475,477,487,509,517,521],[95,137,265,503,509],[95,137,265],[83,95,137,265,487],[83,95,137,265,525],[83,95,137,265,475,508],[83,95,137,265,477,508,525],[83,95,137,265,475,477,508],[83,95,137,265,508],[83,95,137,265],[95,137,265,477,508,513],[83,95,137,265,477,508,513],[95,137,265,525],[95,137,265,503,508],[95,137,503,504,505],[95,137,265,503],[95,134,137],[95,136,137],[137],[95,137,142,172],[95,137,138,143,149,150,157,169,180],[95,137,138,139,149,157],[90,91,92,95,137],[95,137,140,181],[95,137,141,142,150,158],[95,137,142,169,177],[95,137,143,145,149,157],[95,136,137,144],[95,137,145,146],[95,137,149],[95,137,147,149],[95,136,137,149],[95,137,149,150,151,169,180],[95,137,149,150,151,164,169,172],[95,132,137,185],[95,132,137,145,149,152,157,169,180],[95,137,149,150,152,153,157,169,177,180],[95,137,152,154,169,177,180],[93,94,95,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[95,137,149,155],[95,137,156,180],[95,137,145,149,157,169],[95,137,158],[95,137,159],[95,136,137,160],[95,134,135,136,137,138,139,140,141,142,143,144,145,146,147,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[95,137,162],[95,137,163],[95,137,149,164,165],[95,137,164,166,181,183],[95,137,149,169,170,172],[95,137,169,171],[95,137,169,170],[95,137,172],[95,137,173],[95,134,137,169],[95,137,149,175,176],[95,137,175,176],[95,137,142,157,169,177],[95,137,178],[95,137,157,179],[95,137,152,163,180],[95,137,142,181],[95,137,169,182],[95,137,156,183],[95,137,184],[95,137,142,149,151,160,169,180,183,185],[95,137,169,186],[83,95,137,190,192],[83,95,137],[83,87,95,137,188,189,190,191,450,496],[83,95,137,408],[83,87,95,137,189,192,450,496],[83,87,95,137,188,192,450,496],[81,82,95,137],[83,95,137,523],[83,95,137,265,522,523,524],[95,137,522],[95,137,453],[95,137,197,199,203,214,404,433,446],[95,137,199,209,210,211,213,446],[95,137,199,246,248,250,251,254,446,448],[95,137,199,203,205,206,207,237,332,404,423,424,432,446,448],[95,137,446],[95,137,210,302,412,421,441],[95,137,199],[95,137,193,302,441],[95,137,256],[95,137,255,446],[95,137,152,402,412,501],[95,137,152,370,382,421,440],[95,137,152,313],[95,137,426],[95,137,425,426,427],[95,137,425],[89,95,137,152,193,199,203,206,208,210,214,215,228,229,256,332,343,422,433,446,450],[95,137,197,199,212,246,247,252,253,446,501],[95,137,212,501],[95,137,197,229,357,446,501],[95,137,501],[95,137,199,212,213,501],[95,137,249,501],[95,137,215,423,431],[95,137,163,265,441],[95,137,265,441],[83,95,137,374],[95,137,300,310,311,441,478,485],[95,137,299,418,479,480,481,482,484],[95,137,417],[95,137,417,418],[95,137,237,302,303,307],[95,137,302],[95,137,302,306,308],[95,137,302,303,304,305],[95,137,483],[83,95,137,200,472],[83,95,137,180],[83,95,137,212,292],[83,95,137,212,433],[95,137,290,294],[83,95,137,291,452],[83,87,95,137,152,187,188,189,192,450,494,495],[95,137,152],[95,137,152,203,236,288,333,354,356,428,429,433,446,447],[95,137,228,430],[95,137,450],[95,137,198],[83,95,137,359,372,381,391,393,440],[95,137,163,359,372,390,391,392,440,500],[95,137,384,385,386,387,388,389],[95,137,386],[95,137,390],[95,137,263,264,265,267],[83,95,137,257,258,259,260,266],[95,137,263,266],[95,137,261],[95,137,262],[83,95,137,265,291,452],[83,95,137,265,451,452],[83,95,137,265,452],[95,137,333,435],[95,137,435],[95,137,152,447,452],[95,137,378],[95,136,137,377],[95,137,238,302,319,356,365,368,370,371,411,440,443,447],[95,137,284,302,399],[95,137,370,440],[83,95,137,370,375,376,378,379,380,381,382,383,394,395,396,397,398,400,401,440,441,501],[95,137,364],[95,137,152,163,200,236,239,260,285,286,333,343,354,355,411,434,446,447,448,450,501],[95,137,440],[95,136,137,210,286,343,367,434,436,437,438,439,447],[95,137,370],[95,136,137,236,273,319,360,361,362,363,364,365,366,368,369,440,441],[95,137,152,273,274,360,447,448],[95,137,210,333,343,356,434,440,447],[95,137,152,446,448],[95,137,152,169,443,447,448],[95,137,152,163,180,193,203,212,238,239,241,270,275,280,284,285,286,288,317,319,321,324,326,329,330,331,332,354,356,433,434,441,443,446,447,448],[95,137,152,169],[95,137,199,200,201,208,443,444,445,450,452,501],[95,137,197,446],[95,137,269],[95,137,152,169,180,231,254,256,257,258,259,260,267,268,501],[95,137,163,180,193,231,246,279,280,281,317,318,319,324,332,333,339,342,344,354,356,434,441,443,446],[95,137,208,215,228,332,343,434,446],[95,137,152,180,200,203,319,337,443,446],[95,137,358],[95,137,152,269,340,341,351],[95,137,443,446],[95,137,365,367],[95,137,286,319,433,452],[95,137,152,163,242,246,318,324,339,342,346,443],[95,137,152,215,228,246,347],[95,137,199,241,349,433,446],[95,137,152,180,260,446],[95,137,152,212,240,241,242,251,269,348,350,433,446],[89,95,137,152,286,353,450,452],[95,137,316,354],[95,137,152,163,180,203,214,215,228,238,239,275,279,280,281,285,317,318,319,321,333,334,336,338,354,356,433,434,441,442,443,452],[95,137,152,169,215,339,345,351,443],[95,137,218,219,220,221,222,223,224,225,226,227],[95,137,270,325],[95,137,327],[95,137,325],[95,137,327,328],[95,137,152,203,206,236,237,447],[95,137,152,163,198,200,238,284,285,286,287,315,354,443,448,450,452],[95,137,152,163,180,202,237,287,319,365,434,442,447],[95,137,360],[95,137,361],[95,137,302,332,411],[95,137,362],[95,137,230,234],[95,137,152,203,230,238],[95,137,233,234],[95,137,235],[95,137,230,231],[95,137,230,282],[95,137,230],[95,137,270,323,442],[95,137,322],[95,137,231,441,442],[95,137,320,442],[95,137,231,441],[95,137,411],[95,137,203,232,238,286,302,319,353,356,359,365,372,373,403,404,407,410,433,443,447],[95,137,295,298,300,301,310,311],[83,95,137,190,192,265,405,406],[83,95,137,190,192,265,405,406,409],[95,137,420],[95,137,210,274,286,353,356,370,378,382,413,414,415,416,418,419,422,433,440,446],[95,137,310],[95,137,152,315],[95,137,315],[95,137,152,238,283,288,312,314,353,443,450,452],[95,137,295,296,297,298,300,301,310,311,451],[89,95,137,152,163,180,230,231,239,285,286,319,351,352,354,433,434,443,446,447,450],[95,137,274,276,279,434],[95,137,152,270,446],[95,137,273,370],[95,137,272],[95,137,274,275],[95,137,271,273,446],[95,137,152,202,274,276,277,278,446,447],[83,95,137,302,309,441],[95,137,195,196],[83,95,137,200],[83,95,137,299,441],[83,89,95,137,285,286,450,452],[95,137,200,472,473],[83,95,137,294],[83,95,137,163,180,198,253,289,291,293,452],[95,137,212,441,447],[95,137,335,441],[83,95,137,150,152,163,197,198,248,294,450,451],[83,95,137,188,189,192,450,496],[83,84,85,86,87,95,137],[95,137,142],[95,137,243,244,245],[95,137,243],[83,87,95,137,152,154,163,187,188,189,190,192,193,198,239,346,390,448,449,452,496],[95,137,460],[95,137,462],[95,137,464],[95,137,466],[95,137,468,469,470],[95,137,474],[88,95,137,454,459,461,463,465,467,471,475,477,487,488,490,499,500,501,502],[95,137,476],[95,137,486],[95,137,291],[95,137,489],[95,136,137,274,276,277,279,491,492,493,496,497,498],[95,137,187],[95,137,169,187],[95,104,108,137,180],[95,104,137,169,180],[95,99,137],[95,101,104,137,177,180],[95,137,157,177],[95,99,137,187],[95,101,104,137,157,180],[95,96,97,100,103,137,149,169,180],[95,104,111,137],[95,96,102,137],[95,104,125,126,137],[95,100,104,137,172,180,187],[95,125,137,187],[95,98,99,137,187],[95,104,137],[95,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,137],[95,104,119,137],[95,104,111,112,137],[95,102,104,112,113,137],[95,103,137],[95,96,99,104,137],[95,104,108,112,113,137],[95,108,137],[95,102,104,107,137,180],[95,96,101,104,111,137],[95,137,169],[95,99,104,125,137,185,187]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"51409be337d5cdf32915ace99a4c49bf62dbc124a49135120dfdff73236b0bad","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"8fa51737611c21ba3a5ac02c4e1535741d58bec67c9bdf94b1837a31c97a2263","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"d2bc987ae352271d0d615a420dcf98cc886aa16b87fb2b569358c1fe0ca0773d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0539c58717cbc8b73acb29f9e992ab5ff20adba5f9b57130691c7f9b186a4d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"f9677e434b7a3b14f0a9367f9dfa1227dfe3ee661792d0085523c3191ae6a1a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"9057f224b79846e3a95baf6dad2c8103278de2b0c5eebda23fc8188171ad2398","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ff5a53a58e756d2661b73ba60ffe274231a4432d21f7a2d0d9e4f6aa99f4283","impliedFormat":1},{"version":"1e289f30a48126935a5d408a91129a13a59c9b0f8c007a816f9f16ef821e144e","impliedFormat":1},{"version":"2ea254f944dfe131df1264d1fb96e4b1f7d110195b21f1f5dbb68fdd394e5518","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"f579f267a2f4c2278cca2ec84613e95059368b503ce96586972d304e5e40125b","affectsGlobalScope":true,"impliedFormat":1},{"version":"23459c1915878a7c1e86e8bdb9c187cddd3aea105b8b1dfce512f093c969bc7e","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"5f6f1d54779d0b9ed152b0516b0958cd34889764c1190434bbf18e7a8bb884cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"f7b1df115dbd1b8522cba4f404a9f4fdcd5169e2137129187ffeee9d287e4fd1","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"fbf68fc8057932b1c30107ebc37420f8d8dc4bef1253c4c2f9e141886c0df5ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"993985beef40c7d113f6dd8f0ba26eed63028b691fbfeb6a5b63f26408dd2c6d","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb094bb347d7df3380299eb69836c2c8758626ecf45917577707c03cf816b6f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"b02784111b3fc9c38590cd4339ff8718f9329a6f4d3fd66e9744a1dcd1d7e191","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"f23dfbb07f71e879e5a23cdd5a1f7f1585c6a8aae8c250b6eba13600956c72dd","impliedFormat":1},{"version":"b2ba94df355e65e967875bf67ea1bbf6d5a0e8dc141a3d36d5b6d7c3c0f234b6","impliedFormat":1},{"version":"115b2ad73fa7d175cd71a5873d984c21593b2a022f1a2036cc39d9f53629e5dc","impliedFormat":1},{"version":"1be330b3a0b00590633f04c3b35db7fa618c9ee079258e2b24c137eb4ffcd728","impliedFormat":1},{"version":"45a9b3079cd70a2668f441b79b4f4356b4e777788c19f29b6f42012a749cfea6","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"5c9b31919ea1cb350a7ae5e71c9ced8f11723e4fa258a8cc8d16ae46edd623c7","impliedFormat":1},{"version":"4aa42ce8383b45823b3a1d3811c0fdd5f939f90254bc4874124393febbaf89f6","impliedFormat":1},{"version":"96ffa70b486207241c0fcedb5d9553684f7fa6746bc2b04c519e7ebf41a51205","impliedFormat":1},{"version":"3677988e03b749874eb9c1aa8dc88cd77b6005e5c4c39d821cda7b80d5388619","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f4625edcb57b37b84506e8b276eb59ca30d31f88c6656d29d4e90e3bc58e69df","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"c685d9f68c70fe11ce527287526585a06ea13920bb6c18482ca84945a4e433a7","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"4e01846df98d478a2a626ec3641524964b38acaac13945c2db198bf9f3df22ee","impliedFormat":1},{"version":"678d6d4c43e5728bf66e92fc2269da9fa709cb60510fed988a27161473c3853f","impliedFormat":1},{"version":"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"e2a37ac938c4bede5bb284b9d2d042da299528f1e61f6f57538f1bd37d760869","impliedFormat":1},{"version":"76def37aff8e3a051cf406e10340ffba0f28b6991c5d987474cc11137796e1eb","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"bfb7f8475428637bee12bdd31bd9968c1c8a1cc2c3e426c959e2f3a307f8936f","impliedFormat":1},{"version":"6f491d0108927478d3247bbbc489c78c2da7ef552fd5277f1ab6819986fdf0b1","impliedFormat":1},{"version":"594fe24fc54645ab6ccb9dba15d3a35963a73a395b2ef0375ea34bf181ccfd63","impliedFormat":1},{"version":"7cb0ee103671d1e201cd53dda12bc1cd0a35f1c63d6102720c6eeb322cb8e17e","impliedFormat":1},{"version":"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"803cd2aaf1921c218916c2c7ee3fce653e852d767177eb51047ff15b5b253893","impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"7ab12b2f1249187223d11a589f5789c75177a0b597b9eb7f8e2e42d045393347","impliedFormat":1},{"version":"ad37fb4be61c1035b68f532b7220f4e8236cf245381ce3b90ac15449ecfe7305","impliedFormat":1},{"version":"93436bd74c66baba229bfefe1314d122c01f0d4c1d9e35081a0c4f0470ac1a6c","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d","impliedFormat":1},{"version":"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"6e9082e91370de5040e415cd9f24e595b490382e8c7402c4e938a8ce4bccc99f","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"12d218a49dbe5655b911e6cc3c13b2c655e4c783471c3b0432137769c79e1b3c","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"6b0fc04121360f752d196ba35b6567192f422d04a97b2840d7d85f8b79921c92","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"42b81043b00ff27c6bd955aea0f6e741545f2265978bf364b614702b72a027ab","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"97e5ccc7bb88419005cbdf812243a5b3186cdef81b608540acabe1be163fc3e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"6b3453eebd474cc8acf6d759f1668e6ce7425a565e2996a20b644c72916ecf75","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"89cd3444e389e42c56fd0d072afef31387e7f4107651afd2c03950f22dc36f77","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"e39a304f882598138a8022106cb8de332abbbb87f3fee71c5ca6b525c11c51fc","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"fcdf3e40e4a01b9a4b70931b8b51476b210c511924fcfe3f0dae19c4d52f1a54","impliedFormat":1},{"version":"345c4327b637d34a15aba4b7091eb068d6ab40a3dedaab9f00986253c9704e53","impliedFormat":1},{"version":"3a788c7fb7b1b1153d69a4d1d9e1d0dfbcf1127e703bdb02b6d12698e683d1fb","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"2b5b70d7782fe028487a80a1c214e67bd610532b9f978b78fa60f5b4a359f77e","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"7e6ac205dcb9714f708354fd863bffa45cee90740706cc64b3b39b23ebb84744","impliedFormat":1},{"version":"61dc6e3ac78d64aa864eedd0a208b97b5887cc99c5ba65c03287bf57d83b1eb9","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"f730b468deecf26188ad62ee8950dc29aa2aea9543bb08ed714c3db019359fd9","impliedFormat":1},{"version":"933aee906d42ea2c53b6892192a8127745f2ec81a90695df4024308ba35a8ff4","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"144bc326e90b894d1ec78a2af3ffb2eb3733f4d96761db0ca0b6239a8285f972","impliedFormat":1},{"version":"a3e3f0efcae272ab8ee3298e4e819f7d9dd9ff411101f45444877e77cfeca9a4","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"58659b06d33fa430bee1105b75cf876c0a35b2567207487c8578aec51ca2d977","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"30e6520444df1a004f46fdc8096f3fe06f7bbd93d09c53ada9dcdde59919ccca","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"a58beefce74db00dbb60eb5a4bb0c6726fb94c7797c721f629142c0ae9c94306","impliedFormat":1},{"version":"41eeb453ccb75c5b2c3abef97adbbd741bd7e9112a2510e12f03f646dc9ad13d","impliedFormat":1},{"version":"502fa5863df08b806dbf33c54bee8c19f7e2ad466785c0fc35465d7c5ff80995","impliedFormat":1},{"version":"c91a2d08601a1547ffef326201be26db94356f38693bb18db622ae5e9b3d7c92","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"9586918b63f24124a5ca1d0cc2979821a8a57f514781f09fc5aa9cae6d7c0138","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"55095860901097726220b6923e35a812afdd49242a1246d7b0942ee7eb34c6e4","impliedFormat":1},{"version":"96171c03c2e7f314d66d38acd581f9667439845865b7f85da8df598ff9617476","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"d193c8a86144b3a87b22bc1f5534b9c3e0f5a187873ec337c289a183973a58fe","impliedFormat":1},{"version":"1a6e6ba8a07b74e3ad237717c0299d453f9ceb795dbc2f697d1f2dd07cb782d2","impliedFormat":1},{"version":"58d70c38037fc0f949243388ff7ae20cf43321107152f14a9d36ca79311e0ada","impliedFormat":1},{"version":"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82","impliedFormat":1},{"version":"190da5eac6478d61ab9731ab2146fbc0164af2117a363013249b7e7992f1cccb","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad","impliedFormat":1},{"version":"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"8a8c64dafaba11c806efa56f5c69f611276471bef80a1db1f71316ec4168acef","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"d0a4cac61fa080f2be5ebb68b82726be835689b35994ba0e22e3ed4d2bc45e3b","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"205a31b31beb7be73b8df18fcc43109cbc31f398950190a0967afc7a12cb478c","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"dba6c7006e14a98ec82999c6f89fbbbfd1c642f41db148535f3b77b8018829b8","impliedFormat":1},{"version":"7f897b285f22a57a5c4dc14a27da2747c01084a542b4d90d33897216dceeea2e","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"2ded4f930d6abfaa0625cf55e58f565b7cbd4ab5b574dd2cb19f0a83a2f0be8b","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"ca0f4d9068d652bad47e326cf6ba424ac71ab866e44b24ddb6c2bd82d129586a","affectsGlobalScope":true,"impliedFormat":1},{"version":"04d36005fcbeac741ac50c421181f4e0316d57d148d37cc321a8ea285472462b","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"88e9caa9c5d2ba629240b5913842e7c57c5c0315383b8dc9d436ef2b60f1c391","impliedFormat":1},{"version":"ddf68b3b62e49cf6fd93ba2351ad0fbbcf62ca2d5d7afc9f186114e4b481c3cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"a46dba563f70f32f9e45ae015f3de979225f668075d7a427f874e0f6db584991","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"02c4fc9e6bb27545fa021f6056e88ff5fdf10d9d9f1467f1d10536c6e749ac50","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4","impliedFormat":1},{"version":"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"d24ff95760ea2dfcc7c57d0e269356984e7046b7e0b745c80fea71559f15bdd8","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"13c1b657932e827a7ed510395d94fc8b743b9d053ab95b7cd829b2bc46fb06db","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"078131f3a722a8ad3fc0b724cd3497176513cdcb41c80f96a3acbda2a143b58e","impliedFormat":1},{"version":"8c70ddc0c22d85e56011d49fddfaae3405eb53d47b59327b9dd589e82df672e7","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"9e155d2255348d950b1f65643fb26c0f14f5109daf8bd9ee24a866ad0a743648","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"7a883e9c84e720810f86ef4388f54938a65caa0f4d181a64e9255e847a7c9f51","impliedFormat":1},{"version":"a0ba218ac1baa3da0d5d9c1ec1a7c2f8676c284e6f5b920d6d049b13fa267377","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"d408d6f32de8d1aba2ff4a20f1aa6a6edd7d92c997f63b90f8ad3f9017cf5e46","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"9d622ea608d43eb463c0c4538fd5baa794bc18ea0bb8e96cd2ab6fd483d55fe2","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"371bf6127c1d427836de95197155132501cb6b69ef8709176ce6e0b85d059264","impliedFormat":1},{"version":"2bafd700e617d3693d568e972d02b92224b514781f542f70d497a8fdf92d52a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5542d8a7ea13168cb573be0d1ba0d29460d59430fb12bb7bf4674efd5604e14c","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"b6c1f64158da02580f55e8a2728eda6805f79419aed46a930f43e68ad66a38fc","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"4c0a1233155afb94bd4d7518c75c84f98567cd5f13fc215d258de196cdb40d91","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e","impliedFormat":99},{"version":"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0","impliedFormat":99},{"version":"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"8fac4a15690b27612d8474fb2fc7cc00388df52d169791b78d1a3645d60b4c8b","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},{"version":"eb888c6f1edddecf46fb3e64f2b46912e4caa5c5ccec559305c1aafc16d020dd","affectsGlobalScope":true},"7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651",{"version":"d58056a1afb9e206f489637cc2abd5961964a7889b183c344ae20d30b06bf4c5","signature":"435a1e418e8338be3f39614b96b81a9aa2700bc8c27bc6b98f064ff9ce17c363"},{"version":"11811265149a0f4a93c7545bc4a5b0890c5e88ef1a81d048700cbb5f43a24d92","signature":"2659c46db849405a7fe417c88e7d97d33f0f7162a0603ff411a26601ebb90172"},{"version":"959189ca0a67625c6d071ac078e5a07a377f898c230a11b4be08cd0b59f0069b","signature":"6a087e7d846b2595823d003f114281594aeb5b10bbf4b905fc9b7f1bdf97c57b"},"ab2ddfe12aa6049e697866e90b2ac34415fde1cc9e61c3323098d15d2ce28414",{"version":"d95dbc93a143b9a3f641cb585859a279a1972e52278cf63b8a4cc46ee0cc815c","signature":"ebc450cf4888573aef03e1d85e34f8587789f7436e4c80a3f1417a66429a9a29"},{"version":"d8528c7777b0ff47c0e817db4ef03d3a5c9a016b717a4f3b01099df36e21cefd","signature":"969dfbac18a9d2938f69e8c81a4e834f66daf2628fdeebfa5335b08345ed4c61"},{"version":"f68a9fc31814220794331e3c92262bbd496ffd2e1eb6bbf10cab974d5ea052b3","signature":"2a8e9400b51900f646f7029e5742270a6cbe8388577ce356a5dcb93f1f873c1d"},{"version":"ca4a8e1ad482d39fa4d6da45e0eda5f0c241757bfbca72dd08928158b030ef88","signature":"a97d2df9ead1233ad1ee970356868ed1e6bf1a783b2c274d295f95513435e879"},{"version":"bd3e1fe35d9484e28581887c94e7d7f4ef594b149eead93d1b24878b09c2d496","signature":"fe8b18ec0f76baf5374f0b94375568326f77d76e0555779ffcef904de78bbaee"},{"version":"23ae6084ce3f59e1d646b22ce4d147775adbdf8f6dbf3f606aee9e0c209f3eaf","signature":"af90c4457c1289c5fa86b83a3a74ea9a05a0dd6195076ba3898d90458b2e7466"},{"version":"18c4ebc63991e65f3df82277039c184e4bf3c3faa21565140286743cb6914201","signature":"30092fb8337b17f0c9f47331a862d1997ef612e438566090c3fd8a4ba87c6a39"},"619352b3aa0cfb79424c89d3aefa730c59a7047373188cd9c3ab4dde63365cc4",{"version":"8d615785511df3dc5a0e84a63594cfe1d3eea29017c22451357900cb53d8c134","signature":"ecfd1bee66efd232643d94e93e82ad4b74aa7bc6be51a32385d2380b29adddda"},{"version":"7aa4f6b31e015035a6c168bfad7f9fa58ac3ea52f286a57435dae344000a2878","signature":"094d5295f329cf6927538c673d45bc708da056aa92c4044018afa8ee4d9e6d7a"},{"version":"5c1858d7a9f34077da34838837215ae1f3457ad026e2a0a308ea5e12580cebfd","signature":"4e6649bb481ac0246e76fa446bd9abf4eee1d43d3332eae8010b5ec5e081a23e"},{"version":"37c7961117708394f64361ade31a41f96cef7f2a6606300821c72438dd4abda3","impliedFormat":1},{"version":"d519b53ae419dfdb7c9fa4406f15b4f9b75611a243b0880cf8d431e4dae26d97","affectsGlobalScope":true,"impliedFormat":1},{"version":"3d9189f26f01d4e36d3fb380810ef5999992235282e3c293da77d1d8aed09d9f","impliedFormat":1},{"version":"3787007c141f3168eddd3a2f0c1bc7518892336835811c8e1ca0dee48601f66e","impliedFormat":1},{"version":"a0a5a9745ae7cf2357b6dbafe9832d5d0371eedf6ee2adb377afed323ad4dcb1","signature":"32c87a474a1ceb808452e305b0eaa05278ca3afcd153888e24bc3b6ac9b0d651"},{"version":"c01819fcf604e96bfd2475c4e25d1fc6b255364a0c6a3d0587b1faa259a5a0b4","signature":"6d1644580c8e22423150af9a0824d78844482daab113a1ac931ea56f7954b121"},{"version":"e4fcbfff46437e715ad470ecb0505c7372422a491e26db1d2bd7212800a77745","signature":"cca7e99df589263fd224c806a37186a7db3c2440dd101745b54c3e3e7878764d"},{"version":"7454e453589f5ec82aff8ac3fea7bdf63c0c604829e1018a50c60694a64a86f5","signature":"643fcb9422334be94a9bce4cd60dac6937f10758b036e7fabced987e1bcd247c"},{"version":"64f29dd0de75ab0638c3e5583c49e2569766d79b5b95f1088c468c7691cd4e8e","signature":"0d4c9733b0c718be36a06bdfaac43bcd63fd9b27f5e061c88efbba1626751cf9"},{"version":"6024ea1e34328be6280277a1c06e646d3c35940c9a737ddb374486c4a620b625","signature":"bf32840324ca1e4187fbdf1065fbacdea0b9541af17c6cf25d023ecf16288318"},{"version":"726e2c9e7c96f21fd76346473d5f4ef74056983467a0168b7249ba285970ffd8","signature":"ab9b60dde73de89fe5ccedce8f18ce46e8968db267223b3c8566d96696219abf"},"43eaee4c6d1b2541438b83bdccd9551fe546849e05c8e6c5ad8edbbbd6d42606",{"version":"0848aea8698179a9761ba9820bc226c51cdb39e22101ea4ac6c1119baa38396f","signature":"8a6a95c7b6427ff60ae76fcbf49ecf0b9636822136565d4c2385dbace3a238a7"},{"version":"d1bce48040e941b5f7dd6482d4830c93c963c49cffdbeb6058f78182a97fd05e","signature":"480963290f804066c3141fed583379c34462d6b154ea449e0f6c26d5f2437ccb"},{"version":"5c5612147c45b2565f48cf45777ae48ce27021b602f703d43f743181ced4fd65","signature":"4f5ea98478a0fd1faa624f2a218c29af50667c92e4666adec8c3f42baa0337d0"},{"version":"93ee2f27122aee77267a9027eeb5ee37d0e2c77813595491d5759e41f39429b2","signature":"11dcc275840b7c88ded544f56daacb67e11615bdf0e8cc4359b35e5b8fd6842e"},{"version":"856dc2e7b1d094e295f4e8bc7351c72dbca312de71d396f69d8453ca989578dc","signature":"23312a61c5b6ff750690b3da139dd91621ba5aa647a17e51867a36913d0e574d"},{"version":"e2076f30d9231e3ca17b5f5fd2c13e6031a666694504b7e1a762e1e28ca81459","signature":"3312ffd7c17fdcde5acd11cb54974c71ad0d74c9046c1912ca3691d645cf79d3"},"2284af08ba4dd6334745fdedcf130bb5fb8fb9fd5efd37649c257dda5f4a9df8","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7",{"version":"eb888c6f1edddecf46fb3e64f2b46912e4caa5c5ccec559305c1aafc16d020dd","affectsGlobalScope":true},"55e6656e26f0fded3f5bad1a2e2b7f2d550d84773e12b6f997fc199720fe4aa6"],"root":[[505,521],[526,543]],"options":{"allowJs":false,"esModuleInterop":true,"jsx":4,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[541,1],[542,2],[543,3],[505,2],[540,4],[533,5],[512,6],[535,7],[537,8],[518,9],[538,8],[519,10],[531,11],[539,12],[510,13],[511,13],[513,14],[521,10],[534,15],[530,16],[529,17],[527,18],[517,14],[536,19],[528,16],[532,16],[520,20],[516,21],[514,22],[515,23],[526,24],[508,14],[509,25],[506,26],[507,27],[248,2],[134,28],[135,28],[136,29],[95,30],[137,31],[138,32],[139,33],[90,2],[93,34],[91,2],[92,2],[140,35],[141,36],[142,37],[143,38],[144,39],[145,40],[146,40],[148,41],[147,42],[149,43],[150,44],[151,45],[133,46],[94,2],[152,47],[153,48],[154,49],[187,50],[155,51],[156,52],[157,53],[158,54],[159,55],[160,56],[161,57],[162,58],[163,59],[164,60],[165,60],[166,61],[167,2],[168,2],[169,62],[171,63],[170,64],[172,65],[173,66],[174,67],[175,68],[176,69],[177,70],[178,71],[179,72],[180,73],[181,74],[182,75],[183,76],[184,77],[185,78],[186,79],[191,80],[408,81],[192,82],[190,81],[409,83],[188,84],[406,2],[189,85],[81,2],[83,86],[405,81],[265,81],[82,2],[524,87],[525,88],[523,89],[522,2],[454,90],[459,1],[449,91],[212,92],[252,93],[433,94],[247,95],[229,2],[404,2],[210,2],[422,96],[278,97],[211,2],[332,98],[255,99],[256,100],[403,101],[419,102],[314,103],[427,104],[428,105],[426,106],[425,2],[423,107],[254,108],[213,109],[357,2],[358,110],[284,111],[214,112],[285,111],[280,111],[201,111],[250,113],[249,2],[432,114],[444,2],[237,2],[379,115],[380,116],[374,81],[481,2],[382,2],[383,21],[375,117],[486,118],[485,119],[480,2],[299,2],[418,120],[417,2],[479,121],[376,81],[308,122],[304,123],[309,124],[307,2],[306,125],[305,2],[482,2],[478,2],[484,126],[483,2],[303,123],[473,127],[476,128],[293,129],[292,130],[291,131],[489,81],[290,132],[272,2],[492,2],[495,2],[494,81],[496,133],[194,2],[429,134],[430,135],[431,136],[207,2],[240,2],[206,137],[193,2],[395,81],[199,138],[394,139],[393,140],[384,2],[385,2],[392,2],[387,2],[390,141],[386,2],[388,142],[391,143],[389,142],[209,2],[204,2],[205,111],[260,2],[266,144],[267,145],[264,146],[262,147],[263,148],[258,2],[401,21],[287,21],[453,149],[460,150],[464,151],[436,152],[435,2],[275,2],[497,153],[448,154],[377,155],[378,156],[372,157],[363,2],[400,158],[438,81],[364,159],[402,160],[397,161],[396,2],[398,2],[369,2],[356,162],[437,163],[440,164],[366,165],[370,166],[361,167],[414,168],[447,169],[318,170],[333,171],[202,172],[446,173],[198,174],[268,175],[259,2],[269,176],[345,177],[257,2],[344,178],[89,2],[338,179],[239,2],[359,180],[334,2],[203,2],[233,2],[342,181],[208,2],[270,182],[368,183],[434,184],[367,2],[341,2],[261,2],[347,185],[348,186],[424,2],[350,187],[352,188],[351,189],[242,2],[340,172],[354,190],[317,191],[339,192],[346,193],[217,2],[221,2],[220,2],[219,2],[224,2],[218,2],[227,2],[226,2],[223,2],[222,2],[225,2],[228,194],[216,2],[326,195],[325,2],[330,196],[327,197],[329,198],[331,196],[328,197],[238,199],[288,200],[443,201],[498,2],[468,202],[470,203],[365,204],[469,205],[441,163],[381,163],[215,2],[319,206],[234,207],[235,208],[236,209],[232,210],[413,210],[282,210],[320,211],[283,211],[231,212],[230,2],[324,213],[323,214],[322,215],[321,216],[442,217],[412,218],[411,219],[373,220],[407,221],[410,222],[421,223],[420,224],[416,225],[316,226],[313,227],[315,228],[312,229],[353,230],[343,2],[458,2],[355,231],[415,2],[271,232],[362,134],[360,233],[273,234],[276,235],[493,2],[274,236],[277,236],[456,2],[455,2],[457,2],[491,2],[279,237],[439,2],[310,238],[302,81],[253,2],[197,239],[286,2],[462,81],[196,2],[472,240],[301,81],[466,21],[300,241],[451,242],[298,240],[200,2],[474,243],[296,81],[297,81],[289,2],[195,2],[295,244],[294,245],[241,246],[371,59],[281,59],[349,2],[336,247],[335,2],[399,123],[311,81],[445,137],[452,248],[84,81],[87,249],[88,250],[85,81],[86,2],[251,251],[246,252],[245,2],[244,253],[243,2],[450,254],[461,255],[463,256],[465,257],[467,258],[471,259],[504,260],[475,260],[503,261],[477,262],[487,263],[488,264],[490,265],[499,266],[502,137],[501,2],[500,267],[337,268],[79,2],[80,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[76,2],[74,2],[78,2],[73,2],[77,2],[75,2],[111,269],[121,270],[110,269],[131,271],[102,272],[101,273],[130,267],[124,274],[129,275],[104,276],[118,277],[103,278],[127,279],[99,280],[98,267],[128,281],[100,282],[105,283],[106,2],[109,283],[96,2],[132,284],[122,285],[113,286],[114,287],[116,288],[112,289],[115,290],[125,267],[107,291],[108,292],[117,293],[97,294],[120,285],[119,283],[123,2],[126,295]],"affectedFilesPendingEmit":[543,540,533,512,535,537,518,538,519,531,539,510,511,513,521,534,530,529,527,517,536,528,532,520,516,514,515,526,508,509,507],"version":"5.8.2"}
\ No newline at end of file
diff --git a/verify-runtime.log b/verify-runtime.log
new file mode 100644
index 0000000..0e960c9
--- /dev/null
+++ b/verify-runtime.log
@@ -0,0 +1,87 @@
+PAGE=/
+TITLE=South Texas's Most Trusted Masonry Supply
+CANONICAL=https://www.southernmasonrysupply.com
+HAS_FAQ=True
+HAS_PRODUCTS_LIST=False
+HAS_MASONRY_LIST=False
+HAS_LANDSCAPING_LIST=False
+HAS_GLOBAL=True
+PAGE=/products
+TITLE=Masonry & Landscaping Supplies in Corpus Christi, TX | Southern Masonry Supply
+CANONICAL=https://www.southernmasonrysupply.com/products
+HAS_FAQ=False
+HAS_PRODUCTS_LIST=True
+HAS_MASONRY_LIST=False
+HAS_LANDSCAPING_LIST=False
+HAS_GLOBAL=True
+PAGE=/masonry-supplies
+TITLE=Masonry Supplies in Corpus Christi, TX | Southern Masonry Supply
+CANONICAL=https://www.southernmasonrysupply.com/masonry-supplies
+HAS_FAQ=False
+HAS_PRODUCTS_LIST=False
+HAS_MASONRY_LIST=True
+HAS_LANDSCAPING_LIST=False
+HAS_GLOBAL=True
+PAGE=/landscaping-supplies
+TITLE=Landscaping Supplies in Corpus Christi, TX | Southern Masonry Supply
+CANONICAL=https://www.southernmasonrysupply.com/landscaping-supplies
+HAS_FAQ=False
+HAS_PRODUCTS_LIST=False
+HAS_MASONRY_LIST=False
+HAS_LANDSCAPING_LIST=True
+HAS_GLOBAL=True
+PAGE=/contact
+TITLE=Contact Southern Masonry Supply in Corpus Christi, TX | Southern Masonry Supply
+CANONICAL=https://www.southernmasonrysupply.com/contact
+HAS_FAQ=False
+HAS_PRODUCTS_LIST=False
+HAS_MASONRY_LIST=False
+HAS_LANDSCAPING_LIST=False
+HAS_GLOBAL=True
+ROBOTS_START
+User-Agent: *
+Allow: /
+
+Sitemap: https://www.southernmasonrysupply.com/sitemap.xml
+
+SITEMAP_START
+
+
+
+https://www.southernmasonrysupply.com/
+2026-03-10T16:53:07.800Z
+weekly
+1
+
+
+https://www.southernmasonrysupply.com/about
+2026-03-10T16:53:07.800Z
+monthly
+0.8
+
+
+https://www.southernmasonrysupply.com/products
+2026-03-10T16:53:07.800Z
+monthly
+0.8
+
+
+https://www.southernmasonrysupply.com/masonry-supplies
+2026-03-10T16:53:07.800Z
+monthly
+0.8
+
+
+https://www.southernmasonrysupply.com/landscaping-supplies
+2026-03-10T16:53:07.800Z
+monthly
+0.8
+
+
+https://www.southernmasonrysupply.com/contact
+2026-03-10T16:53:07.800Z
+monthly
+0.8
+
+
+