import React, { useMemo, useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Warehouse, Car, Snowflake, Shield, Clock, DoorOpen, Tag, MapPin, Phone, DollarSign, Star, ChevronRight, } from "lucide-react"; // shadcn/ui import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; // ---------- Mock Data ---------- const UNITS = [ { id: "u1", size: "5' x 5'", sqft: 25, type: ["Interior"], climate: true, driveUp: false, door: "Roll-up", onlinePrice: 39, inStorePrice: 49, promo: "1st Month $1", available: true, parking: false, }, { id: "u2", size: "5' x 10'", sqft: 50, type: ["Interior"], climate: true, driveUp: false, door: "Roll-up", onlinePrice: 59, inStorePrice: 72, promo: "50% Off 2 Months", available: true, parking: false, }, { id: "u3", size: "10' x 10'", sqft: 100, type: ["Drive-up"], climate: false, driveUp: true, door: "Roll-up", onlinePrice: 99, inStorePrice: 119, promo: "Web Special", available: false, parking: false, }, { id: "u4", size: "10' x 15'", sqft: 150, type: ["Drive-up"], climate: false, driveUp: true, door: "Roll-up", onlinePrice: 129, inStorePrice: 149, promo: "Free Lock", available: true, parking: false, }, { id: "u5", size: "10' x 20'", sqft: 200, type: ["Interior"], climate: true, driveUp: false, door: "Roll-up", onlinePrice: 169, inStorePrice: 189, promo: "1st Month $1", available: true, parking: false, }, { id: "p1", size: "10' x 20'", sqft: 200, type: ["Vehicle", "Uncovered"], climate: false, driveUp: true, door: "None", onlinePrice: 50, inStorePrice: 63, promo: "Online Only", available: true, parking: true, }, { id: "p2", size: "12' x 35'", sqft: 420, type: ["RV", "Covered"], climate: false, driveUp: true, door: "None", onlinePrice: 129, inStorePrice: 149, promo: "Limited Spots", available: false, parking: true, }, ]; const SIZES = ["All sizes", "5' x 5'", "5' x 10'", "10' x 10'", "10' x 15'", "10' x 20'", "12' x 35'"]; const formatUSD = (n) => `$${n.toLocaleString(undefined, { maximumFractionDigits: 0 })}`; export default function StorageMockup() { const [activeTab, setActiveTab] = useState("units"); const [size, setSize] = useState("All sizes"); const [climateOnly, setClimateOnly] = useState(false); const [driveUpOnly, setDriveUpOnly] = useState(false); const [availableOnly, setAvailableOnly] = useState(true); const [sort, setSort] = useState("price-asc"); const [zip, setZip] = useState(""); const filtered = useMemo(() => { let list = UNITS.filter((u) => (activeTab === "parking" ? u.parking : !u.parking)); if (size !== "All sizes") list = list.filter((u) => u.size === size); if (climateOnly) list = list.filter((u) => u.climate); if (driveUpOnly) list = list.filter((u) => u.driveUp); if (availableOnly) list = list.filter((u) => u.available); list = [...list].sort((a, b) => { if (sort === "price-asc") return a.onlinePrice - b.onlinePrice; if (sort === "price-desc") return b.onlinePrice - a.onlinePrice; return a.sqft - b.sqft; }); return list; }, [activeTab, size, climateOnly, driveUpOnly, availableOnly, sort]); return (
{/* Specials Banner */}

Online Specials: $1 First Month · 50% Off 2 Months · Free Lock

{/* Filters + Listings */}
Storage Units Vehicle Parking
); } // ---------- Top Bar / Header ---------- function TopBar() { return (
Cardinal Storage
(800) 688-8057
); } function Header({ zip, setZip }: { zip: string; setZip: (v: string) => void }) { return (
Clean, Secure Self Storage

Month-to-month rentals, online specials, and friendly on-site staff. Climate controlled and drive-up units available.

setZip(e.target.value)} className="border-0 focus-visible:ring-0" />
24/7 Cameras
Extended Access
Climate Control
); } function HeroMock() { return ( Quick Quote Pick a size and see current web rates.
Required
); } // ---------- Filters ---------- function FilterBar({ size, setSize, climateOnly, setClimateOnly, driveUpOnly, setDriveUpOnly, availableOnly, setAvailableOnly, sort, setSort, }: any) { return (
Climate
Drive-Up
Available
); } // ---------- Unit Grid ---------- function UnitGrid({ items }: { items: any[] }) { return (
{items.map((u) => ( ))} {items.length === 0 && ( No units match your filters. )}
); } function UnitCard({ unit }: { unit: any }) { const [open, setOpen] = useState(false); return (
{unit.size} {unit.parking ? "Vehicle / Parking" : unit.driveUp ? "Drive-up" : "Interior"} · {unit.door}
Web Rate
{formatUSD(unit.onlinePrice)}/mo
In-Store {formatUSD(unit.inStorePrice)}
{unit.climate && Climate} {unit.driveUp && Drive-up} {unit.type.map((t: string) => ( {t} ))} {unit.promo && {unit.promo}}
Camera monitored
6am–10pm access
{unit.available ? "Available" : "Waitlist"}
Reserve {unit.size} Lock in the web rate today. No credit card required. setOpen(false)} />
); } function ReserveForm({ unit, onComplete }: { unit: any; onComplete: () => void }) { const [submitting, setSubmitting] = useState(false); const [done, setDone] = useState(false); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setSubmitting(true); setTimeout(() => { setSubmitting(false); setDone(true); setTimeout(onComplete, 1000); }, 800); }; return (

No obligation. Pay when you move in.

); } // ---------- Size Guide ---------- function SizeGuide() { const items = [ { size: "5' x 5'", text: "Closet – Boxes, small items", icon: }, { size: "5' x 10'", text: "Walk-in closet – Studio apt.", icon: }, { size: "10' x 10'", text: "One-bedroom home", icon: }, { size: "10' x 15'", text: "Two-bedroom home", icon: }, { size: "10' x 20'", text: "Whole home / vehicle", icon: }, ]; return (

Size Guide

See all sizes
{items.map((it) => (
{it.icon}
{it.size}
{it.text}
))}
); } function BoxSVG() { return ( ); } // ---------- Features ---------- function Features() { const feats = [ { icon: , title: "24/7 Cameras", text: "Monitored facility with gated access." }, { icon: , title: "Extended Hours", text: "Access 6am–10pm every day." }, { icon: , title: "Climate Control", text: "Protects against heat & humidity." }, { icon: , title: "Drive-Up", text: "Ground-floor convenience." }, { icon: , title: "RV / Boat Parking", text: "Covered & uncovered options." }, { icon: , title: "Flexible Terms", text: "Month-to-month leases." }, ]; return (

Why Store With Us

{feats.map((f) => (
{f.icon}
{f.title}
{f.text}
))}
); } // ---------- Location & Hours ---------- function LocationHours() { return (

Location & Hours

Get Directions
4500 W Highway 40, Ocala, FL
Office Hours
Mon–Sat: 9am–6pm
Sun: 9am–5pm
Access Hours
Daily: 6am–10pm