diff --git a/vula-index.json b/vula-index.json new file mode 100644 index 0000000..b620fc7 --- /dev/null +++ b/vula-index.json @@ -0,0 +1,546 @@ +{ + "projectName": "Thornveld Game Lodge", + "businessType": "", + "industry": "", + "tone": "", + "tier": 1, + "generatedAt": "2026-07-13T09:20:45.291Z", + "sections": [ + { + "name": "BushveldHeroSection", + "importPath": "@/components/sections/BushveldHeroSection", + "position": 0, + "role": "hero", + "hasImage": true, + "hasForm": false, + "itemCount": 2, + "layout": "flex-row", + "headings": [ + "Unhurried Days, Wild Nights." + ], + "buttonLabels": [ + "Explore the Lodge" + ], + "people": [], + "allText": [ + "next/image", + "@/components/ui/Button", + "bushveldhero", + "hero", + "relative h-[70vh] lg:h-[90vh] overflow-hidden", + "Golden bushveld sunset with thorn tree silhouettes", + "object-cover", + "100vw", + "absolute inset-0 bg-gradient-to-t from-black/60 via-black/20 to-transparent", + "absolute inset-0 flex flex-col justify-center items-center text-center px-4", + "font-heading text-4xl md:text-6xl lg:text-7xl text-[#f5f5dc] mb-4 max-w-3xl leading-tight", + "Unhurried Days, Wild Nights.", + "font-body italic text-lg md:text-xl lg:text-2xl text-[#f5f5dc]/90 mb-8 max-w-2xl", + "\"Where the bush tells its own stories.\"", + "default", + "lg", + "bg-[#6b8e23] hover:bg-[#5a7a1e] text-white px-8 py-3 rounded-xl shadow-md font-heading", + "#thornveld-experiences", + "Explore the Lodge" + ] + }, + { + "name": "ThornveldExperiencesSection", + "importPath": "@/components/sections/ThornveldExperiencesSection", + "position": 1, + "role": "unknown", + "hasImage": true, + "hasForm": false, + "itemCount": 4, + "layout": "grid", + "headings": [ + "Life in the Thornveld" + ], + "buttonLabels": [], + "people": [ + "Guided Walking Trails", + "Dawn Birding", + "Sundowner Drives" + ], + "allText": [ + "next/image", + "@/components/ui/Card", + "@/components/ui/Badge", + "Self-Catering Chalets", + "Fully equipped kitchens, private braai areas, and verandas shaded by ancient knobthorn trees – your home in the bush.", + "Guided Walking Trails", + "Daily walks with our rangers – learn to identify tracks, calls, and the quiet rhythms of the thornveld.", + "Dawn Birding", + "Early mornings alive with kingfishers, hornbills, and rollers. Our guides know every perch.", + "Sundowner Drives", + "Evening game drives ending on a panoramic ridge with homemade rusks and the setting sun painting the Lowveld.", + "thornveldexperiences", + "thornveld-experiences", + "py-20 bg-[#f7f9f4]", + "container mx-auto px-4", + "relative mb-12", + "font-heading text-3xl md:text-4xl text-[#1b210d] mb-4", + "Life in the Thornveld", + "font-body italic text-lg text-[#8b5a3c] max-w-2xl", + "Four ways to slow down and sink into the bush.", + "absolute -top-2 right-4 rotate-6 bg-[#6b8e23] text-white px-3 py-1 text-sm rounded-full shadow-md", + "Since 1998", + "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6", + "rounded-xl shadow-md border border-[#dee2d4] overflow-hidden bg-white", + "relative h-48 w-full overflow-hidden", + "object-cover hover:scale-105 transition-transform duration-500 ease-out", + "(max-width: 768px) 100vw, 25vw", + "font-heading text-xl text-[#1b210d]", + "font-body italic text-[#8b5a3c]" + ] + }, + { + "name": "OurFamilyRootsSection", + "importPath": "@/components/sections/OurFamilyRootsSection", + "position": 2, + "role": "unknown", + "hasImage": true, + "hasForm": false, + "itemCount": 8, + "layout": "grid", + "headings": [ + "Built by Hand, Rooted in Love" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "next/image", + "ourfamilyroots", + "family-roots", + "py-20 bg-white", + "container mx-auto px-4", + "grid grid-cols-1 lg:grid-cols-2 gap-12 items-center", + "font-heading text-3xl md:text-4xl text-[#1b210d] mb-6", + "Built by Hand, Rooted in Love", + "font-body text-base text-[#1b210d]/80 leading-relaxed space-y-4", + "Jan and Marietjie first saw this stretch of Limpopo bush in 2003. The knobthorn trees, the dawn chorus of hornbills, the way the light turned golden at dusk — they knew they had found home.", + "They built the first chalet with their own hands, timber by timber, while raising three children under canvas. By 2010, Thornveld opened its doors — eight self-catering chalets, each with a view of the wild.", + "Today, guests arrive as strangers and leave as family. Jan still leads the morning walks; Marietjie bakes the rusks for sundowners. This is not a hotel — it is their home, and you are welcome.", + "mt-8 space-y-3", + "2003", + "Discovered the land", + "2005", + "First chalet built", + "2010", + "Opened to guests", + "2020", + "Expanded to 8 chalets", + "flex gap-4 border-b border-[#dee2d4] pb-3", + "font-heading text-[#6b8e23] font-bold min-w-[60px]", + "font-body italic text-[#8b5a3c]", + "relative aspect-[4/3] lg:aspect-auto lg:h-[500px] w-full overflow-hidden rounded-xl shadow-md rotate-1", + "Jan and Marietjie on the main deck with the bushveld behind them", + "object-cover", + "(max-width: 1024px) 100vw, 50vw", + "absolute bottom-4 left-4 bg-[#f5f5dc]/90 text-[#1b210d] px-4 py-2 rounded-lg text-sm font-body italic shadow-md", + "The family deck, where stories are shared." + ] + }, + { + "name": "SeasonalSpecialsSection", + "importPath": "@/components/sections/SeasonalSpecialsSection", + "position": 3, + "role": "cms-campaigns", + "hasImage": true, + "hasForm": false, + "itemCount": -1, + "layout": "grid", + "headings": [ + "Baked before sunrise, gone by noon." + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "@/hooks/useEmDashContent", + "next/image", + "@/components/ui/Card", + "@/components/ui/Button", + "campaigns", + "flex justify-center py-16", + "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin", + "specials", + "seasonalspecials", + "py-20 bg-[#f7f9f4]", + "max-w-7xl mx-auto px-4", + "font-heading text-4xl md:text-5xl text-[#1b210d] mb-4 leading-tight", + "Baked before sunrise, gone by noon.", + "font-serif italic text-lg text-[#8b5a3c] max-w-2xl mb-12", + "Limited-time packages crafted for unhurried escapes.", + "grid grid-cols-1 md:grid-cols-3 gap-8", + "overflow-hidden rounded-2xl shadow-soft border-0 bg-[#f5f5dc] transition-all duration-200 ease-out hover:-translate-y-1 hover:shadow-lg", + "relative h-48 w-full overflow-hidden", + "Special offer", + "(max-width: 768px) 100vw, 33vw", + "object-cover hover:scale-105 transition-transform duration-500 ease-out", + "text-[#8b5a3c] text-sm font-medium uppercase tracking-wide mb-1", + "text-2xl text-[#1b210d] font-heading", + "Untitled", + "font-serif italic text-[#1b210d]/80 leading-relaxed", + "ghost", + "text-[#6b8e23] hover:text-[#4a6317] transition-colors duration-200", + "Enquire" + ], + "cmsCollection": "campaigns" + }, + { + "name": "BushGallerySection", + "importPath": "@/components/sections/BushGallerySection", + "position": 4, + "role": "gallery", + "hasImage": true, + "hasForm": false, + "itemCount": -1, + "layout": "grid", + "headings": [ + "Light through the leaves", + "{lightboxItem.title}" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "@/hooks/useEmDashContent", + "next/image", + "react", + "lucide-react", + "gallery", + "flex justify-center py-16", + "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin", + "bush-gallery", + "bushgallery", + "py-20 bg-[#f7f9f4]", + "max-w-7xl mx-auto px-4", + "font-heading text-4xl md:text-5xl text-[#1b210d] mb-4 leading-tight", + "Light through the leaves", + "font-serif italic text-lg text-[#8b5a3c] max-w-2xl mb-12", + "Moments that make the bush feel like home.", + "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6", + "group relative overflow-hidden rounded-2xl aspect-square cursor-pointer transition-all duration-200 ease-out hover:-translate-y-1 hover:shadow-lg", + "Gallery image", + "(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw", + "object-cover transition-transform duration-500 ease-out group-hover:scale-105", + "absolute inset-0 bg-black/20 opacity-0 group-hover:opacity-100 transition-opacity duration-200 ease-out", + "absolute bottom-0 left-0 right-0 p-4 bg-gradient-to-t from-black/60 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-200 ease-out", + "text-white font-semibold text-sm", + "text-white/80 text-xs mt-1", + "fixed inset-0 z-50 bg-black/80 flex items-center justify-center p-4", + "relative max-w-4xl w-full max-h-[90vh] bg-[#f7f9f4] rounded-2xl overflow-hidden", + "absolute top-4 right-4 z-10 p-2 bg-black/30 rounded-full text-white hover:bg-black/50 transition-colors", + "w-5 h-5", + "relative h-[60vh] w-full", + "Full view", + "100vw", + "object-contain", + "p-6 bg-[#f5f5dc]", + "text-2xl font-heading text-[#1b210d]", + "font-serif italic text-[#1b210d]/80 mt-2" + ], + "cmsCollection": "gallery" + }, + { + "name": "SightingsJournalSection", + "importPath": "@/components/sections/SightingsJournalSection", + "position": 5, + "role": "blog", + "hasImage": true, + "hasForm": false, + "itemCount": -1, + "layout": "grid", + "headings": [ + "The ranger’s digital sightings book", + "{d.title}" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "@/hooks/useEmDashContent", + "next/image", + "@/components/ui/Badge", + "posts", + "flex justify-center py-16", + "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin", + "sightings-journal", + "sightingsjournal", + "py-20 bg-[#f5f5dc]", + "max-w-7xl mx-auto px-4", + "font-heading text-4xl md:text-5xl text-[#1b210d] mb-4 leading-tight", + "The ranger’s digital sightings book", + "font-serif italic text-lg text-[#8b5a3c] max-w-2xl mb-12", + "Fresh notes from the bush — track the wild heartbeat of Thornveld.", + "grid grid-cols-1 md:grid-cols-2 gap-8", + "bg-[#f7f9f4] rounded-2xl overflow-hidden shadow-soft border border-[#dee2d4] transition-all duration-200 ease-out hover:-translate-y-1 hover:shadow-lg", + "relative h-48 w-full overflow-hidden", + "Sighting image", + "(max-width: 768px) 100vw, 50vw", + "object-cover hover:scale-105 transition-transform duration-500 ease-out", + "p-6", + "flex items-center justify-between mb-3", + "bg-[#6b8e23] text-white text-xs px-3 py-1 rounded-full", + "text-xs text-[#8b5a3c] font-medium", + "font-heading text-2xl text-[#1b210d] mb-2", + "font-serif italic text-[#1b210d]/70 leading-relaxed", + "mt-4 h-px bg-[#dee2d4] w-12" + ], + "cmsCollection": "posts" + }, + { + "name": "GuestVoicesSection", + "importPath": "@/components/sections/GuestVoicesSection", + "position": 6, + "role": "unknown", + "hasImage": true, + "hasForm": false, + "itemCount": 3, + "layout": "grid", + "headings": [ + "Entries from our veranda guestbook" + ], + "buttonLabels": [], + "people": [ + "The Dlamini Family" + ], + "allText": [ + "use client", + "next/image", + "Watching elephants drink from the waterhole at dusk — our children will never forget that quiet magic.", + "The Dlamini Family", + "Johannesburg", + "Marietjie's home-baked bread with apricot jam, fresh from the oven... pure Thornveld warmth.", + "Sarah & Tom", + "London, UK", + "Learning to track spoor with ranger Thabo — warthog, kudu, even a leopard's pugmark. Real bush school.", + "Jenna & Ryan", + "Cape Town", + "guest-voices", + "guestvoices", + "py-20 bg-[#f5f5dc]", + "max-w-7xl mx-auto px-4", + "font-heading text-3xl md:text-4xl text-[#1b210d] mb-12 text-center", + "Entries from our veranda guestbook", + "grid grid-cols-1 md:grid-cols-3 gap-8", + "bg-[#f7f9f4] rounded-2xl p-6 shadow-soft border border-[#dee2d4]", + "flex items-center mb-4", + "relative w-12 h-12 rounded-full overflow-hidden mr-3", + "48px", + "object-cover", + "font-semibold text-[#1b210d]", + "text-sm text-[#8b5a3c]", + "font-serif italic text-[#1b210d]/80 leading-relaxed", + "“", + "”", + "mt-4 h-px bg-[#dee2d4] w-16" + ] + }, + { + "name": "UnhurriedBookingCTASection", + "importPath": "@/components/sections/UnhurriedBookingCTASection", + "position": 7, + "role": "booking", + "hasImage": true, + "hasForm": false, + "itemCount": 2, + "layout": "unknown", + "headings": [ + "Ready to trade city noise for the call of a fish eagle?" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "next/image", + "@/components/ui/Button", + "lucide-react", + "+27823456789", + "unhurriedbookingcta", + "book-now", + "relative py-24 overflow-hidden bg-[#f7f9f4]", + "absolute inset-0 z-0", + "Chalet veranda at dawn", + "100vw", + "object-cover opacity-30", + "relative z-10 max-w-3xl mx-auto px-6 text-center", + "text-3xl md:text-4xl font-bold text-[#1b210d] mb-4 leading-snug", + "Ready to trade city noise for the call of a fish eagle?", + "text-lg text-[#1b210d]/80 mb-8 font-light", + "A direct booking with us means no middleman, no pressure. Just the bushveld, a cold drink on the stoep, and the fireflies. Chat to us directly.", + "_blank", + "noopener noreferrer", + "inline-block", + "default", + "lg", + "gap-2 bg-[#6b8e23] hover:bg-[#5a7a1f] text-white", + "w-5 h-5", + "Enquire via WhatsApp" + ] + }, + { + "name": "LocationFindSection", + "importPath": "@/components/sections/LocationFindSection", + "position": 8, + "role": "unknown", + "hasImage": false, + "hasForm": false, + "itemCount": 12, + "layout": "grid", + "headings": [ + "Find us in the wild" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "lucide-react", + "locationfind", + "find-us", + "py-20 bg-[#f7f9f4]", + "max-w-6xl mx-auto px-6 grid md:grid-cols-2 gap-10 items-center", + "_blank", + "noopener noreferrer", + "relative block aspect-video rounded-xl overflow-hidden shadow-md group bg-[#dee2d4]", + "absolute inset-0 bg-[url('https://www.openstreetmap.org/export/embed.html?bbox=30.9,-24.4,31.0,-24.3&layer=mapnik')] bg-cover bg-center opacity-70", + "absolute inset-0 bg-[#8b5a3c]/20 group-hover:bg-[#8b5a3c]/30 transition-colors", + "absolute bottom-4 left-4 right-4 bg-white/80 backdrop-blur p-3 rounded-lg text-sm text-[#1b210d]", + "inline w-4 h-4 text-[#6b8e23] mr-1", + "Thornveld Game Lodge • R40, Hoedspruit, Limpopo", + "text-3xl font-bold text-[#1b210d] mb-4", + "Find us in the wild", + "text-[#8b5a3c] mb-6", + "We are tucked just outside Hoedspruit, a short drive from Kruger's Orpen Gate, within the Big Five Balule Nature Reserve. The roads are good — any sedan makes it.", + "space-y-4 text-[#1b210d] text-sm", + "flex items-start gap-3", + "w-5 h-5 text-[#6b8e23] mt-0.5 shrink-0", + "font-semibold", + "Driving from Johannesburg", + "text-[#8b5a3c]", + "Take the N12 to eMalahleni, then the N4 towards Nelspruit. Turn north on the R40 past White River. About 5 hours, all tar.", + "Nearest airports", + "Kruger Mpumalanga International (KMIA) — 90 min drive. Hoedspruit Airport (HDS) — 30 min. We can arrange a shuttle.", + "Balule Nature Reserve", + "Part of the Greater Kruger ecosystem — no fences between us and the park. Expect elephant, lion, and leopard wandering through." + ] + }, + { + "name": "ContactEnquirySection", + "importPath": "@/components/sections/ContactEnquirySection", + "position": 9, + "role": "contact", + "hasImage": false, + "hasForm": true, + "itemCount": 9, + "layout": "grid", + "headings": [ + "Drop us a line" + ], + "buttonLabels": [ + "WhatsApp: +27 82 345 6789", + "reservations@thornveld.co.za", + "Send enquiry" + ], + "people": [], + "allText": [ + "use client", + "react", + "lucide-react", + "@/components/ui/Button", + "@/components/ui/Input", + "Enquiry sent", + "contactenquiry", + "contact", + "py-20 bg-[#f5f5dc]", + "max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-10", + "text-3xl font-bold text-[#1b210d] mb-4", + "Drop us a line", + "text-[#8b5a3c] mb-8", + "Prefer to chat? We are easy to reach. While our hosts might be out on a game walk, they will reply as soon as they are back under the stoep.", + "space-y-4", + "flex items-center gap-3", + "w-5 h-5 text-[#6b8e23]", + "tel:+27823456789", + "text-[#1b210d] hover:text-[#6b8e23] transition-colors", + "+27 82 345 6789", + "_blank", + "noopener noreferrer", + "WhatsApp: +27 82 345 6789", + "mailto:reservations@thornveld.co.za", + "reservations@thornveld.co.za", + "bg-white rounded-xl p-6 shadow-md border border-[#dee2d4]", + "text-center py-8", + "text-xl font-semibold text-[#6b8e23]", + "Sent with care!", + "text-[#8b5a3c] mt-2", + "We will answer as soon as the fire is lit.", + "name", + "Your name", + "email", + "Your email", + "block text-sm text-[#1b210d] mb-1", + "Preferred travel dates", + "travelDates", + "date", + "message", + "Tell us about your stay – group size, interests, any special requests...", + "w-full rounded-lg border border-[#dee2d4] bg-white p-3 text-sm text-[#1b210d] placeholder:text-[#8b5a3c]/50 focus:outline-none focus:ring-2 focus:ring-[#6b8e23] focus:border-transparent min-h-[100px]", + "submit", + "default", + "w-full bg-[#6b8e23] hover:bg-[#5a7a1f] text-white", + "Send enquiry" + ] + }, + { + "name": "KnowBeforeYouGoSection", + "importPath": "@/components/sections/KnowBeforeYouGoSection", + "position": 10, + "role": "unknown", + "hasImage": false, + "hasForm": false, + "itemCount": -1, + "layout": "flex-row", + "headings": [ + "Know before you go" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "react", + "@/hooks/useEmDashContent", + "lucide-react", + "policies", + "flex justify-center py-16 bg-[#f7f9f4]", + "w-8 h-8 rounded-full border-2 border-[#6b8e23] border-t-transparent animate-spin", + "know-before-you-go", + "knowbeforeyougo", + "py-20 bg-[#f5f5dc]", + "max-w-4xl mx-auto px-6", + "text-3xl font-bold text-[#1b210d] mb-8 text-center", + "Know before you go", + "space-y-3", + "bg-white rounded-xl border border-[#dee2d4] overflow-hidden shadow-sm", + "w-full flex items-center justify-between p-4 text-left text-[#1b210d] font-medium hover:bg-[#f5f5dc] transition-colors", + "flex items-center gap-2", + "w-4 h-4 text-[#6b8e23]", + "Policy", + "w-4 h-4 text-[#8b5a3c]", + "px-4 pb-4 text-sm text-[#1b210d]/80 border-t border-[#dee2d4] pt-3", + "Details coming soon." + ], + "cmsCollection": "policies" + } + ], + "navigationLinks": [ + "Thornveld Game Lodge", + "Home", + "Thornveld Experiences", + "Our Family Roots", + "Seasonal Specials", + "Bush Gallery", + "Contact Enquiry" + ] +} \ No newline at end of file