{ "projectName": "Ben's Noodle House", "businessType": "chinese-noodle-bar", "industry": "food-service", "tone": "Warm, proud, neighbourhood-rooted, bold and celebratory — speaking with local authenticity rather than polished corporate formality", "tier": 3, "serviceType": "restaurant", "studioProfile": "restaurant", "commerceVariant": "food-ordering", "design": { "artDirection": "luxe-dark", "variant": "velvet", "displayFont": "Marcellus", "bodyFont": "Jost", "colorSource": "typed", "rules": "relaxed" }, "generatedAt": "2026-10-11T12:59:20.212Z", "sections": [ { "name": "HeroSection", "importPath": "@/components/sections/HeroSection", "position": 0, "role": "hero", "hasImage": false, "hasForm": false, "itemCount": 1, "layout": "single", "headings": [], "buttonLabels": [], "people": [], "allText": [ "@/components/hero/HeroSlideshow", "@/lib/cms", "Ben's Noodle House", "Madadeni's first dedicated Chinese noodle House.", "Where authentic wok technique meets a South African kick, served piping hot in classic takeaway boxes right in the heart of the township.", "View our menu", "Banner", "string" ] }, { "name": "OurNoodleStorySection", "importPath": "@/components/sections/OurNoodleStorySection", "position": 1, "role": "about", "hasImage": true, "hasForm": false, "itemCount": 4, "layout": "grid", "headings": [ "Ben's Signature Wok-Tossed Noodles", "{fact.title}" ], "buttonLabels": [ "See the full menu" ], "people": [], "allText": [ "use client", "next/image", "next/link", "lucide-react", "@/components/ui/Button", "Flame first", "Every box starts in a wok over a high flame. Nothing sits under a lamp waiting for someone to walk in.", "Shredded the same day", "Cabbage and garlic are prepped fresh, because a hot wok cannot hide vegetables that have been standing around.", "Boxed for the walk", "Classic takeaway boxes, closed while the noodles are still steaming, for the trip home or back to class.", "The corner", "A section of the family property in Madadeni Section 4 became a wok station, a counter and a takeaway window. It is still the family property.", "The technique", "Ben cooks with wok skills that were handed down to him: high flame, fast hands, and seasoning that arrives at the back of the throat.", "The local part", "Fresh cabbage, garlic, a dark soy glaze he keeps to himself, and a measure of local chilli for that distinctly South African kick.", "The queue", "School students after the last bell, commuters on the walk to the taxi rank, and neighbours who send someone for two boxes at a time.", "ournoodlestory", "our-noodle-story", "bg-card text-card-foreground relative py-24 lg:py-32", "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", "grid grid-cols-1 gap-14 lg:grid-cols-12 lg:gap-16 lg:pb-12", "lg:col-span-7", "flex items-center gap-4 text-[0.7rem] font-medium uppercase tracking-[0.35em] text-card-foreground/60", "h-px w-14 bg-accent", "true", "Family property, Section 4", "mt-8 text-3xl font-light leading-[1.15] tracking-tight text-card-foreground sm:text-4xl lg:text-5xl", "Two worlds, one plate, one", "italic text-accent", "very hot wok.", "mt-6 text-base leading-relaxed text-card-foreground/75 sm:text-lg", "Ben spent years watching what Newcastle ate. Kota, shisa nyama and chips held the corner, and rightly so. But walking the same street every afternoon, past the same three smells, one question kept following him around: where does somebody buy a plate of noodles, made fresh, right here?", "mt-5 text-base leading-relaxed text-card-foreground/75 sm:text-lg", "The answer sits at the corner of the family property, where a section of the yard turned into a wok station and a window for takeaway boxes. The noodles are the real thing, springy wheat noodles tossed over a high flame, but the seasoning is not shy about where it is cooking. Local chilli keeps the whole thing honest.", "Amapiano plays from a radio nearby while the boxes go out, and the faces in the queue are faces Ben knows. On this street a business is only as good as the neighbours who come back, and they keep coming back.", "relative lg:col-span-5", "relative aspect-[4/5] w-full overflow-hidden rounded-lg border border-border", "Noodles and fresh vegetables being tossed together in a hot wok", "(max-width: 1024px) 100vw, 40vw", "object-cover transition-transform duration-500 ease-out hover:scale-105", "absolute inset-0 bg-gradient-to-t from-background/80 via-background/20 to-transparent", "mt-6 rounded-lg border border-foreground/20 bg-foreground/10 p-6 backdrop-blur-md lg:absolute lg:-bottom-12 lg:-left-10 lg:mt-0 lg:w-[88%]", "text-[0.7rem] font-medium uppercase tracking-[0.35em] text-accent", "Signature", "mt-3 text-2xl font-light italic text-card-foreground", "Ben's Signature Wok-Tossed Noodles", "mt-3 text-sm leading-relaxed text-card-foreground/70" ] }, { "name": "FeaturedDishesSection", "importPath": "@/components/sections/FeaturedDishesSection", "position": 2, "role": "services", "hasImage": false, "hasForm": false, "itemCount": 11, "layout": "grid", "headings": [ "Featured Dishes" ], "buttonLabels": [], "people": [], "allText": [ "use client", "@/hooks/useFeaturedProducts", "next/link", "lucide-react", "@/hooks/useVulaCart", "KSh", "py-20", "container mx-auto px-4", "grid grid-cols-2 md:grid-cols-4 gap-6", "aspect-square rounded-xl bg-muted animate-pulse", "featuredproducts", "flex items-center justify-between mb-10", "text-xs uppercase tracking-widest text-primary font-semibold mb-1", "Chef's Selection", "text-3xl font-bold text-foreground", "Featured Dishes", "text-sm font-semibold text-primary hover:underline underline-offset-4", "Full Menu →", "group bg-card rounded-xl overflow-hidden border border-border hover:shadow-md transition-all", "block", "relative aspect-square bg-muted", "w-full h-full object-cover group-hover:scale-105 transition-transform duration-500", "w-full h-full flex items-center justify-center", "h-8 w-8 text-muted-foreground/30", "p-4", "text-sm font-semibold text-foreground line-clamp-2 mb-1 hover:text-primary transition-colors", "text-sm font-bold text-primary mb-3", "cart-drawer-open", "w-full text-xs bg-primary/10 text-primary hover:bg-primary hover:text-primary-foreground py-2 rounded-lg transition-colors font-medium disabled:opacity-40", "Add to Order" ] }, { "name": "PopularDishesSection", "importPath": "@/components/sections/PopularDishesSection", "position": 3, "role": "unknown", "hasImage": false, "hasForm": false, "itemCount": 12, "layout": "grid", "headings": [ "Customer Favourites" ], "buttonLabels": [], "people": [], "allText": [ "use client", "react", "@/hooks/useVulaCart", "@/hooks/useProducts", "next/link", "lucide-react", "KSh", "py-20", "container mx-auto px-4", "grid grid-cols-2 md:grid-cols-4 gap-6", "aspect-square rounded-xl bg-muted animate-pulse", "mostpopular", "flex items-center justify-between mb-10", "flex items-center gap-3", "h-6 w-6 text-primary", "text-xs uppercase tracking-widest text-primary font-semibold mb-1", "Most Ordered", "text-3xl font-bold text-foreground", "Customer Favourites", "text-sm font-semibold text-primary hover:underline underline-offset-4 hidden md:inline-flex items-center gap-1", "View Menu →", "grid grid-cols-2 lg:grid-cols-4 gap-6", "group bg-card rounded-xl overflow-hidden border border-border hover:shadow-md transition-all relative", "absolute top-2 left-2 z-10 bg-primary text-primary-foreground text-xs font-semibold px-2 py-0.5 rounded-full", "Top Pick", "block overflow-hidden", "relative aspect-square bg-muted", "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300", "w-full h-full flex items-center justify-center", "h-8 w-8 text-muted-foreground/30", "p-4", "text-sm font-semibold text-foreground line-clamp-2 mb-1 hover:text-primary transition-colors", "text-sm font-bold text-primary mb-3", "cart-drawer-open", "w-full text-xs bg-primary/10 text-primary hover:bg-primary hover:text-primary-foreground py-2 rounded-lg transition-colors font-medium disabled:opacity-40", "Add to Order" ] }, { "name": "MenuHighlightsSection", "importPath": "@/components/sections/MenuHighlightsSection", "position": 4, "role": "unknown", "hasImage": false, "hasForm": false, "itemCount": 11, "layout": "grid", "headings": [ "Menu Highlights" ], "buttonLabels": [], "people": [], "allText": [ "use client", "@/hooks/useProducts", "next/link", "lucide-react", "@/hooks/useVulaCart", "KSh", "py-20", "container mx-auto px-4", "grid grid-cols-2 md:grid-cols-4 gap-6", "aspect-square rounded-xl bg-muted animate-pulse", "menuhighlights", "flex items-center justify-between mb-10", "text-xs uppercase tracking-widest text-primary font-semibold mb-1", "On The Menu", "text-3xl font-bold text-foreground", "Menu Highlights", "text-sm font-semibold text-primary hover:underline underline-offset-4", "Full Menu →", "group bg-card rounded-xl overflow-hidden border border-border hover:shadow-md transition-all", "block", "relative aspect-square bg-muted", "w-full h-full object-cover group-hover:scale-105 transition-transform duration-500", "w-full h-full flex items-center justify-center", "h-8 w-8 text-muted-foreground/30", "p-4", "text-sm font-semibold text-foreground line-clamp-2 mb-1 hover:text-primary transition-colors", "text-sm font-bold text-primary mb-3", "cart-drawer-open", "w-full text-xs bg-primary/10 text-primary hover:bg-primary hover:text-primary-foreground py-2 rounded-lg transition-colors font-medium disabled:opacity-40", "Add to Order" ] }, { "name": "SpecialsSection", "importPath": "@/components/sections/SpecialsSection", "position": 5, "role": "cms-specials", "hasImage": false, "hasForm": false, "itemCount": -1, "layout": "grid", "headings": [ "Today's Specials", "{s.title}" ], "buttonLabels": [], "people": [], "allText": [ "use client", "@/hooks/useVulaContent", "lucide-react", "specials", "py-20 bg-muted/30", "container mx-auto px-4", "grid grid-cols-1 md:grid-cols-3 gap-6", "h-64 rounded-xl bg-muted animate-pulse", "text-center mb-10", "flex items-center justify-center gap-2 mb-2", "h-5 w-5 text-primary", "text-xs uppercase tracking-widest text-primary font-semibold", "Limited Time", "text-3xl font-bold text-foreground", "Today's Specials", "bg-card rounded-xl overflow-hidden border border-border hover:shadow-md transition-all", "aspect-video overflow-hidden", "w-full h-full object-cover hover:scale-105 transition-transform duration-500", "p-5", "flex items-start justify-between gap-3 mb-2", "font-semibold text-foreground text-lg leading-tight", "text-primary font-bold text-lg whitespace-nowrap", "text-muted-foreground text-sm leading-relaxed", "text-xs text-muted-foreground mt-3 font-medium", "Until" ], "cmsCollection": "specials" }, { "name": "MadadeniFoodGallerySection", "importPath": "@/components/sections/MadadeniFoodGallerySection", "position": 6, "role": "gallery", "hasImage": true, "hasForm": false, "itemCount": -1, "layout": "grid", "headings": [], "buttonLabels": [], "people": [], "allText": [ "use client", "react", "next/image", "lucide-react", "@/hooks/useVulaContent", "@/components/ui/Modal", "gallery", "flex justify-center py-16", "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin", "food-venue-gallery", "madadenifoodgallery", "bg-background text-foreground py-24 sm:py-32", "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", "mx-auto max-w-3xl text-center", "flex items-center justify-center gap-4", "h-px w-14 bg-accent", "true", "text-[11px] uppercase tracking-[0.3em] text-accent", "Madadeni Section 4, Newcastle", "font-display mt-6 text-3xl font-light leading-tight tracking-tight sm:text-4xl lg:text-5xl", "Smoke off the wok, and a box still", "italic text-accent", "too hot to hold", "mx-auto mt-6 max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg", "None of this was shot in a studio. These are the plates that leave the corner, the flames they come off, and the Section 4 space where it all happens.", "mt-16 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", "button", "Open", "full screen", "Open photo full screen", "group relative block cursor-pointer overflow-hidden rounded-lg border border-foreground/20 text-left transition-all duration-200 ease-out hover:border-accent/60", "sm:col-span-2", "relative w-full", "aspect-[16/9]", "aspect-[4/3]", "Food from the wok", "(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw", "object-cover transition-transform duration-500 ease-out group-hover:scale-105", "flex h-full w-full items-center justify-center bg-foreground/5 text-muted-foreground", "h-10 w-10", "pointer-events-none absolute inset-0 bg-gradient-to-t from-background via-background/30 to-transparent", "absolute inset-x-0 bottom-0 border-t border-foreground/20 bg-foreground/10 p-4 backdrop-blur-md", "font-display text-lg font-light text-foreground", "mt-1 text-sm leading-relaxed text-muted-foreground", "mt-10 text-center text-[11px] uppercase tracking-[0.3em] text-muted-foreground", "Tap a frame to open it full screen", "relative aspect-[4/3] w-full overflow-hidden rounded-lg border border-foreground/20 bg-foreground/10", "(max-width: 768px) 100vw, 900px", "object-cover", "flex h-full w-full items-center justify-center text-muted-foreground" ], "cmsCollection": "gallery" }, { "name": "FamilyBehindTheWokSection", "importPath": "@/components/sections/FamilyBehindTheWokSection", "position": 7, "role": "unknown", "hasImage": true, "hasForm": false, "itemCount": 15, "layout": "grid", "headings": [ "{person.name}" ], "buttonLabels": [], "people": [], "allText": [ "next/image", "lucide-react", "Ben", "The wok", "Ben cooks the noodles himself. He watched Newcastle's street food settle into kota, shisa nyama and chips, and set his wok down beside it: wheat noodles flashed over high heat with garlic, fresh cabbage, a dark soy glaze and a hit of local chilli that keeps it South African. When the queue at the window gets long, he is the reason it still moves.", "Signature wok-tossed noodles", "Dark soy glaze", "Heat levels", "Nomsa", "Counter and takeaway", "Nomsa runs the counter and the takeaway window: she takes the order, checks how hot you want it, calls it through to the wok and hands it over without letting it go cold. If it is your first time at the corner, ask her what to start with.", "Orders and collection", "First-timers", "School-rush queue", "Sipho", "Prep and fresh vegetables", "Sipho keeps the prep station stocked so nothing sits still while the wok is hot: cabbage shredded, spring onion and chilli ready, takeaway boxes stacked within reach, and the counter wiped down between orders.", "Prep station", "Fresh vegetables", "Boxes and packing", "overflow-hidden rounded-lg border border-foreground/20 bg-foreground/10 backdrop-blur-md lg:col-span-2", "grid md:grid-cols-2", "relative aspect-[4/3] w-full overflow-hidden md:aspect-auto md:min-h-[460px]", "(max-width: 768px) 100vw, 50vw", "object-cover", "pointer-events-none absolute inset-0 bg-gradient-to-t from-background/70 via-transparent to-transparent", "flex flex-col justify-center p-8 sm:p-10 lg:p-12", "inline-flex items-center gap-2 text-[11px] uppercase tracking-[0.3em] text-accent", "h-4 w-4", "Behind the wok", "font-display mt-4 text-2xl font-light tracking-tight sm:text-3xl", "mt-2 text-[11px] uppercase tracking-[0.25em] text-muted-foreground", "mt-6 text-base leading-relaxed text-muted-foreground", "mt-7 flex flex-wrap gap-2", "rounded-full border border-foreground/20 px-3 py-1 text-[11px] uppercase tracking-[0.15em] text-muted-foreground", "group overflow-hidden rounded-lg border border-foreground/20 bg-foreground/10 backdrop-blur-md transition-all duration-200 ease-out hover:border-accent/60", "relative aspect-[4/3] w-full overflow-hidden", "(max-width: 1024px) 100vw, 50vw", "object-cover transition-transform duration-500 ease-out group-hover:scale-105", "pointer-events-none absolute inset-0 bg-gradient-to-t from-background/80 via-transparent to-transparent", "p-6 sm:p-8", "font-display text-xl font-light tracking-tight", "mt-1 text-[11px] uppercase tracking-[0.25em] text-accent", "mt-4 text-sm leading-relaxed text-muted-foreground", "mt-5 flex flex-wrap gap-2", "family-behind-wok", "familybehindwok", "bg-card text-card-foreground py-24 sm:py-32", "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", "max-w-3xl" ] }, { "name": "NeighbourhoodLoveSection", "importPath": "@/components/sections/NeighbourhoodLoveSection", "position": 8, "role": "unknown", "hasImage": false, "hasForm": false, "itemCount": 6, "layout": "grid", "headings": [], "buttonLabels": [], "people": [], "allText": [ "use client", "react", "lucide-react", "(prefers-reduced-motion: reduce)", "neighbourhood-love", "neighbourhoodlove", "bg-background text-foreground py-24 sm:py-32", "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", "max-w-3xl", "flex items-center gap-4", "h-px w-14 bg-accent", "true", "text-[11px] uppercase tracking-[0.32em] text-muted-foreground", "Word of mouth, Section 4", "mt-6 text-4xl font-light leading-tight tracking-tight sm:text-5xl", "The queue talks", "italic text-accent", "before the wok does.", "mt-5 max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg", "Nobody wrote these down for us. They came off the pavement outside the red sign — learners on the walk home, commuters waiting on a taxi, neighbours who order the same box every Friday.", "mt-14 grid gap-10 lg:grid-cols-12 lg:gap-12", "lg:col-span-8", "relative overflow-hidden rounded-lg border border-foreground/20 bg-foreground/10 p-8 backdrop-blur-md sm:p-12", "h-7 w-7 text-accent", "relative mt-6 min-h-[340px] sm:min-h-[260px]", "absolute inset-0 opacity-100 transition-opacity duration-700 ease-out", "pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-700 ease-out", "text-xl font-light leading-relaxed text-foreground sm:text-2xl", "mt-8 text-[11px] uppercase tracking-[0.28em] text-muted-foreground", "mx-3 text-accent", "mt-10 flex items-center justify-between gap-6 border-t border-foreground/15 pt-6", "flex flex-wrap gap-2", "button", "h-2.5 w-2.5 rounded-full bg-accent transition-all duration-200 ease-out", "h-2.5 w-2.5 rounded-full bg-foreground/25 transition-all duration-200 ease-out hover:bg-foreground/50", "flex items-center gap-3", "text-[11px] uppercase tracking-[0.28em] text-muted-foreground", "Previous neighbourhood voice", "flex h-11 w-11 items-center justify-center rounded-lg border border-foreground/20 bg-foreground/10 text-foreground backdrop-blur-md transition-all duration-200 ease-out hover:border-accent/60 hover:text-accent", "h-5 w-5", "Next neighbourhood voice", "lg:col-span-4", "rounded-lg border border-foreground/20 bg-foreground/10 p-6 backdrop-blur-md", "text-[11px] uppercase tracking-[0.32em] text-accent", "Counter rule", "mt-4 text-sm leading-relaxed text-muted-foreground", "Say hello when you order. Half the street knows the box by name before the order is finished.", "mt-6 rounded-lg border border-foreground/20 bg-foreground/10 p-6 backdrop-blur-md", "Eaten here?", "Your words are welcome on our wall. Tell us at the counter what the chilli did to you." ] }, { "name": "WokStoriesBlogSection", "importPath": "@/components/sections/WokStoriesBlogSection", "position": 9, "role": "blog", "hasImage": true, "hasForm": false, "itemCount": -1, "layout": "grid", "headings": [ "{lead.title}", "{post.title}" ], "buttonLabels": [], "people": [ "Wok Stories" ], "allText": [ "use client", "next/image", "next/link", "lucide-react", "@/components/ui/Badge", "@/hooks/useVulaContent", "posts", "flex justify-center py-16", "w-8 h-8 rounded-full border-2 border-current border-t-transparent animate-spin", "wok-stories", "wokstoriesblog", "bg-card text-card-foreground py-24 sm:py-32", "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", "flex flex-col gap-6 sm:flex-row sm:items-end sm:justify-between", "max-w-2xl", "flex items-center gap-4", "h-px w-14 bg-accent", "true", "text-[11px] uppercase tracking-[0.32em] text-muted-foreground", "Wok Stories", "mt-6 text-4xl font-light leading-tight tracking-tight sm:text-5xl", "What happens between", "italic text-accent", "order and box.", "max-w-md text-sm leading-relaxed text-muted-foreground", "Notes from the corner — new things going into the wok, what the street asked us to try next, and the people who keep coming back.", "group relative mt-14 overflow-hidden rounded-lg border border-foreground/20 bg-foreground/10 backdrop-blur-md", "grid gap-0 lg:grid-cols-2", "relative aspect-[4/3] w-full overflow-hidden lg:aspect-auto lg:h-full lg:min-h-[380px]", "(max-width: 1024px) 100vw, 50vw", "object-cover transition-transform duration-500 ease-out group-hover:scale-105", "flex h-full w-full items-center justify-center bg-secondary", "h-8 w-8 text-muted-foreground", "flex flex-col justify-center gap-5 p-8 sm:p-12", "accent", "text-2xl font-light leading-snug sm:text-3xl", "text-sm leading-relaxed text-muted-foreground sm:text-base", "flex flex-wrap items-center gap-6 text-[11px] uppercase tracking-[0.28em] text-muted-foreground", "inline-flex items-center gap-2 text-accent transition-all duration-200 ease-out hover:gap-3", "Read the story", "h-3.5 w-3.5", "mt-8 grid gap-6 md:grid-cols-2 lg:grid-cols-3", "group flex flex-col overflow-hidden rounded-lg border border-foreground/20 bg-foreground/10 backdrop-blur-md", "relative aspect-video w-full overflow-hidden", "(max-width: 768px) 100vw, 33vw", "h-7 w-7 text-muted-foreground", "flex flex-1 flex-col gap-4 p-6", "outline", "text-lg font-light leading-snug", "text-sm leading-relaxed text-muted-foreground" ], "cmsCollection": "posts" }, { "name": "VisitTheWokContactSection", "importPath": "@/components/sections/VisitTheWokContactSection", "position": 10, "role": "contact", "hasImage": false, "hasForm": true, "itemCount": 16, "layout": "grid", "headings": [ "A question about an order, a big box, or noodles for a whole class?" ], "buttonLabels": [], "people": [], "allText": [ "use client", "react", "next/link", "lucide-react", "@/components/ui/Button", "@/components/ui/Input", "@/components/BusinessContact", "@/components/BusinessHours", "@/components/BusinessMap", "@/hooks/useEnquiry", "whatsapp", "email", "Add your name and a number we can reach you on, then send again.", "visit-the-wok", "visitthewokcontact", "bg-background text-foreground py-24 sm:py-32", "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", "grid gap-14 lg:grid-cols-12 lg:gap-16", "lg:col-span-7", "flex items-center gap-4", "h-px w-14 bg-accent", "true", "text-[11px] uppercase tracking-[0.32em] text-muted-foreground", "Madadeni Section 4 · Newcastle", "mt-6 text-4xl font-light leading-tight tracking-tight sm:text-5xl", "Order on the way, collect it", "italic text-accent", "still steaming.", "mt-5 max-w-xl text-base leading-relaxed text-muted-foreground sm:text-lg", "The wok is on from early until the last box leaves the counter. Come past for a takeaway, or send your order through first and pick it up at the corner — no long wait, nothing sitting under a lamp.", "mt-9 flex flex-wrap items-center gap-4", "lg", "gap-2 border border-accent bg-accent text-accent-foreground transition-all duration-200 ease-out hover:bg-accent/90", "Order Online", "h-4 w-4", "mt-14 grid gap-10 border-t border-foreground/15 pt-10 sm:grid-cols-2", "flex items-center gap-3", "h-4 w-4 text-accent", "text-[11px] uppercase tracking-[0.28em] text-muted-foreground", "Find the corner", "mt-4 text-sm leading-relaxed text-muted-foreground", "Counter hours", "mt-4", "lg:col-span-5", "rounded-lg border border-foreground/20 bg-foreground/10 p-8 backdrop-blur-md sm:p-10", "text-[11px] uppercase tracking-[0.32em] text-accent", "Talk to the counter", "mt-4 text-2xl font-light leading-snug", "A question about an order, a big box, or noodles for a whole class?", "Send it through. We answer between tosses." ] }, { "name": "AdvertBannerSection", "importPath": "@/components/sections/AdvertBannerSection", "position": 99, "role": "hero", "hasImage": false, "hasForm": false, "itemCount": 0, "layout": "unknown", "headings": [], "buttonLabels": [], "people": [], "allText": [] } ], "navigationLinks": [ "House", "Home", "About", "Gallery", "Contact", "Order Online", "My Account" ], "cmsCollections": [ { "slug": "specials", "label": "Daily Specials", "icon": "Utensils", "aiEnabled": true, "seedCount": 3, "fields": [ { "name": "title", "type": "text", "label": "Dish / Item" }, { "name": "description", "type": "textarea", "label": "Description" }, { "name": "price", "type": "price", "label": "Price" }, { "name": "available_until", "type": "text", "label": "Available until" }, { "name": "image", "type": "image", "label": "Photo" } ] }, { "slug": "gallery", "label": "Food & Venue Photos", "icon": "Image", "aiEnabled": false, "seedCount": 3, "fields": [ { "name": "title", "type": "text", "label": "Caption" }, { "name": "description", "type": "text", "label": "Details" }, { "name": "image", "type": "image", "label": "Photo" } ] }, { "slug": "campaigns", "label": "Campaigns", "icon": "Megaphone", "aiEnabled": true, "seedCount": 1, "fields": [ { "name": "title", "type": "text", "label": "Title" }, { "name": "headline", "type": "text", "label": "Headline" }, { "name": "body", "type": "textarea", "label": "Body copy" }, { "name": "cta_text", "type": "text", "label": "Button text" }, { "name": "image", "type": "image", "label": "Image" } ] }, { "slug": "posts", "label": "Blog Posts", "icon": "BookOpen", "aiEnabled": true, "seedCount": 3, "fields": [ { "name": "title", "type": "text", "label": "Title" }, { "name": "excerpt", "type": "textarea", "label": "Excerpt" }, { "name": "body", "type": "textarea", "label": "Body" }, { "name": "author", "type": "text", "label": "Author" }, { "name": "category", "type": "text", "label": "Category" }, { "name": "image", "type": "image", "label": "Cover photo" } ] }, { "slug": "business_hours", "label": "Opening Hours", "icon": "Clock", "aiEnabled": false, "seedCount": 3, "fields": [ { "name": "open", "type": "text", "label": "Opens" }, { "name": "close", "type": "text", "label": "Closes" } ] }, { "slug": "advert_banners", "label": "Banners", "icon": "Image", "aiEnabled": false, "seedCount": 3, "fields": [ { "name": "headline", "type": "text", "label": "Headline" }, { "name": "subheadline", "type": "text", "label": "Subheadline" }, { "name": "cta_text", "type": "text", "label": "Button text" }, { "name": "cta_url", "type": "text", "label": "Button link" }, { "name": "image", "type": "image", "label": "Background image" }, { "name": "start_date", "type": "text", "label": "Starts (YYYY-MM-DD)" }, { "name": "end_date", "type": "text", "label": "Ends (YYYY-MM-DD)" } ] }, { "slug": "featured_products", "label": "Featured Products", "icon": "Star", "aiEnabled": false, "seedCount": 3, "fields": [ { "name": "product_ids", "type": "list", "label": "Chosen products" } ] } ], "platformAuthored": [ "src/components/ui/Button.tsx", "src/components/ui/Input.tsx", "src/components/hero/HeroSlideshow.tsx", "src/app/icon.svg", "package.json", "tsconfig.json", "components.json", "next.config.js", "postcss.config.js", "tailwind.config.js", "src/lib/utils.ts", "src/components/BusinessContact.tsx", "src/components/BusinessMap.tsx", "src/hooks/useEnquiry.ts", "src/components/BusinessSchema.tsx", "src/components/BusinessSocials.tsx", "src/lib/siteMeta.ts", "src/app/sitemap.ts", "src/app/robots.ts", ".env.local", "src/hooks/useProducts.ts", "src/app/api/products/route.ts", "src/hooks/useCustomerAuth.ts", "src/hooks/useVulaCart.ts", "src/app/cart/page.tsx", "src/app/checkout/page.tsx", "src/app/menu/page.tsx", "src/app/menu/[dishId]/page.tsx", "src/components/shop/DishDetailClient.tsx", "src/components/sections/FeaturedDishesSection.tsx", "src/components/sections/PopularDishesSection.tsx", "src/components/sections/MenuHighlightsSection.tsx", "src/components/sections/SpecialsSection.tsx", "src/app/order/[orderId]/page.tsx", "src/components/shop/CartDrawer.tsx", "src/hooks/useFeaturedProducts.ts", "src/app/api/popular-products/route.ts", "src/components/sections/AdvertBannerSection.tsx", "src/app/blog/page.tsx", "src/app/blog/[slug]/page.tsx", "src/app/account/login/page.tsx", "src/app/account/register/page.tsx", "src/app/account/orders/page.tsx", "src/app/account/profile/page.tsx", "src/lib/cms.ts", "src/app/api/content/[collection]/route.ts", "src/hooks/useVulaContent.ts", "src/components/BusinessHours.tsx" ] }