{"id":18,"date":"2026-07-30T13:56:54","date_gmt":"2026-07-30T13:56:54","guid":{"rendered":"https:\/\/mahall.org\/?page_id=18"},"modified":"2026-07-30T13:59:52","modified_gmt":"2026-07-30T13:59:52","slug":"home-page-v6","status":"publish","type":"page","link":"https:\/\/mahall.org\/index.php\/home-page-v6\/","title":{"rendered":"Home Page"},"content":{"rendered":"\n<!--\n  MAHALL \u2014 homepage (v0.6)\n  ------------------------------------------------------------------\n  WHAT CHANGED FROM v0.1\n  - AI search now calls the upgraded v0.6 proxy; response includes\n    named venue matches with reasons, not just filter tags\n  - Search result panel shows match cards (name, city, price, why it\n    fits) not just a text snippet\n  - Venue grid re-fetches from \/wp-json\/mahall\/v1\/venues (the live\n    CPT\/JSON catalogue) on load and on filter change\n  - AI concierge sends full conversation history each turn so Claude\n    has multi-turn context (not just single-message)\n  - Venue cards now link to \/venues\/[slug] (adjust URL pattern to\n    match whatever WP page structure you set up)\n  - All v0.1 local fallbacks retained so the page still works before\n    the backend is wired\n------------------------------------------------------------------- -->\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..700;1,9..144,400..600&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');\n\n#mahall{\n  --bg:#16130F; --bg-raised:#1E1A14; --bg-card:#241F18;\n  --ink:#F3ECE0; --ink-soft:#BBAE99; --ink-faint:#7A7163;\n  --gold:#D98E33; --gold-soft:#E8B978;\n  --teal:#2F6F62; --teal-soft:#5C988B;\n  --line:rgba(243,236,224,0.12);\n  --radius:14px;\n  font-family:'Inter',sans-serif; background:var(--bg); color:var(--ink);\n  -webkit-font-smoothing:antialiased; overflow-x:hidden;\n}\n#mahall *{box-sizing:border-box; margin:0; padding:0;}\n#mahall a{color:inherit; text-decoration:none;}\n#mahall .wrap{max-width:1180px; margin:0 auto; padding:0 28px;}\n#mahall .eyebrow{font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.14em; text-transform:uppercase; color:var(--gold-soft);}\n#mahall h1,#mahall h2,#mahall h3{font-family:'Fraunces',serif; font-weight:500; line-height:1.08; color:var(--ink);}\n#mahall p{color:var(--ink-soft); line-height:1.65;}\n#mahall .btn{display:inline-flex; align-items:center; gap:8px; font-weight:500; font-size:14px; padding:12px 22px; border-radius:999px; border:1px solid var(--line); cursor:pointer; background:transparent; color:var(--ink); transition:border-color .2s, transform .15s, background .2s;}\n#mahall .btn:hover{border-color:var(--gold-soft); transform:translateY(-1px);}\n#mahall .btn:focus-visible{outline:2px solid var(--gold); outline-offset:2px;}\n#mahall .btn-solid{background:var(--gold); border-color:var(--gold); color:#1A1305;}\n#mahall .btn-solid:hover{background:var(--gold-soft);}\n\n#mahall .star{position:relative; width:18px; height:18px; flex:none;}\n#mahall .star span{position:absolute; inset:0; border:1.4px solid var(--gold);}\n#mahall .star span:last-child{transform:rotate(45deg);}\n#mahall .stitch{display:flex; align-items:center; justify-content:center; gap:22px; padding:6px 0; opacity:0; transform:translateY(8px); transition:opacity .6s, transform .6s;}\n#mahall .stitch.in{opacity:1; transform:none;}\n#mahall .stitch .star{width:10px; height:10px; opacity:.55;}\n#mahall .stitch .rule{height:1px; width:64px; background:var(--line);}\n\n#mahall nav{position:sticky; top:0; z-index:40; backdrop-filter:blur(10px); background:rgba(22,19,15,0.86); border-bottom:1px solid var(--line);}\n#mahall nav .row{display:flex; align-items:center; justify-content:space-between; padding:16px 28px; max-width:1180px; margin:0 auto;}\n#mahall .logo{display:flex; align-items:center; gap:10px; font-family:'Fraunces',serif; font-size:20px;}\n#mahall .navlinks{display:flex; gap:32px; font-size:14px; color:var(--ink-soft);}\n#mahall .navlinks a:hover{color:var(--ink);}\n#mahall .navcta{display:flex; gap:10px;}\n#mahall .navtoggle{display:none; background:none; border:none; color:var(--ink); font-size:22px; cursor:pointer;}\n#mahall .mobile-menu{display:none; flex-direction:column; background:var(--bg-raised); border-bottom:1px solid var(--line); padding:16px 28px; gap:16px; font-size:14px;}\n#mahall .mobile-menu.open{display:flex;}\n@media(max-width:860px){\n  #mahall .navlinks{display:none;}\n  #mahall .navtoggle{display:block;}\n}\n\n#mahall .hero{padding:96px 0 64px;}\n#mahall .hero .wrap{max-width:760px; text-align:center; margin:0 auto;}\n#mahall .hero .eyebrow{display:block; margin-bottom:18px;}\n#mahall .hero h1{font-size:clamp(40px,6vw,64px); margin-bottom:18px;}\n#mahall .hero h1 em{font-style:italic; color:var(--gold-soft);}\n#mahall .hero p.lead{font-size:17px; max-width:540px; margin:0 auto 36px;}\n\n#mahall .search{display:flex; gap:8px; background:var(--bg-raised); border:1px solid var(--line); border-radius:999px; padding:8px; max-width:640px; margin:0 auto 10px; flex-wrap:wrap;}\n#mahall .search input{flex:1; min-width:160px; background:transparent; border:none; color:var(--ink); font-family:'Inter',sans-serif; font-size:14px; padding:10px 14px; outline:none;}\n#mahall .search input::placeholder{color:var(--ink-faint);}\n#mahall .search button{background:var(--gold); color:#1A1305; border:none; border-radius:999px; font-family:'Inter',sans-serif; font-weight:600; font-size:14px; padding:10px 20px; cursor:pointer; display:flex; align-items:center; gap:6px; transition:background .2s;}\n#mahall .search button:hover{background:var(--gold-soft);}\n#mahall .search-hint{font-size:12px; color:var(--ink-faint); text-align:center; margin-bottom:18px;}\n\n\/* Rich search results panel *\/\n#mahall .search-panel{max-width:640px; margin:0 auto 8px; display:none;}\n#mahall .search-panel.show{display:block;}\n#mahall .search-summary{font-size:13px; color:var(--ink-soft); margin-bottom:12px; padding:10px 14px; background:var(--bg-card); border:1px solid var(--line); border-radius:10px;}\n#mahall .match-cards{display:flex; flex-direction:column; gap:8px;}\n#mahall .match-card{display:flex; align-items:center; gap:14px; padding:12px 16px; background:var(--bg-raised); border:1px solid var(--line); border-radius:12px; text-decoration:none; transition:border-color .2s;}\n#mahall .match-card:hover{border-color:var(--gold-soft);}\n#mahall .match-num{font-family:'JetBrains Mono',monospace; font-size:11px; color:var(--gold-soft); width:20px; flex:none; text-align:center;}\n#mahall .match-info{flex:1;}\n#mahall .match-info b{display:block; font-size:14px; color:var(--ink); margin-bottom:2px;}\n#mahall .match-info span{font-size:12px; color:var(--ink-faint);}\n#mahall .match-reason{font-size:12px; color:var(--teal-soft); font-style:italic;}\n#mahall .match-price{font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--gold-soft); white-space:nowrap;}\n\n#mahall .stats{display:flex; justify-content:center; gap:40px; margin-top:48px; flex-wrap:wrap;}\n#mahall .stat{text-align:center;}\n#mahall .stat b{display:block; font-family:'Fraunces',serif; font-size:26px; color:var(--gold-soft);}\n#mahall .stat span{font-size:12px; color:var(--ink-faint); letter-spacing:.05em;}\n\n#mahall .section{padding:64px 0;}\n#mahall .section-head{max-width:560px; margin-bottom:36px;}\n#mahall .section-head .eyebrow{margin-bottom:10px; display:block;}\n#mahall .section-head h2{font-size:30px;}\n\n#mahall .cat-grid{display:grid; grid-template-columns:repeat(4,1fr); gap:14px;}\n#mahall .cat-card{background:var(--bg-card); border:1px solid var(--line); border-radius:var(--radius); padding:20px; cursor:pointer; transition:border-color .2s, transform .15s; text-align:left;}\n#mahall .cat-card:hover{border-color:var(--gold-soft); transform:translateY(-2px);}\n#mahall .cat-card.active{border-color:var(--gold); background:rgba(217,142,51,0.08);}\n#mahall .cat-card .ic{font-size:20px; margin-bottom:14px; display:block;}\n#mahall .cat-card h3{font-size:15px; font-weight:500; font-family:'Inter',sans-serif; margin-bottom:4px; color:var(--ink);}\n#mahall .cat-card p{font-size:12px; color:var(--ink-faint); margin:0;}\n@media(max-width:860px){#mahall .cat-grid{grid-template-columns:repeat(2,1fr);}}\n\n#mahall .filters{display:flex; gap:8px; margin-bottom:28px; flex-wrap:wrap;}\n#mahall .filter-pill{font-family:'JetBrains Mono',monospace; font-size:12px; padding:8px 16px; border-radius:999px; border:1px solid var(--line); color:var(--ink-soft); cursor:pointer; background:transparent; transition:border-color .2s, color .2s;}\n#mahall .filter-pill.active{border-color:var(--gold); color:var(--gold-soft);}\n#mahall .venue-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:18px;}\n#mahall .venue-card{background:var(--bg-card); border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; transition:transform .2s, border-color .2s; display:block; color:inherit;}\n#mahall .venue-card:hover{transform:translateY(-3px); border-color:var(--gold-soft);}\n#mahall .venue-img{height:160px; position:relative; overflow:hidden; background:repeating-linear-gradient(45deg, rgba(217,142,51,.10) 0 10px, rgba(47,111,98,.10) 10px 20px); display:flex; align-items:flex-end; padding:12px;}\n#mahall .venue-tag{font-family:'JetBrains Mono',monospace; font-size:10px; letter-spacing:.06em; text-transform:uppercase; background:rgba(22,19,15,0.7); color:var(--gold-soft); padding:4px 9px; border-radius:999px; border:1px solid var(--line);}\n#mahall .venue-body{padding:16px 18px;}\n#mahall .venue-body h3{font-size:16px; font-family:'Inter',sans-serif; font-weight:600; margin-bottom:4px;}\n#mahall .venue-body p{font-size:13px; margin:0;}\n#mahall .venue-price{display:flex; justify-content:space-between; align-items:center; margin-top:10px; font-size:12px; color:var(--ink-faint);}\n#mahall .venue-price b{color:var(--gold-soft); font-weight:500;}\n#mahall .venue-loading{text-align:center; padding:40px; color:var(--ink-faint); font-size:13px; grid-column:1\/-1;}\n@media(max-width:860px){#mahall .venue-grid{grid-template-columns:1fr 1fr;}}\n@media(max-width:560px){#mahall .venue-grid{grid-template-columns:1fr;}}\n\n#mahall .cta-band{background:linear-gradient(180deg, rgba(47,111,98,.16), rgba(47,111,98,.05)); border:1px solid var(--line); border-radius:20px; padding:48px; text-align:center;}\n#mahall .cta-band h2{font-size:28px; margin-bottom:10px;}\n#mahall .cta-band p{max-width:440px; margin:0 auto 26px;}\n\n#mahall footer{border-top:1px solid var(--line); padding:48px 0 28px;}\n#mahall .foot-grid{display:grid; grid-template-columns:1.4fr 1fr 1fr 1fr; gap:32px; margin-bottom:36px;}\n#mahall .foot-grid h4{font-family:'Inter',sans-serif; font-size:13px; font-weight:600; margin-bottom:14px; color:var(--ink);}\n#mahall .foot-grid a{display:block; font-size:13px; color:var(--ink-soft); margin-bottom:8px;}\n#mahall .foot-grid a:hover{color:var(--gold-soft);}\n#mahall .foot-bottom{display:flex; justify-content:space-between; font-size:12px; color:var(--ink-faint); flex-wrap:wrap; gap:8px;}\n@media(max-width:860px){#mahall .foot-grid{grid-template-columns:1fr 1fr;}}\n\n#mahall .reveal{opacity:0; transform:translateY(16px); transition:opacity .7s, transform .7s;}\n#mahall .reveal.in{opacity:1; transform:none;}\n\n\/* AI concierge *\/\n#mahall .ai-fab{position:fixed; bottom:24px; right:24px; z-index:60; width:58px; height:58px; border-radius:50%; background:var(--gold); color:#1A1305; border:none; cursor:pointer; font-size:22px; box-shadow:0 0 0 0 rgba(217,142,51,.5); animation:pulse 2.6s infinite; display:flex; align-items:center; justify-content:center;}\n@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(217,142,51,.45);}70%{box-shadow:0 0 0 14px rgba(217,142,51,0);}100%{box-shadow:0 0 0 0 rgba(217,142,51,0);}}\n#mahall .ai-panel{position:fixed; bottom:92px; right:24px; z-index:60; width:340px; max-height:500px; background:var(--bg-raised); border:1px solid var(--line); border-radius:16px; display:none; flex-direction:column; overflow:hidden; box-shadow:0 20px 60px rgba(0,0,0,.4);}\n#mahall .ai-panel.open{display:flex;}\n#mahall .ai-head{padding:14px 16px; border-bottom:1px solid var(--line); display:flex; align-items:center; gap:10px; justify-content:space-between;}\n#mahall .ai-head-left{display:flex; align-items:center; gap:10px;}\n#mahall .ai-head b{font-family:'Fraunces',serif; font-size:15px;}\n#mahall .ai-head span{font-size:11px; color:var(--ink-faint); display:block;}\n#mahall .ai-close{background:none; border:none; color:var(--ink-faint); font-size:18px; cursor:pointer; line-height:1; padding:2px 6px;}\n#mahall .ai-body{flex:1; overflow-y:auto; padding:14px 16px; display:flex; flex-direction:column; gap:10px; font-size:13px;}\n#mahall .msg{max-width:88%; padding:9px 12px; border-radius:12px; line-height:1.5;}\n#mahall .msg.bot{background:var(--bg-card); align-self:flex-start; color:var(--ink-soft);}\n#mahall .msg.me{background:var(--gold); color:#1A1305; align-self:flex-end;}\n#mahall .msg.thinking{color:var(--ink-faint); font-style:italic;}\n#mahall .ai-input{display:flex; gap:8px; padding:12px; border-top:1px solid var(--line);}\n#mahall .ai-input input{flex:1; background:var(--bg); border:1px solid var(--line); border-radius:999px; padding:9px 14px; color:var(--ink); font-size:13px; outline:none;}\n#mahall .ai-input input:focus{border-color:var(--gold-soft);}\n#mahall .ai-input button{background:var(--gold); border:none; color:#1A1305; border-radius:999px; width:36px; height:36px; cursor:pointer; font-size:16px;}\n#mahall .suggested-q{display:flex; flex-wrap:wrap; gap:6px; padding:0 16px 12px;}\n#mahall .sq{font-size:11px; padding:5px 10px; border-radius:999px; border:1px solid var(--line); color:var(--ink-faint); cursor:pointer; background:transparent;}\n#mahall .sq:hover{border-color:var(--gold-soft); color:var(--gold-soft);}\n\n@media(prefers-reduced-motion:reduce){#mahall .ai-fab{animation:none;} #mahall .reveal,#mahall .stitch{transition:none;}}\n<\/style>\n\n<div id=\"mahall\">\n\n  <nav>\n    <div class=\"row\">\n      <div class=\"logo\"><span class=\"star\"><span><\/span><span><\/span><\/span> Mahall<\/div>\n      <div class=\"navlinks\">\n        <a href=\"#categories\">Categories<\/a>\n        <a href=\"#venues\">Venues<\/a>\n        <a href=\"#owners\">For owners<\/a>\n        <a href=\"\/register\">Register<\/a>\n      <\/div>\n      <div class=\"navcta\">\n        <a class=\"btn\" href=\"\/register#login\">Log in<\/a>\n        <a class=\"btn btn-solid\" href=\"\/list-your-venue\">List your venue<\/a>\n      <\/div>\n      <button class=\"navtoggle\" id=\"nav-toggle\" aria-label=\"Menu\">&#9776;<\/button>\n    <\/div>\n    <div class=\"mobile-menu\" id=\"mobile-menu\">\n      <a href=\"#categories\">Categories<\/a>\n      <a href=\"#venues\">Venues<\/a>\n      <a href=\"#owners\">For owners<\/a>\n      <a href=\"\/register\">Register<\/a>\n      <a href=\"\/register#login\">Log in<\/a>\n    <\/div>\n  <\/nav>\n\n  <section class=\"hero\">\n    <div class=\"wrap\">\n      <span class=\"eyebrow\">Morocco &rarr; MENA &middot; est. 2026<\/span>\n      <h1>Spaces with stories.<br><em>Events that belong nowhere else.<\/em><\/h1>\n      <p class=\"lead\">Riads, kasbahs, desert camps, beach clubs \u2014 Mahall connects Morocco&#8217;s most distinctive venues with the people planning weddings, retreats, and brand experiences.<\/p>\n\n      <div class=\"search\">\n        <input id=\"ai-search-input\" type=\"text\" placeholder=\"&quot;outdoor wedding for 120 near Marrakech&quot; \u2014 AI understands\">\n        <button id=\"ai-search-btn\">Search &#10148;<\/button>\n      <\/div>\n      <div class=\"search-hint\">AI-assisted search &middot; describes what you need in plain language<\/div>\n      <div class=\"search-panel\" id=\"search-panel\">\n        <div class=\"search-summary\" id=\"search-summary\"><\/div>\n        <div class=\"match-cards\" id=\"match-cards\"><\/div>\n      <\/div>\n\n      <div class=\"stats\">\n        <div class=\"stat\"><b id=\"stat-venues\">12+<\/b><span>VENUES LISTED<\/span><\/div>\n        <div class=\"stat\"><b>8<\/b><span>CATEGORIES<\/span><\/div>\n        <div class=\"stat\"><b>MENA<\/b><span>EXPANDING 2026<\/span><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <div class=\"stitch\" id=\"stitch-1\"><span class=\"star\"><span><\/span><span><\/span><\/span><span class=\"rule\"><\/span><span class=\"star\"><span><\/span><span><\/span><\/span><span class=\"rule\"><\/span><span class=\"star\"><span><\/span><span><\/span><\/span><\/div>\n\n  <section class=\"section reveal\" id=\"categories\">\n    <div class=\"wrap\">\n      <div class=\"section-head\">\n        <span class=\"eyebrow\">Browse by category<\/span>\n        <h2>Eight worlds, one ecosystem<\/h2>\n      <\/div>\n      <div class=\"cat-grid\" id=\"cat-grid\"><\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"section reveal\" id=\"venues\">\n    <div class=\"wrap\">\n      <div class=\"section-head\">\n        <span class=\"eyebrow\">Featured listings<\/span>\n        <h2>Where your next event could happen<\/h2>\n      <\/div>\n      <div class=\"filters\" id=\"filters\"><\/div>\n      <div class=\"venue-grid\" id=\"venue-grid\"><div class=\"venue-loading\">Loading venues&#8230;<\/div><\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"section reveal\" id=\"owners\">\n    <div class=\"wrap\">\n      <div class=\"cta-band\">\n        <h2>Own a space worth discovering?<\/h2>\n        <p>List your venue on Mahall and start receiving qualified inquiries from event planners, brands, and travellers across Morocco.<\/p>\n        <a class=\"btn btn-solid\" href=\"\/list-your-venue\">Register your venue &#10148;<\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <footer id=\"footer\">\n    <div class=\"wrap\">\n      <div class=\"foot-grid\">\n        <div>\n          <div class=\"logo\" style=\"margin-bottom:12px;\"><span class=\"star\"><span><\/span><span><\/span><\/span> Mahall<\/div>\n          <p style=\"max-width:240px; font-size:13px;\">Connecting Morocco&#8217;s most unique venues with event, hospitality, and experience buyers.<\/p>\n        <\/div>\n        <div><h4>Discover<\/h4><a href=\"#venues\">Browse venues<\/a><a href=\"#categories\">Categories<\/a><a href=\"#\">How it works<\/a><\/div>\n        <div><h4>For owners<\/h4><a href=\"\/list-your-venue\">List your venue<\/a><a href=\"#\">Pricing<\/a><a href=\"\/owner\/dashboard\">Dashboard<\/a><\/div>\n        <div><h4>Company<\/h4><a href=\"#\">About<\/a><a href=\"#\">Vision 2030<\/a><a href=\"#\">Contact<\/a><\/div>\n      <\/div>\n      <div class=\"foot-bottom\"><span>&copy; 2026 Mahall. Morocco &rarr; MENA.<\/span><span>mahall.org<\/span><\/div>\n    <\/div>\n  <\/footer>\n\n  <button class=\"ai-fab\" id=\"ai-fab\" aria-label=\"Open Mahall AI concierge\">&#10022;<\/button>\n  <div class=\"ai-panel\" id=\"ai-panel\">\n    <div class=\"ai-head\">\n      <div class=\"ai-head-left\"><span class=\"star\"><span><\/span><span><\/span><\/span><div><b>Mahall concierge<\/b><span id=\"ai-status-label\">Ask about venues, pricing, or booking<\/span><\/div><\/div>\n      <button class=\"ai-close\" id=\"ai-close\" aria-label=\"Close\">&times;<\/button>\n    <\/div>\n    <div class=\"ai-body\" id=\"ai-body\">\n      <div class=\"msg bot\">Marhaba! Tell me what you&#8217;re planning \u2014 I know every venue on Mahall and can find the right one for you.<\/div>\n    <\/div>\n    <div class=\"suggested-q\" id=\"suggested-q\">\n      <button class=\"sq\">Riad for 80 guests, Marrakech<\/button>\n      <button class=\"sq\">Beach venue, corporate dinner<\/button>\n      <button class=\"sq\">How does listing work?<\/button>\n    <\/div>\n    <div class=\"ai-input\">\n      <input id=\"ai-chat-input\" type=\"text\" placeholder=\"Type a message...\">\n      <button id=\"ai-chat-send\" aria-label=\"Send\">&#10148;<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n\n  var CATEGORIES = [\n    {code:'heritage',      name:'Heritage & cultural',        desc:'Riads, kasbahs, palaces', ic:'&#127963;'},\n    {code:'resort',        name:'Hospitality & resort',       desc:'Hotels, beach & golf resorts', ic:'&#127869;'},\n    {code:'private',       name:'Private & exclusive',        desc:'Villas, estates, gardens', ic:'&#127968;'},\n    {code:'nature',        name:'Nature & adventure',         desc:'Desert camps, eco lodges', ic:'&#9978;'},\n    {code:'coastal',       name:'Coastal & leisure',          desc:'Beach clubs, marinas', ic:'&#9973;'},\n    {code:'urban',         name:'Urban & lifestyle',          desc:'Rooftops, lounges, restaurants', ic:'&#127961;'},\n    {code:'corporate',     name:'Corporate & MICE',           desc:'Convention & exhibition halls', ic:'&#128202;'},\n    {code:'entertainment', name:'Entertainment & production', desc:'Studios, arenas, theaters', ic:'&#127909;'}\n  ];\n\n  \/* Fallback venue data (used if REST call fails) *\/\n  var FALLBACK_VENUES = [\n    {id:1,  name:'Riad Zahra',         city:'Marrakech',  category:'heritage',      price_from:4000, status:'live'},\n    {id:2,  name:'Dunes Camp Erg',      city:'Merzouga',   category:'nature',        price_from:6500, status:'live'},\n    {id:3,  name:'Atlas Beach Club',    city:'Essaouira',  category:'coastal',       price_from:3200, status:'live'},\n    {id:4,  name:'Villa Janoub',        city:'Tangier',    category:'private',       price_from:8000, status:'live'},\n    {id:5,  name:'Kasbah Ait Noir',     city:'Ouarzazate', category:'heritage',      price_from:5400, status:'live'},\n    {id:6,  name:'Skyline Rooftop',     city:'Casablanca', category:'urban',         price_from:2800, status:'live'},\n    {id:7,  name:'Palmeraie Resort',    city:'Marrakech',  category:'resort',        price_from:7200, status:'live'},\n    {id:8,  name:'Centre Atlantique',   city:'Rabat',      category:'corporate',     price_from:9500, status:'live'},\n    {id:9,  name:'Studio Lumi\u00e8re',      city:'Casablanca', category:'entertainment', price_from:3900, status:'live'},\n    {id:10, name:'Riad Bab El Oud',     city:'Fes',        category:'heritage',      price_from:3600, status:'live'},\n    {id:11, name:'Agafay Desert Lodge', city:'Marrakech',  category:'nature',        price_from:5800, status:'live'},\n    {id:12, name:'El Jadida Chateau',   city:'El Jadida',  category:'heritage',      price_from:4800, status:'live'}\n  ];\n\n  var allVenues = [];\n  var activeCat = 'all';\n  var chatHistory = []; \/* multi-turn concierge history *\/\n\n  \/* ---- venue catalogue: try REST, fall back ---- *\/\n  async function loadVenues(){\n    try{\n      var res = await fetch('\/wp-json\/mahall\/v1\/venues');\n      if(res.ok){ allVenues = await res.json(); }\n      else throw new Error();\n    }catch(e){ allVenues = FALLBACK_VENUES; }\n    document.getElementById('stat-venues').textContent = allVenues.length + '+';\n    renderVenues();\n  }\n\n  function getVenueSlug(name){ return name.toLowerCase().replace(\/[^a-z0-9]+\/g,'-').replace(\/(^-|-$)\/g,''); }\n\n  function renderVenues(){\n    var list = activeCat==='all' ? allVenues : allVenues.filter(function(v){ return v.category===activeCat; });\n    var grid = document.getElementById('venue-grid');\n    if(!list.length){\n      grid.innerHTML = '<p style=\"color:var(--ink-faint);grid-column:1\/-1\">No venues in this category yet \u2014 be the first to <a href=\"\/list-your-venue\" style=\"color:var(--gold-soft)\">register one<\/a>.<\/p>'; return;\n    }\n    grid.innerHTML = list.map(function(v){\n      return '<a class=\"venue-card\" href=\"\/venues\/'+getVenueSlug(v.name)+'\">'+\n        '<div class=\"venue-img\">'+(v.tag?'<span class=\"venue-tag\">'+v.tag+'<\/span>':'')+'<\/div>'+\n        '<div class=\"venue-body\"><h3>'+v.name+'<\/h3><p>'+v.city+'<\/p>'+\n        '<div class=\"venue-price\"><span>From<\/span><b>'+Number(v.price_from).toLocaleString()+' MAD<\/b><\/div><\/div>'+\n        '<\/a>';\n    }).join('');\n  }\n\n  \/* ---- categories ---- *\/\n  function renderCategories(){\n    document.getElementById('cat-grid').innerHTML = CATEGORIES.map(function(c){\n      return '<button class=\"cat-card\" data-cat=\"'+c.code+'\"><span class=\"ic\">'+c.ic+'<\/span><h3>'+c.name+'<\/h3><p>'+c.desc+'<\/p><\/button>';\n    }).join('');\n    document.getElementById('cat-grid').addEventListener('click', function(e){\n      var card = e.target.closest('.cat-card');\n      if(!card) return;\n      setActiveCategory(card.getAttribute('data-cat'));\n      document.getElementById('venues').scrollIntoView({behavior:'smooth'});\n    });\n  }\n\n  function renderFilters(){\n    var el = document.getElementById('filters');\n    var cats = [{code:'all',name:'All venues'}].concat(CATEGORIES);\n    el.innerHTML = cats.map(function(c){\n      return '<button class=\"filter-pill\" data-cat=\"'+c.code+'\">'+c.name+'<\/button>';\n    }).join('');\n    el.addEventListener('click', function(e){\n      var pill = e.target.closest('.filter-pill');\n      if(pill) setActiveCategory(pill.getAttribute('data-cat'));\n    });\n  }\n\n  function setActiveCategory(code){\n    activeCat = code;\n    document.querySelectorAll('.cat-card').forEach(function(c){ c.classList.toggle('active', c.getAttribute('data-cat')===code); });\n    document.querySelectorAll('.filter-pill').forEach(function(p){ p.classList.toggle('active', p.getAttribute('data-cat')===code); });\n    renderVenues();\n  }\n\n  \/* ---- AI search (v0.6: rich match cards) ---- *\/\n  async function runAiSearch(query){\n    if(!query.trim()) return;\n    var panel = document.getElementById('search-panel');\n    var summary = document.getElementById('search-summary');\n    var matchCards = document.getElementById('match-cards');\n    panel.classList.add('show');\n    summary.textContent = 'Searching...';\n    matchCards.innerHTML = '';\n\n    try{\n      var res = await fetch('\/wp-json\/mahall\/v1\/ai-search',{\n        method:'POST', headers:{'Content-Type':'application\/json'}, body:JSON.stringify({query:query})\n      });\n      if(!res.ok) throw new Error();\n      var data = await res.json();\n\n      \/* Apply category filter to grid *\/\n      if(data.filters && data.filters.category) setActiveCategory(data.filters.category);\n\n      summary.textContent = data.summary || ('Found ' + data.total + ' matching venues.');\n\n      \/* Render named match cards *\/\n      if(data.matches && data.matches.length){\n        var venueMap = {};\n        allVenues.forEach(function(v){ venueMap[v.id] = v; });\n        matchCards.innerHTML = data.matches.map(function(m,i){\n          var v = venueMap[m.id] || {};\n          return '<a class=\"match-card\" href=\"\/venues\/'+(v.name?getVenueSlug(v.name):'#')+'\">'+\n            '<span class=\"match-num\">'+(i+1)+'<\/span>'+\n            '<div class=\"match-info\"><b>'+(m.name||v.name||'Venue')+'<\/b>'+\n            '<span>'+(v.city||'Morocco')+'<\/span>'+\n            '<span class=\"match-reason\">'+(m.reason||'')+'<\/span><\/div>'+\n            '<span class=\"match-price\">'+(v.price_from?Number(v.price_from).toLocaleString()+' MAD':'')+'<\/span>'+\n            '<\/a>';\n        }).join('');\n      }\n    }catch(err){\n      \/* Local keyword fallback *\/\n      var t = query.toLowerCase();\n      var cat = CATEGORIES.find(function(c){ return t.indexOf(c.code)>-1 || t.indexOf(c.name.split(' ')[0].toLowerCase())>-1; });\n      if(cat) setActiveCategory(cat.code);\n      summary.textContent = 'Showing venues' + (cat?' for '+cat.name:'') + ' \u2014 connect the AI proxy for full smart matching.';\n    }\n    document.getElementById('venues').scrollIntoView({behavior:'smooth'});\n  }\n\n  document.getElementById('ai-search-btn').addEventListener('click', function(){ runAiSearch(document.getElementById('ai-search-input').value); });\n  document.getElementById('ai-search-input').addEventListener('keydown', function(e){ if(e.key==='Enter') runAiSearch(this.value); });\n\n  \/* ---- AI concierge (v0.6: multi-turn history) ---- *\/\n  function addMsg(text, role){\n    var body = document.getElementById('ai-body');\n    var div = document.createElement('div');\n    div.className = 'msg ' + (role==='me'?'me':'bot');\n    div.textContent = text;\n    body.appendChild(div);\n    body.scrollTop = body.scrollHeight;\n    return div;\n  }\n\n  var SCRIPTED = [\n    \"Riad Zahra in Marrakech is a great pick for intimate events up to 80 guests \u2014 rooftop terrace with Atlas views. Dunes Camp Erg in Merzouga is stunning for desert experiences. What's your approximate guest count?\",\n    \"Our Featured plan is 499 MAD\/month and includes priority placement, unlimited photos, video, and 3D tour support. Free listings are also available. You can register at \/list-your-venue.\",\n    \"Mahall covers eight categories from heritage riads to corporate MICE venues and entertainment studios. Is there a specific city or event type I can help you narrow down?\"\n  ];\n  var scriptIdx = 0;\n\n  async function sendConcierge(text){\n    document.getElementById('suggested-q').style.display = 'none';\n    addMsg(text, 'me');\n    chatHistory.push({role:'user', content:text});\n    var thinking = addMsg('...', 'bot thinking');\n\n    try{\n      var res = await fetch('\/wp-json\/mahall\/v1\/ai-concierge',{\n        method:'POST', headers:{'Content-Type':'application\/json'},\n        body:JSON.stringify({message:text, history:chatHistory.slice(-10)})\n      });\n      if(!res.ok) throw new Error();\n      var data = await res.json();\n      thinking.textContent = data.reply || '';\n      thinking.className = 'msg bot';\n      chatHistory.push({role:'assistant', content:data.reply});\n    }catch(e){\n      var reply = SCRIPTED[scriptIdx++ % SCRIPTED.length];\n      thinking.textContent = reply;\n      thinking.className = 'msg bot';\n      chatHistory.push({role:'assistant', content:reply});\n    }\n    document.getElementById('ai-body').scrollTop = 9999;\n  }\n\n  \/* fab + close *\/\n  document.getElementById('ai-fab').addEventListener('click', function(){ document.getElementById('ai-panel').classList.toggle('open'); });\n  document.getElementById('ai-close').addEventListener('click', function(){ document.getElementById('ai-panel').classList.remove('open'); });\n\n  \/* send *\/\n  function sendFromInput(){\n    var input = document.getElementById('ai-chat-input');\n    var v = input.value.trim(); if(!v) return;\n    sendConcierge(v); input.value='';\n  }\n  document.getElementById('ai-chat-send').addEventListener('click', sendFromInput);\n  document.getElementById('ai-chat-input').addEventListener('keydown', function(e){ if(e.key==='Enter') sendFromInput(); });\n\n  \/* suggested questions *\/\n  document.getElementById('suggested-q').addEventListener('click', function(e){\n    var sq = e.target.closest('.sq'); if(!sq) return;\n    document.getElementById('ai-chat-input').value = sq.textContent;\n    sendFromInput();\n  });\n\n  \/* mobile menu *\/\n  document.getElementById('nav-toggle').addEventListener('click', function(){ document.getElementById('mobile-menu').classList.toggle('open'); });\n\n  \/* reveal on scroll *\/\n  var io = new IntersectionObserver(function(entries){ entries.forEach(function(en){ if(en.isIntersecting) en.target.classList.add('in'); }); }, {threshold:.15});\n  document.querySelectorAll('#mahall .reveal, #mahall .stitch').forEach(function(t){ io.observe(t); });\n\n  \/* boot *\/\n  renderCategories();\n  renderFilters();\n  setActiveCategory('all');\n  loadVenues();\n\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Mahall Categories Venues For owners Register Log in List your venue &#9776; Categories Venues For owners Register Log in Morocco &rarr; MENA &middot; est. 2026 Spaces with stories.Events that belong nowhere else. Riads, kasbahs, desert camps, beach clubs \u2014 Mahall connects Morocco&#8217;s most distinctive venues with the people planning weddings, retreats, and brand experiences. Search [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"folder":[],"class_list":["post-18","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/pages\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/comments?post=18"}],"version-history":[{"count":3,"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/pages\/18\/revisions"}],"predecessor-version":[{"id":24,"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/pages\/18\/revisions\/24"}],"wp:attachment":[{"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/media?parent=18"}],"wp:term":[{"taxonomy":"folder","embeddable":true,"href":"https:\/\/mahall.org\/index.php\/wp-json\/wp\/v2\/folder?post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}