diff --git a/vula-index.json b/vula-index.json new file mode 100644 index 0000000..8928173 --- /dev/null +++ b/vula-index.json @@ -0,0 +1,590 @@ +{ + "projectName": "Molten Rock Private Reserve", + "businessType": "hotel", + "industry": "hotel", + "tone": "", + "tier": 2, + "serviceType": "hotel", + "generatedAt": "2026-07-13T18:03:29.038Z", + "sections": [ + { + "name": "HeroSection", + "importPath": "@/components/sections/HeroSection", + "position": 0, + "role": "hero", + "hasImage": true, + "hasForm": false, + "itemCount": 4, + "layout": "flex-row", + "headings": [], + "buttonLabels": [], + "people": [ + "Molten Rock Private Reserve" + ], + "allText": [ + "next/image", + "next/link", + "hero", + "relative flex flex-col md:flex-row min-h-[82vh]", + "relative w-full md:w-1/2 h-72 md:h-auto min-h-[320px] overflow-hidden", + "Molten Rock Private Reserve", + "object-cover", + "(max-width: 768px) 100vw, 50vw", + "absolute inset-0", + "linear-gradient(135deg, #36454F, #d4af37)", + "w-full md:w-1/2 flex flex-col justify-center px-8 lg:px-16 py-14", + "#f2f4f5", + "#1f2b33", + "uppercase tracking-[0.12em] text-[12px] opacity-55 mb-4", + "text-4xl lg:text-5xl font-semibold tracking-[-0.02em] leading-[1.12] mb-6 max-w-4xl", + "An ultra-private, 6-suite safari sanctuary in the Greater Kruger offering", + "text-[#16a34a]", + "bespoke game.", + "text-base lg:text-lg mb-8 max-w-lg", + "#5c6870", + "Professional safari retreat in South Africa.", + "w-fit", + "#contact", + "inline-block bg-[#36454F] text-white px-9 py-4 text-[15px] font-semibold rounded-full shadow-xl hover:-translate-y-0.5 transition-all duration-200", + "Get in touch" + ] + }, + { + "name": "ExclusiveSuitesSection", + "importPath": "@/components/sections/ExclusiveSuitesSection", + "position": 1, + "role": "unknown", + "hasImage": true, + "hasForm": false, + "itemCount": 17, + "layout": "grid", + "headings": [], + "buttonLabels": [ + "Explore All Suites" + ], + "people": [], + "allText": [ + "use client", + "next/image", + "next/link", + "@/hooks/useMedusaProducts", + "@/components/ui/Card", + "lucide-react", + "@/components/ui/Button", + "KSh", + "exclusivesuites", + "suites", + "py-24 bg-[#f2f4f5]", + "max-w-7xl mx-auto px-4", + "text-center mb-16 max-w-2xl mx-auto", + "text-4xl md:text-5xl font-bold text-[#1f2b33] mb-4", + "Sora, sans-serif", + "Six sanctuaries,", + "text-[#d4af37]", + "each a world apart", + "text-lg text-[#36454F]/70 leading-relaxed", + "Every suite is a private hideaway — handcrafted with local stone, reclaimed timber, and panoramic glass overlooking the bushveld.", + "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", + "bg-white rounded-3xl overflow-hidden shadow-soft animate-pulse", + "h-64 bg-[#d4dadd]", + "p-6 space-y-3", + "h-6 bg-[#d4dadd] rounded w-3/4", + "h-4 bg-[#d4dadd] rounded w-full", + "h-4 bg-[#d4dadd] rounded w-1/2", + "bg-white rounded-3xl overflow-hidden shadow-soft border-0 group cursor-pointer transition-all duration-300 hover:-translate-y-2 hover:shadow-xl", + "relative h-64 overflow-hidden", + "(max-width: 768px) 100vw, 33vw", + "object-cover transition-transform duration-500 group-hover:scale-105", + "absolute top-4 left-4 bg-white/90 backdrop-blur-sm rounded-full px-3 py-1 text-sm font-medium text-[#36454F]", + "flex items-center gap-1", + "Up to 2 guests", + "pb-2", + "text-2xl font-semibold text-[#1f2b33]", + "space-y-3", + "text-[#36454F]/70 leading-relaxed", + "text-[#16a34a] font-bold text-xl", + "text-sm font-normal text-[#36454F]/60", + "/ night", + "inline-block mt-2 bg-[#d4af37] text-[#1f2b33] px-6 py-2 rounded-full font-semibold text-sm hover:bg-[#c49f2e] transition-colors", + "View Suite", + "text-center mt-12", + "default", + "lg", + "bg-[#36454F] text-[#f2f4f5] hover:bg-[#2a3844] rounded-full px-10", + "Explore All Suites" + ] + }, + { + "name": "MoltenRockStorySection", + "importPath": "@/components/sections/MoltenRockStorySection", + "position": 2, + "role": "about", + "hasImage": true, + "hasForm": false, + "itemCount": 5, + "layout": "grid", + "headings": [], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "next/image", + "moltenrockstory", + "our-story", + "py-24 bg-white", + "max-w-7xl mx-auto px-4", + "grid grid-cols-1 lg:grid-cols-2 gap-12 items-center", + "relative h-[400px] lg:h-[500px] overflow-hidden rounded-3xl shadow-soft", + "Ancient rock formations at Molten Rock Private Reserve", + "(max-width: 1024px) 100vw, 50vw", + "object-cover", + "text-4xl md:text-5xl font-bold text-[#1f2b33] mb-6", + "Sora, sans-serif", + "A land shaped by fire,", + "text-[#d4af37]", + "preserved by purpose", + "space-y-4 text-[#36454F]/80 leading-relaxed", + "One hundred million years ago, molten magma pushed through ancient granite — cooling into the iconic \n 'koppies' that give our reserve its name. Today, these towering rock formations watch over a landscape \n that has been rewilded with care: elephant, lion, leopard, and rhino roam across sixty thousand hectares \n of riverine forest and open savannah.", + "Our family's conservation vision was deliberate: limit guests to six suites so the land breathes. \n No convoys. No crowds. Only the sounds of the bush and the quiet privilege of being part of something larger.", + "italic text-[#d4af37]", + "\"We are not owners of this wilderness — we are its guardians.\"" + ] + }, + { + "name": "BespokeExperiencesSection", + "importPath": "@/components/sections/BespokeExperiencesSection", + "position": 3, + "role": "unknown", + "hasImage": true, + "hasForm": false, + "itemCount": 3, + "layout": "grid", + "headings": [ + "{exp.title}" + ], + "buttonLabels": [], + "people": [ + "Private Game Drives", + "Bush Spa Rituals", + "Starlit Dining" + ], + "allText": [ + "use client", + "next/image", + "lucide-react", + "Private Game Drives", + "Venture before dawn in an open Land Cruiser with a tracker who knows every spoor. Witness the predators return, the herds stir, and the sun paint the escarpment gold — without another vehicle in sight.", + "Signature", + "Bush Spa Rituals", + "Indulge in treatments using indigenous botanicals — marula oil, rooibos, and African potato. Your therapist sets up on a sala overlooking the dry riverbed; the only soundtrack is the wind in the knobthorn trees.", + "Wellness", + "Starlit Dining", + "Our Michelin-trained chef curates a menu drawn from the region's bounty — game, foraged herbs, and heirloom vegetables. Dinner is served beneath the Southern Cross, with lanterns and a crackling fire.", + "Culinary", + "bespokeexperiences", + "bespoke-experiences", + "py-24 bg-[#f2f4f5]", + "max-w-7xl mx-auto px-4", + "text-center mb-16 max-w-2xl mx-auto", + "text-4xl md:text-5xl font-bold text-[#1f2b33] mb-4", + "Sora, sans-serif", + "Tailor each day", + "text-[#d4af37]", + "to your pulse", + "text-lg text-[#36454F]/70 leading-relaxed", + "No two stays are alike. Select from our signature encounters — or let us design a journey that only you will ever experience.", + "grid grid-cols-1 md:grid-cols-3 gap-8", + "bg-white rounded-3xl overflow-hidden shadow-soft group transition-all duration-300 hover:-translate-y-2 hover:shadow-xl", + "relative h-56 overflow-hidden", + "(max-width: 768px) 100vw, 33vw", + "object-cover transition-transform duration-500 group-hover:scale-105", + "absolute top-4 left-4 bg-[#16a34a] text-white text-xs font-semibold px-3 py-1 rounded-full uppercase tracking-wider", + "p-6", + "flex items-center gap-3 mb-3", + "w-6 h-6 text-[#d4af37]", + "text-xl font-semibold text-[#1f2b33]", + "text-[#36454F]/70 leading-relaxed" + ] + }, + { + "name": "MoltenRockCampaignsSection", + "importPath": "@/components/sections/MoltenRockCampaignsSection", + "position": 4, + "role": "cms-campaigns", + "hasImage": true, + "hasForm": false, + "itemCount": -1, + "layout": "grid", + "headings": [], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "@/hooks/useEmDashContent", + "next/image", + "@/components/ui/Button", + "@/components/ui/Card", + "lucide-react", + "campaigns", + "flex justify-center py-20", + "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin text-[#36454F]", + "exclusive-offers", + "moltenrockcampaigns", + "py-20 bg-[#f2f4f5]", + "container mx-auto px-4 max-w-7xl", + "text-3xl md:text-4xl font-light text-[#36454F] mb-4 text-center", + "Exclusive offers for", + "font-semibold text-[#d4af37]", + "direct bookers", + "text-[#1f2b33] text-center max-w-2xl mx-auto mb-12 text-lg leading-relaxed", + "Curated privileges reserved for those who book directly with Molten Rock Private Reserve.", + "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", + "rounded-[24px] shadow-2xl shadow-black/10 overflow-hidden border-0 transition-all duration-300 hover:shadow-3xl hover:-translate-y-1", + "relative h-48 w-full overflow-hidden", + "Campaign", + "(max-width: 768px) 100vw, 33vw", + "object-cover transition-transform duration-500 ease-out hover:scale-105", + "px-6 pt-6 pb-0", + "text-xl font-medium text-[#36454F]", + "px-6 py-4", + "text-[#d4af37] font-semibold text-sm uppercase tracking-wider mb-2", + "text-[#1f2b33] text-sm leading-relaxed", + "px-6 pb-6 pt-0", + "default", + "sm", + "bg-[#36454F] text-white hover:bg-[#2a363f] rounded-full px-6 py-2 text-sm font-medium transition-all duration-200 ease-out", + "Pre-book now", + "ml-2 w-4 h-4", + "flex justify-center mt-10", + "text-[#1f2b33] text-sm", + "inline-block w-2 h-2 rounded-full bg-[#16a34a] mr-2", + "Limited availability — rates are subject to change upon confirmation." + ], + "cmsCollection": "campaigns" + }, + { + "name": "SafariGallerySection", + "importPath": "@/components/sections/SafariGallerySection", + "position": 5, + "role": "gallery", + "hasImage": true, + "hasForm": false, + "itemCount": -1, + "layout": "grid", + "headings": [ + "{d.title}" + ], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "react", + "@/hooks/useEmDashContent", + "next/image", + "lucide-react", + "@/components/ui/Modal", + "@/components/ui/Card", + "gallery", + "flex justify-center py-20", + "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin text-[#36454F]", + "safari-gallery", + "safarigallery", + "py-20 bg-white", + "container mx-auto px-4 max-w-7xl", + "text-3xl md:text-4xl font-light text-[#36454F] mb-4 text-center", + "The", + "font-semibold text-[#d4af37]", + "wilderness", + "in frames", + "text-[#1f2b33] text-center max-w-xl mx-auto mb-12 text-lg leading-relaxed", + "A private glimpse into life on the reserve — captured for the discerning eye.", + "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4", + "overflow-hidden rounded-[24px] border-0 cursor-pointer shadow-lg hover:shadow-2xl transition-all duration-200 ease-out", + "p-0 relative aspect-square w-full", + "Safari image", + "(max-width: 768px) 50vw, 25vw", + "object-cover transition-transform duration-500 ease-out hover:scale-105", + "absolute inset-0 bg-gradient-to-t from-black/10 to-transparent", + "absolute bottom-3 left-3 right-3", + "text-white text-sm font-medium drop-shadow-lg", + "relative max-w-5xl mx-auto", + "absolute top-4 right-4 z-10 bg-black/50 text-white rounded-full p-2 hover:bg-black/70 transition-colors", + "Close", + "w-5 h-5", + "flex items-center justify-between mb-4", + "bg-black/50 text-white rounded-full p-3 hover:bg-black/70 transition-colors", + "Previous", + "flex-grow h-96 relative mx-4", + "Gallery image", + "object-contain", + "80vw", + "Next", + "text-center text-sm text-white mt-2" + ], + "cmsCollection": "gallery" + }, + { + "name": "BushChronicleSection", + "importPath": "@/components/sections/BushChronicleSection", + "position": 6, + "role": "blog", + "hasImage": true, + "hasForm": false, + "itemCount": -1, + "layout": "grid", + "headings": [], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "@/hooks/useEmDashContent", + "next/image", + "@/components/ui/Card", + "lucide-react", + "posts", + "flex justify-center py-20", + "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin text-[#36454F]", + "bush-chronicle", + "bushchronicle", + "py-20 bg-[#f2f4f5]", + "container mx-auto px-4 max-w-7xl", + "text-3xl md:text-4xl font-light text-[#36454F] mb-4 text-center", + "Tales from the", + "font-semibold text-[#d4af37]", + "bush", + "text-[#1f2b33] text-center max-w-xl mx-auto mb-12 text-lg leading-relaxed", + "Notes on wild moments, conservation milestones, and the chef's table under the stars.", + "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", + "rounded-[24px] shadow-2xl shadow-black/10 overflow-hidden border-0 transition-all duration-300 hover:shadow-3xl hover:-translate-y-1", + "relative h-48 w-full overflow-hidden", + "Post image", + "(max-width: 768px) 100vw, 33vw", + "object-cover transition-transform duration-500 ease-out hover:scale-105", + "px-6 pt-6 pb-0", + "flex items-center justify-between mb-2", + "text-xs uppercase tracking-wider text-[#d4af37] font-semibold", + "text-xl font-medium text-[#36454F]", + "px-6 py-4", + "text-[#1f2b33] text-sm leading-relaxed", + "px-6 pb-6 pt-0 flex items-center justify-between", + "text-xs text-[#1f2b33]/60", + "inline-flex items-center text-xs font-medium text-[#16a34a] hover:underline transition-all", + "w-3 h-3 mr-1", + "Read more", + "flex justify-center mt-10", + "text-[#1f2b33] text-sm italic", + "Recent dispatches from the reserve — updated each season." + ], + "cmsCollection": "posts" + }, + { + "name": "DiscerningGuestVoicesSection", + "importPath": "@/components/sections/DiscerningGuestVoicesSection", + "position": 7, + "role": "unknown", + "hasImage": false, + "hasForm": false, + "itemCount": 3, + "layout": "flex-row", + "headings": [], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "C.R.", + "Zürich", + "The silence at dawn is something I have never experienced. Our guide tracked a pack of wild dogs across the riverbed — a private sighting that will stay with me forever.", + "A.L.", + "New York", + "Every meal felt like an event — the chef came to our table each evening to explain the ingredients sourced from the region. The wine cellar alone is worth the journey.", + "E.H.", + "Tokyo", + "The treatment room opens onto the bushveld. During my massage, a herd of elephants passed within fifty metres. I have never felt so connected to a place.", + "guest-voices", + "discerningguests", + "testimonials", + "py-20 bg-[#f2f4f5]", + "container mx-auto px-4 max-w-5xl", + "text-3xl md:text-4xl font-light text-[#36454F] mb-4 text-center", + "What our", + "font-semibold text-[#d4af37]", + "guests", + "carry home", + "text-[#1f2b33] text-center max-w-xl mx-auto mb-12 text-lg leading-relaxed", + "Intimate reflections — shared in confidence, offered here with permission.", + "space-y-12", + "relative pl-8 md:pl-16", + "absolute left-0 top-0 bottom-0 w-1 bg-[#16a34a] rounded-full", + "space-y-3", + "text-[#1f2b33] text-lg leading-relaxed italic", + "“", + "”", + "flex items-center gap-2 text-sm text-[#1f2b33]/70", + "font-medium", + "text-[#d4af37]" + ] + }, + { + "name": "ExclusiveBookingCtaSection", + "importPath": "@/components/sections/ExclusiveBookingCtaSection", + "position": 8, + "role": "booking", + "hasImage": false, + "hasForm": false, + "itemCount": 4, + "layout": "flex-row", + "headings": [], + "buttonLabels": [ + "Secure Your Stay" + ], + "people": [], + "allText": [ + "use client", + "@/components/ui/Button", + "lucide-react", + "exclusivebookingcta", + "book-direct", + "bg-[#36454F] py-24 px-6", + "max-w-4xl mx-auto text-center", + "w-10 h-10 text-[#d4af37] mx-auto mb-6", + "text-4xl md:text-5xl font-light text-[#f2f4f5] mb-6 leading-tight", + "text-[#d4af37]", + "Reserve", + "your suite directly", + "text-[#d4dadd] text-lg mb-8 max-w-[44ch] mx-auto leading-relaxed", + "Book with us and receive the best available rate, a personalised\n itinerary tailored to your preferences, and a curated welcome\n amenity upon arrival.", + "flex flex-col sm:flex-row justify-center gap-4 mb-10", + "flex items-center gap-3 bg-[#2a3a44] rounded-2xl px-5 py-3 text-left", + "w-6 h-6 text-[#16a34a]", + "text-sm text-[#f2f4f5]", + "Best rate guarantee", + "Personalised itinerary", + "default", + "lg", + "bg-[#d4af37] hover:bg-[#be9c2f] text-[#1f2b33] font-medium px-10 py-4 rounded-full shadow-lg hover:shadow-[#d4af37]/30 transition-all duration-200 ease-out", + "inline-block", + "Secure Your Stay" + ] + }, + { + "name": "SanctuaryLocationSection", + "importPath": "@/components/sections/SanctuaryLocationSection", + "position": 9, + "role": "unknown", + "hasImage": false, + "hasForm": false, + "itemCount": 3, + "layout": "grid", + "headings": [], + "buttonLabels": [], + "people": [], + "allText": [ + "use client", + "lucide-react", + "Hoedspruit Airport", + "45 min drive", + "Kruger Mpumalanga", + "2 hr drive", + "Johannesburg (JNB)", + "5 hr drive / 1.5 hr flight", + "sanctuarylocation", + "location", + "bg-[#f2f4f5] py-24 px-6", + "max-w-6xl mx-auto", + "flex flex-col lg:flex-row gap-12 items-center", + "relative w-full lg:w-1/2 aspect-[4/3] rounded-3xl overflow-hidden bg-[#d4dadd] shadow-xl", + "absolute inset-0 flex items-center justify-center", + "text-center", + "w-12 h-12 text-[#d4af37] mx-auto mb-2", + "text-sm text-[#1f2b33] font-medium", + "Greater Kruger, South Africa", + "absolute inset-0 grid grid-cols-6 grid-rows-4", + "border border-[#c0c4c8]/30", + "w-full lg:w-1/2", + "text-4xl md:text-5xl font-light text-[#1f2b33] mb-4 leading-tight", + "text-[#d4af37]", + "Untamed", + "by design", + "text-[#4a5a66] text-lg mb-8 leading-relaxed max-w-[44ch]", + "Nestled within the expansive Greater Kruger, Molten Rock lies at the\n intersection of wilderness and refined seclusion. Arrive via private\n airstrip or scenic road transfer from Hoedspruit.", + "space-y-5", + "flex items-center gap-4 bg-white rounded-2xl px-5 py-4 shadow-sm", + "w-5 h-5 text-[#16a34a] shrink-0", + "text-sm font-medium text-[#1f2b33]", + "text-xs text-[#4a5a66]", + "mt-8 flex items-center gap-3 bg-[#d4af37]/10 rounded-xl px-5 py-3 text-sm text-[#1f2b33]", + "w-5 h-5 text-[#d4af37]", + "Helicopter transfers available for the ultimate entrance" + ] + }, + { + "name": "GuestEnquirySection", + "importPath": "@/components/sections/GuestEnquirySection", + "position": 10, + "role": "contact", + "hasImage": false, + "hasForm": true, + "itemCount": 10, + "layout": "grid", + "headings": [], + "buttonLabels": [ + "Send Message" + ], + "people": [], + "allText": [ + "use client", + "react", + "@/components/ui/Button", + "@/components/ui/Input", + "lucide-react", + "guestenquiry", + "contact", + "bg-white py-24 px-6", + "max-w-4xl mx-auto", + "text-center mb-12", + "text-4xl md:text-5xl font-light text-[#1f2b33] mb-3 leading-tight", + "Let us", + "text-[#d4af37]", + "craft", + "your journey", + "text-[#4a5a66] text-lg max-w-[44ch] mx-auto leading-relaxed", + "Whether it is a pre-arrival request, a celebration arrangement,\n or simply curiosity — reach out and we will respond within 24 hours.", + "grid grid-cols-1 md:grid-cols-2 gap-12", + "space-y-5", + "text", + "Your name", + "border-[#d4dadd] focus:border-[#d4af37] rounded-xl bg-[#f2f4f5] px-4 py-3 text-sm", + "email", + "Email address", + "Your message", + "w-full border border-[#d4dadd] focus:border-[#d4af37] rounded-xl bg-[#f2f4f5] px-4 py-3 text-sm resize-none transition-colors duration-200 ease-out", + "text-[#16a34a] text-sm flex items-center gap-2", + "Message sent — we will be in touch shortly.", + "submit", + "default", + "w-full bg-[#36454F] hover:bg-[#2a3a44] text-white rounded-full py-3 px-6 transition-all duration-200 ease-out", + "Send Message", + "flex flex-col justify-center gap-6", + "flex items-center gap-4 bg-[#f2f4f5] rounded-2xl p-5", + "w-6 h-6 text-[#d4af37]", + "text-sm font-medium text-[#1f2b33]", + "Phone", + "text-sm text-[#4a5a66]", + "+27 82 900 1234", + "Email", + "info@moltenrock.co.za", + "Response time", + "Within 24 hours from the lodge manager" + ] + } + ], + "navigationLinks": [ + "Home", + "Exclusive Suites", + "Molten Rock Story", + "Bespoke Experiences", + "Safari Gallery", + "Guest Enquiry", + "Book a Room" + ] +} \ No newline at end of file