{"version":3,"file":"HubCTABlock.CSOk35om.mjs","names":["useDarkMode","useState","useReveal","useRef","isOnScreen","resolveCtaLabel","SMCO_CANONICAL_EVENT_CTA","SMCO_LEGACY_EVENT_CTAS","capitalizeWord","_Fragment","useState","useRef"],"sources":["https:/framerusercontent.com/modules/537ZFkQkAwY9MLf6iV1Z/3MZCvBGENNVjU7Z6RJCQ/CategoryGridSection.js","https:/framer.com/m/CategoryGridSection-agP4td.js","https:/framerusercontent.com/modules/WzSgHWN08RBkB28ngM4N/PQbfjm0GZWVdQwQN3qnO/HubCTABlock.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useRef,useState}from\"react\";/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerIntrinsicHeight 1800\n */// 2026-08-05 (Brent): \"Seasonal\" removed as a category. It carried no classes and had\n// no SEO/AEO purpose of its own — season becomes a FILTER on the main Experiences page\n// instead (the Season enum is already populated on all 59 CMS classes). Eight categories now.\n// Also fixed: the quiz CTA pointed at /quiz/, which does not exist in this project.\n// It now points at /design-your-event/, matching the nav.\n// 2026-08-17 (Brent): \"Lunch & Learn\" was withdrawn from this catalog that morning — the\n// category was to be rolled into Office-Ready — and REVERSED the same day: \"nevermind then.\n// lets add the Lunch and learn back in.\" The page was never deleted, so the restore was the\n// one-line change the withdrawal note promised: the slug came back OUT of\n// SMCO_UNLINKED_CATEGORY_SLUGS below. The card, its ItemList entry and the nav dropdown row\n// in Workshop/Navigation.tsx are all back, no redirect is needed, and the page stays live\n// and linked.\n//\n// 2026-08-17 (count reconciliation): that day's two rulings collided — \"there are EIGHT\n// categories, not nine\" was made BEFORE the Lunch & Learn merge was folded in, and while\n// the merge stood this grid rendered SEVEN cards and a seven-item ItemList. Rather than\n// replace one literal with the next literal — which is precisely how the copy got to\n// \"nine\", then \"eight\", then wrong again — the number stated in the subhead is DERIVED at\n// render time from the same filtered array that produces the cards and the ItemList. See\n// resolveCountCopy() and SMCO_CATEGORY_COUNT below. That derivation is what made the\n// reversal free: restoring the row took the rendered word from \"seven\" back to \"eight\" on\n// its own, with no copy edit anywhere. Copy, cards and structured data can no longer\n// disagree, and the next category added or pulled moves all three the same way.\n// 2026-08-06: ItemList JSON-LD added. Rendered as a JSX <script type=\"application/ld+json\">\n// inside the returned markup — never via useEffect / document.head, so the schema is present\n// in server-rendered HTML for GPTBot / ClaudeBot / PerplexityBot.\n// 2026-08-12: Phone pass. Three things were wrong on a 390px screen:\n//   1. CLIPPED CARDS. `revealMore` force-opens description + sample menus + CTA on\n//      mobile, but the card was still locked to aspectRatio 4/5 with overflow hidden\n//      — ~369px of content in a ~427px box, so the longer categories lost their top\n//      edge. See CategoryCard for the fix and why it needed two changes, not one.\n//   2. Both display sizes were pinned to their clamp FLOORS, never their vw terms\n//      (9vw = 35.1px at 390px, under the 40px floor; 3.6vw = 14px, way under 34px),\n//      so the phone rendered near-desktop type.\n//   3. useReveal ran a bare IntersectionObserver. Now fail-open, mirroring the\n//      hardened hook in OutcomeMetricStrip.\n// 2026-08-12 (TYPE SCALE): small-text readability pass. Same scale already applied to\n// Navigation and Footer, so the whole site reads as one system:\n//     under 11px → 13px · 11-12px → 13px · 12.5-13px → 14px\n//     14-15px → 16px · 16-17px → 17px\n// Nothing 18px and up is touched — card titles, the h1, the script CTA and the desktop\n// subhead all keep their sizes, because the point is lifting the BOTTOM of the scale\n// while preserving hierarchy, not inflating the whole page. Nothing is ever reduced:\n// the mobile subhead is already 17px, which is its own target, so it is left alone.\n// Uppercase tracked labels get their letter-spacing eased where the extra width would\n// otherwise buy a second line. Every changed site carries an inline note below.\nconst ORG_ID=\"https://smcoaz.com/#organization\";const SITE_ID=\"https://smcoaz.com/#website\";const SITE_ORIGIN=\"https://smcoaz.com\";function absoluteUrl(href){const raw=typeof href===\"string\"?href.trim():\"\";if(raw.length===0)return\"\";if(raw.charAt(0)===\"/\")return SITE_ORIGIN+raw;return raw;}function jsonLdText(data){return JSON.stringify(data).replace(/</g,\"\\\\u003c\");}function useDarkMode(){const[isDark,setIsDark]=useState(false);useEffect(()=>{if(typeof document===\"undefined\")return;const compute=()=>{try{setIsDark(document.documentElement.classList.contains(\"dark\"));}catch{setIsDark(false);}};compute();const handler=()=>compute();document.addEventListener(\"smco-theme-change\",handler);if(typeof window!==\"undefined\"){window.addEventListener(\"smco-theme-change\",handler);}const mo=new MutationObserver(handler);mo.observe(document.documentElement,{attributes:true,attributeFilter:[\"class\"]});return()=>{document.removeEventListener(\"smco-theme-change\",handler);if(typeof window!==\"undefined\"){window.removeEventListener(\"smco-theme-change\",handler);}mo.disconnect();};},[]);return isDark;}// FAIL-OPEN (2026-08-12): visible is the DEFAULT. Every exit path — static export,\n// canvas, reduced motion, missing IntersectionObserver, a constructor that throws,\n// a null ref, an observer that simply never fires — lands on the revealed card.\n// Copied from the hardened hook in OutcomeMetricStrip so the whole project behaves\n// the same way; the reveal is decoration layered on top of content that is already\n// there, never a gate in front of it.\nconst isStaticEnv=()=>typeof window===\"undefined\"||RenderTarget.current()===RenderTarget.canvas;const prefersReducedMotion=()=>typeof window!==\"undefined\"&&typeof window.matchMedia===\"function\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;// Mirrors THIS component's own observer options — the caller's threshold plus the\n// \"0px 0px -10% 0px\" rootMargin, which pulls the root's bottom edge up by 10% of the\n// viewport — so the guard reveals at the same moment a working observer would rather\n// than guessing. Anything unmeasurable reveals.\nconst isOnScreen=(node,threshold)=>{if(typeof node.getBoundingClientRect!==\"function\")return true;const rect=node.getBoundingClientRect();const vh=window.innerHeight||document.documentElement.clientHeight||0;if(rect.height<=0||vh<=0)return true;const bottomEdge=vh-vh*.1;const visible=Math.min(rect.bottom,bottomEdge)-Math.max(rect.top,0);return visible>0&&visible/rect.height>=threshold;};function useReveal(threshold=.18){const ref=useRef(null);const[shown,setShown]=useState(()=>isStaticEnv()||prefersReducedMotion());useEffect(()=>{if(shown)return;const node=ref.current;// Fail open: no node, or no observer API → show it now.\nif(!node||typeof IntersectionObserver===\"undefined\"){setShown(true);return;}let obs=null;try{obs=new IntersectionObserver(entries=>{entries.forEach(e=>{if(e.isIntersecting)setShown(true);});},{threshold,rootMargin:\"0px 0px -10% 0px\"});obs.observe(node);}catch{setShown(true);return;}// Guard: a silent observer must never leave a card invisible. Poll the rect\n// at this component's own threshold + rootMargin, and force-reveal outright\n// once the deadline passes even if the rect can't be trusted. Setting `shown`\n// restores BOTH properties the reveal animates — opacity and transform.\nconst deadline=Date.now()+2e4;const guard=window.setInterval(()=>{if(isOnScreen(node,threshold)||Date.now()>deadline){setShown(true);}},400);return()=>{if(obs)obs.disconnect();window.clearInterval(guard);};},[shown,threshold]);return[ref,shown];}// 2026-08-17: CATALOG DATA CORRECTION. Three defects were live on /experiences/:\n// every card printed this Array control's own defaults (\"What this category is, and\n// who it's for.\", \"Menu A · Menu B · Menu C\", \"Best for · Team-building\",\n// \"From $140 / kit\"); every card linked back to /experiences/, because `href` is a\n// ControlType.Link with no defaultValue and fell through to the fallback below; and a\n// ninth \"Seasonal\" row was still rendering, twelve days after the 2026-08-05 decision\n// at the top of this file retired that category.\n//\n// ROOT CAUSE. The /experiences/ instance (page VXHIzo45b, node S1TJSb1XP) carries its\n// OWN nine-row `categories` array, and an instance prop always beats a code default —\n// so editing DEFAULT_CATEGORIES alone would never have reached production. Array and\n// Object props are invisible to, and unwritable through, the XML API, so the correction\n// is applied at render time by resolveCategories() below, on the same pattern as the\n// copyright shim in Footer.tsx. See the TEMPORARY note there.\n//\n// PRICES AND MENU NAMES are read from the Experiences CMS (collection ELEZNJ4hz, 59\n// published classes), which is what each category page's own grid renders — NOT from\n// the category hero data points. Seven of the eight heroes quote a flat \"$150 Per Kit,\n// All Inclusive\", and five of those are above the top price on their own menu. Every\n// price below is the LOWEST published class in that category, so \"From $X\" is exactly\n// what a click proves. Reported to Brent separately; do not sync these to the heroes\n// until he rules on which number is right.\n// Every /experiences/<slug>/ page below was verified present in the project on\n// 2026-08-17. An href is only ever built from a slug on this list, so a card whose\n// title does not resolve to a real page yields \"\" and is dropped rather than quietly\n// shipping a link to a 404 — which is the failure mode that left \"Seasonal\" dead.\nconst KNOWN_CATEGORY_SLUGS=[\"charcuterie\",\"fresh-and-light\",\"global-flavors\",\"holidays-and-celebrations\",\"lunch-and-learn\",\"office-ready\",\"small-plates-and-starters\",\"sweet-celebrations\"];// ── WITHDRAWN-ROW FILTER ─────────────────────────────────\n// REVERSED 2026-08-17 (Brent): \"nevermind then. lets add the Lunch and learn back\n// in.\" The roll-up into Office-Ready is off, so \"lunch-and-learn\" comes OUT of this\n// list — which restores the card, its ItemList entry and the derived count in one\n// edit, exactly the one-line restore the withdrawal note promised. The list is now\n// EMPTY, so this filter drops nothing today, and no redirect is needed: the page\n// never stopped being live and is linked again from here and from the nav.\n//\n// KEPT, EMPTY, rather than deleted. It is the single hook for withdrawing a category\n// from BROWSE without deleting its page — deleting a page turns every inbound link\n// and every indexed URL into a 404, which is the failure this mechanism exists to\n// avoid. resolveCategories() below runs over BOTH an instance-supplied categories\n// array and the code default, so one entry here covers every render path; Array props\n// are invisible to and unwritable through the MCP, so deleting a row from\n// DEFAULT_CATEGORIES alone would reach nothing.\n//\n// It is also deliberately NOT done by removing a slug from KNOWN_CATEGORY_SLUGS\n// above. That list means \"this page exists\" and is what stops a card ever linking to\n// a 404; weakening that meaning to carry a second, different idea would make the next\n// dead-link bug harder to see.\n//\n// numberOfItems and itemListElement both derive from the same filtered array, so the\n// ItemList tracks the grid automatically and the two can never disagree.\nconst SMCO_UNLINKED_CATEGORY_SLUGS=[];// ── TEMPORARY MIGRATION SHIM (2026-08-17) ─────────────────────────────────\n// RULING (Brent): every CTA that invites someone to START AN EVENT reads \"Build My\n// Event\" — \"we want it to be not a booking thing, but they're building something\n// creative and something cool.\" The quiz button's defaultValue below is corrected\n// too, but a default reaches nothing that already exists: Framer copies defaultProps\n// onto each canvas instance at insert time and the instance wins forever after. The\n// /experiences/ instance carries \"Design Your Event →\" (currently with showQuiz off,\n// so it is not painted today — but it would be the moment anyone switches the quiz\n// on, which is exactly the kind of latent drift this pass exists to remove).\n//\n// DELIBERATELY NARROW: four whole-string legacy phrases, plus the canonical phrase\n// itself, and nothing else. Descriptive labels and any genuine custom string pass\n// through untouched, and it fails open on a blank or non-string value.\n//\n// ARROW DROPPED (2026-08-17, second pass — Brent: \"We can drop the arrow for the\n// Build my Event.\"). The trailing arrow used to be handed straight back on the way\n// out. It is now DISCARDED, so this button paints exactly \"Build My Event\" — no\n// trailing arrow, no trailing space. Scoped to THIS ONE LABEL: every other arrow on\n// the site keeps its own, because nothing else goes through this function. The\n// canonical phrase is on the match list for exactly this reason — an instance\n// already reading \"Build My Event →\" has to lose its arrow like everything else.\n//\n// PURE RENDER-TIME DERIVATION — no state, no effect. Same shape as the copyright shim\n// in Footer.tsx and resolveCategories() below.\n//\n// TEMPORARY. Delete both shims once the canvas instances carry the corrected values.\nconst SMCO_CANONICAL_EVENT_CTA=\"Build My Event\";const SMCO_LEGACY_EVENT_CTAS=[\"book your event\",\"build your event\",\"design your event\",\"start booking\"];function resolveCtaLabel(label){if(typeof label!==\"string\")return label;const trimmed=label.trim();if(trimmed.length===0)return label;// Split a single trailing arrow off so a phrase typed WITH one still matches.\n// 2026-08-17 (second pass): what comes off is DISCARDED, not re-attached.\nconst match=/^(.*?)(\\s*→)$/.exec(trimmed);const core=(match?match[1]:trimmed).trim().toLowerCase();if(core!==SMCO_CANONICAL_EVENT_CTA.toLowerCase()&&SMCO_LEGACY_EVENT_CTAS.indexOf(core)<0)return label;return SMCO_CANONICAL_EVENT_CTA;}function categorySlug(title){if(typeof title!==\"string\")return\"\";return title.trim().toLowerCase().replace(/&/g,\" and \").replace(/[^a-z0-9]+/g,\"-\").replace(/^-+/,\"\").replace(/-+$/,\"\");}// Slug-derived, allow-listed. One place owns the URL shape, so a ninth card cannot\n// become a dead link by being typed slightly differently from its page.\nfunction categoryHref(title){const slug=categorySlug(title);if(slug.length===0)return\"\";if(KNOWN_CATEGORY_SLUGS.indexOf(slug)<0)return\"\";return\"/experiences/\"+slug+\"/\";}const DEFAULT_CATEGORIES=[{title:\"Global Flavors\",tagline:\"Cuisines explored together. Coast to coast.\",bestFor:\"Culture celebrations\",description:\"Regional dishes taught by the chefs who know them — technique, origin, and why it tastes that way. Somewhere new, without leaving the kitchen.\",sampleMenus:\"Authentic Pad Thai \\xb7 Chicken Tikka Masala \\xb7 Tuscan Rigatoni\",priceFrom:\"From $118 / kit\",href:categoryHref(\"Global Flavors\"),gradient:\"linear-gradient(160deg, #6b8e6c 0%, #2d3f2f 100%)\"},{title:\"Charcuterie\",tagline:\"Premium boards. Built to share.\",bestFor:\"Client appreciation\",description:\"Premium cured meats and aged cheeses, built board by board with your chef. No stovetop, no cleanup — just a room that keeps talking.\",sampleMenus:\"Artisan Charcuterie Board \\xb7 Harvest Charcuterie Board \\xb7 Holiday Charcuterie Board\",priceFrom:\"From $160 / kit\",href:categoryHref(\"Charcuterie\"),gradient:\"linear-gradient(160deg, #c9a47e 0%, #5b3f2a 100%)\"},{// NO PRICE, NO SAMPLE MENUS ON PURPOSE (2026-08-17). Zero of the 59 published\n// CMS classes reference Office-Ready, so this category page renders an EMPTY\n// menu grid and there is no lowest price to quote and no real menu name to\n// print. The hero says \"$150 Per Kit, All Inclusive\" but nothing on the page\n// backs it. Rather than invent either, the card omits both — the price pill\n// and the sample-menus block are each guarded on a non-empty value in\n// CategoryCard. Fill these in the moment classes are tagged Office-Ready.\ntitle:\"Office-Ready\",tagline:\"In-person events. Made simple.\",bestFor:\"Hybrid teams\",description:\"Built for the conference room and the desk. Every kit ships with a no-mess set, so the event runs in the office, at home, or both — with nothing to wash.\",sampleMenus:\"\",priceFrom:\"\",href:categoryHref(\"Office-Ready\"),gradient:\"linear-gradient(160deg, #d4865b 0%, #6b3018 100%)\"},{// ONE published class in this category (Knife Skills, $145), so \"Sample\n// experiences\" honestly lists one. 2026-08-17.\n// RESTORED TO BROWSE 2026-08-17 (Brent): \"nevermind then. lets add the Lunch\n// and learn back in.\" This row was never deleted, only filtered — see\n// SMCO_UNLINKED_CATEGORY_SLUGS above — which is exactly why putting the\n// category back was one line. The card, its ItemList entry and the derived\n// count all came back with it, with no copy edit anywhere.\ntitle:\"Lunch & Learn\",tagline:\"Real connection. Workday-friendly.\",bestFor:\"Quick workday events\",description:\"A chef-led session that fits inside a lunch block. Everyone cooks something good, eats it warm, and is back at their desk on time.\",sampleMenus:\"Knife Skills\",priceFrom:\"From $145 / kit\",href:categoryHref(\"Lunch & Learn\"),gradient:\"linear-gradient(160deg, #b5826f 0%, #4a2c22 100%)\"},{title:\"Fresh & Light\",tagline:\"Bright and healthy. Crowd-loved.\",bestFor:\"All-team wellness\",description:\"Menus built around vegetables, grains, and citrus instead of heaviness. Everyone finishes full, with the rest of the afternoon still intact.\",sampleMenus:\"Blackened Salmon \\xb7 Sheet Pan Chicken Shawarma \\xb7 Coconut Crusted Mahi Mahi\",priceFrom:\"From $125 / kit\",href:categoryHref(\"Fresh & Light\"),gradient:\"linear-gradient(160deg, #a3c08d 0%, #455a3c 100%)\"},{title:\"Holidays & Celebrations\",tagline:\"Seasonal flavors. Festive moments.\",bestFor:\"Year-end parties\",description:\"Festive boards, seasonal menus, and a guided toast — built for the year-end party where half the team is remote.\",sampleMenus:\"Hot Cocoa Flight Board \\xb7 Hand-Dipped Caramel Apples \\xb7 Savory Holiday Tree-Shaped Pastry\",priceFrom:\"From $118 / kit\",href:categoryHref(\"Holidays & Celebrations\"),gradient:\"linear-gradient(160deg, #c95a4a 0%, #5b1f18 100%)\"},{title:\"Sweet Celebrations\",tagline:\"Sweet moments. Made together.\",bestFor:\"Milestones & wins\",description:\"Truffles rolled by hand, chocolate tempered on camera, pastry that behaves. Nobody has to be a baker, and everyone leaves with something they made.\",sampleMenus:\"Salted Caramel Truffle Pie \\xb7 Chocolate Tasting Boards \\xb7 Pizookie Flight\",priceFrom:\"From $118 / kit\",href:categoryHref(\"Sweet Celebrations\"),gradient:\"linear-gradient(160deg, #e2a87e 0%, #8a3f28 100%)\"},{title:\"Small Plates & Starters\",tagline:\"Bites that bring people in.\",bestFor:\"Mixers & happy hours\",description:\"Three to five small plates instead of one big one — more cooking, more tasting, and a finished dish in front of everyone every few minutes.\",sampleMenus:\"Small Bite + Cocktail Experience \\xb7 Dip Trio + Margs \\xb7 Soft Pretzel Bites + Dip Duo\",priceFrom:\"From $125 / kit\",href:categoryHref(\"Small Plates & Starters\"),gradient:\"linear-gradient(160deg, #b09472 0%, #4a3624 100%)\"}];// The canonical row for a title, keyed by the same slug that builds its href, so a\n// category's link, copy and price can never drift apart.\nconst CANONICAL_BY_SLUG=DEFAULT_CATEGORIES.reduce((acc,c)=>{acc[categorySlug(c.title)]=c;return acc;},{});// ── TEMPORARY MIGRATION SHIM (2026-08-17) ─────────────────────────────\n// Same shape, and the same reasoning, as the copyright shim in Footer.tsx.\n// The /experiences/ instance carries a nine-row `categories` array whose\n// description / sampleMenus / bestFor / priceFrom were never filled in — so each\n// one falls through to the Array control's own defaultValue — and whose `href`\n// was never set, so every card fell through to the \"/experiences/\" fallback and\n// linked to the page it was already on. Array and Object props cannot be written\n// through the MCP, so this is the only route to production until someone re-binds\n// that array in the Framer editor.\n//\n// Deliberately narrow: a field is rewritten ONLY when it still holds exactly the\n// control default (or is blank) AND the row's title resolves to a real category\n// page. Anything an author genuinely typed passes straight through untouched, and\n// no field is ever blanked that was not already blank in the canonical row.\n//\n// `href` is the one value overridden unconditionally for a known category, because\n// every live href is currently wrong and a card that links to the page it is on is\n// never what an author meant.\n//\n// This is a pure derivation computed during render — no state, no effect — so the\n// statically rendered page cannot flash placeholder copy on first paint.\n//\n// TEMPORARY. Once the canvas instance carries the real array, delete this block and\n// go back to using the array directly: a silent rewrite inside a render is a trap\n// for whoever reads this next.\nconst LEGACY_BEST_FOR=\"Team-building\";const LEGACY_DESCRIPTION=\"What this category is, and who it's for.\";const LEGACY_SAMPLE_MENUS=\"Menu A \\xb7 Menu B \\xb7 Menu C\";const LEGACY_PRICE_FROM=\"From $140 / kit\";const isBlankOrLegacy=(value,legacy)=>{if(typeof value!==\"string\")return true;const trimmed=value.trim();return trimmed.length===0||trimmed===legacy;};function resolveCategories(input){const resolved=[];if(!input||input.length===0)return resolved;for(let i=0;i<input.length;i++){const raw=input[i];if(!raw)continue;const slug=categorySlug(raw.title);// WITHDRAWN-ROW FILTER — see SMCO_UNLINKED_CATEGORY_SLUGS above. That list is\n// EMPTY as of 2026-08-17 (Lunch & Learn restored), so this drops nothing today.\n// It stays as the one-line hook for pulling a category out of browse without\n// deleting its page.\nif(SMCO_UNLINKED_CATEGORY_SLUGS.indexOf(slug)>=0)continue;const canon=CANONICAL_BY_SLUG[slug];const rawHref=typeof raw.href===\"string\"?raw.href.trim():\"\";const href=canon?canon.href:rawHref;// A card with nowhere to go is worse than no card at all: it reads as a real\n// destination and spends a click to prove otherwise. The retired \"Seasonal\"\n// row — no page, no CMS category, no classes — lands here and is dropped,\n// which also makes the instance's \"Eight curated categories.\" subhead true\n// again. If Brent wants Seasonal back, it needs a page before it needs a card.\nif(href.length===0)continue;resolved.push({...raw,href,bestFor:canon&&isBlankOrLegacy(raw.bestFor,LEGACY_BEST_FOR)?canon.bestFor:raw.bestFor,description:canon&&isBlankOrLegacy(raw.description,LEGACY_DESCRIPTION)?canon.description:raw.description,sampleMenus:canon&&isBlankOrLegacy(raw.sampleMenus,LEGACY_SAMPLE_MENUS)?canon.sampleMenus:raw.sampleMenus,priceFrom:canon&&isBlankOrLegacy(raw.priceFrom,LEGACY_PRICE_FROM)?canon.priceFrom:raw.priceFrom});}return resolved;}// ── DERIVED CATEGORY COUNT (2026-08-17) ───────────────────────────────────\n// The catalog size is stated in prose in several places on this site, and every one of\n// them was a hand-typed literal that drifted the moment a category moved. It is now\n// computed. Emitted as an ENGLISH WORD, not a digit, to match the existing copy voice\n// (\"Eight curated categories.\").\nconst SMCO_COUNT_WORDS=[\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"ten\",\"eleven\",\"twelve\"];// Above twelve this falls back to digits rather than inventing compound words. A catalog\n// that large is a different design problem, and a right number reads better than a wrong\n// word. Returns \"\" for anything that is not a usable count, so callers can fail open.\nfunction countWord(n){if(typeof n!==\"number\"||!isFinite(n)||n<0)return\"\";const i=Math.floor(n);return i<SMCO_COUNT_WORDS.length?SMCO_COUNT_WORDS[i]:String(i);}function capitalizeWord(word){if(typeof word!==\"string\"||word.length===0)return word;return word.charAt(0).toUpperCase()+word.slice(1);}// ── TEMPORARY MIGRATION SHIM (2026-08-17) ─────────────────────────────────\n// The subhead is an INSTANCE-supplied string — page VXHIzo45b, node S1TJSb1XP reads\n// \"Eight curated categories. …\" — and Framer copies defaultProps onto an instance at\n// insert time, so editing the defaultValue below reaches nothing that already exists.\n// String props on a linked code-component instance also cannot be written through the\n// MCP XML API. Same shape, and the same reasoning, as resolveCategories() above and the\n// copyright shim in Footer.tsx.\n//\n// DELIBERATELY NARROW: a number — word or digits — is rewritten ONLY where it stands\n// immediately before \"categories\" or \"curated categories\". Every other number in the\n// sentence, and every other word, is returned exactly as the author typed it. The\n// author's capitalisation is carried across, so a sentence-initial \"Eight\" stays\n// sentence-initial and a mid-sentence \"eight\" stays lowercase. Digits never acquire a\n// capital, because a digit has no case to preserve.\n//\n// FAILS OPEN, like everything else in this file: an unusable count, or a non-string,\n// returns the copy untouched.\n//\n// PURE RENDER-TIME DERIVATION — no state, no effect. Framer static-renders this section,\n// and a falsy-seeded state corrected in an effect is a known first-paint bug on this\n// project.\n//\n// TEMPORARY only in the sense that the SHIM goes away once the canvas instance carries a\n// string that is already correct. The derivation itself is the fix and stays.\nconst SMCO_COUNT_PHRASE_SOURCE=\"\\\\b(zero|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|\\\\d+)(\\\\s+(?:curated\\\\s+)?categories)\\\\b\";function resolveCountCopy(copy,count){if(typeof copy!==\"string\"||copy.length===0)return copy;// A zero count is unusable here, not a fact: this sentence exists to state catalog size,\n// and \"Zero curated categories.\" is always a defect rather than a true statement. Fail\n// open to the author's copy, exactly as an unusable count does below.\nif(!(count>0))return copy;const word=countWord(count);if(word.length===0)return copy;// Built per call rather than shared at module scope: a global RegExp carries\n// lastIndex state, and one shared across renders is a bug waiting to be found.\nconst re=new RegExp(SMCO_COUNT_PHRASE_SOURCE,\"gi\");return copy.replace(re,(_match,num,tail)=>{const first=num.charAt(0);const isLetter=first.toLowerCase()!==first.toUpperCase();const isUpper=isLetter&&num===num.toUpperCase();const isCapitalised=isLetter&&!isUpper&&first===first.toUpperCase();const replacement=isUpper?word.toUpperCase():isCapitalised?capitalizeWord(word):word;return replacement+tail;});}// ── SINGLE SOURCE OF TRUTH FOR THE CATALOG SIZE (2026-08-17) ──────────────\n// Exported for components that STATE the category count but do not RENDER the catalog and\n// therefore cannot count anything locally — today that is Library/Conversion/HubCTABlock\n// .tsx, whose \"Browse all N categories…\" column ships on roughly seven pages. It is the\n// canonical list run through the same withdrawal filter the grid runs, so pulling a\n// category updates the cards, the ItemList, this subhead and every hub CTA in one edit.\n//\n// The grid itself deliberately does NOT read this: it derives from its own rendered array,\n// which is stricter still because it also honours an instance-supplied `categories`\n// override. This constant is the answer for callers with no array to count.\nexport const SMCO_CATEGORY_COUNT=resolveCategories(DEFAULT_CATEGORIES).length;export const SMCO_CATEGORY_COUNT_WORD=countWord(SMCO_CATEGORY_COUNT);// The panel default is built from the derived word so a NEWLY inserted instance starts\n// correct. Existing instances carry their own copy and are corrected by resolveCountCopy()\n// at render time. Degrades to a countless sentence rather than a wrong number if the count\n// is ever unusable.\nconst SMCO_DEFAULT_SUBHEAD=SMCO_CATEGORY_COUNT_WORD.length>0?capitalizeWord(SMCO_CATEGORY_COUNT_WORD)+\" curated categories. Each chef-led, each shaped for your team, your event, your timeline.\":\"Curated categories. Each chef-led, each shaped for your team, your event, your timeline.\";function CategoryCard({category,isDark,isMobile,delay}){const[ref,shown]=useReveal(.18);const[hovered,setHovered]=useState(false);const[imgFailed,setImgFailed]=useState(false);// BACK-NAV REPAIR (2026-08-25): abort-triggered onError strands the tile after a bfcache restore — reset on persisted pageshow.\nuseEffect(()=>{if(typeof window===\"undefined\")return;const onPageShow=e=>{if(e&&e.persisted)setImgFailed(false);};window.addEventListener(\"pageshow\",onPageShow);return()=>window.removeEventListener(\"pageshow\",onPageShow);},[]);const showImg=category.photo&&!imgFailed;const ease=\"cubic-bezier(0.16, 1, 0.3, 1)\";const revealMore=isMobile?true:hovered;// CLIPPED-CARD DEFECT (2026-08-12): on a phone `revealMore` is permanently true —\n// correct, since a touch device never hovers — but the card was still locked to\n// aspectRatio 4/5 with overflow hidden, so the expanded copy (~369px) overflowed\n// the ~427px box and the longer categories were cut off at the TOP. Dropping the\n// ratio alone is not enough and would have made it worse: every child of this card\n// is absolutely positioned, so with no ratio the card has nothing in flow and\n// collapses to zero height. So the phone gets both halves of the fix — the card\n// sizes to its content instead of to a ratio, and the overlay text block below\n// rejoins the flow to give it that content. The photo keeps a reserved area via\n// percentage top padding (proportional, so it holds its shape at any phone width),\n// and the image itself still covers the full card via inset:0.\n// Desktop keeps the ratio and the absolute overlay exactly as they were.\n// 2026-08-12 (type scale): this is also why the type lift below is safe on mobile —\n// a label that now runs to two lines makes the card taller instead of clipping.\nconst contentBlockStyle=isMobile?{position:\"relative\",padding:\"0 24px 28px\",display:\"flex\",flexDirection:\"column\"}:{position:\"absolute\",left:28,right:28,bottom:28,display:\"flex\",flexDirection:\"column\"};return /*#__PURE__*/_jsxs(\"a\",{ref:ref,// DEAD-LINK DEFECT CLASS: the Categories array control declares `href` as a\n// ControlType.Link with no defaultValue, so any row added after the seeded eight\n// resolves to \"\" and this whole full-size card renders clickable but dead.\n// 2026-08-17: resolveCategories now derives the href from the title and\n// drops any row it cannot place, so this fallback is a backstop rather\n// than the live path it had quietly become. Left in deliberately.\nhref:category.href||\"/experiences/\",onMouseEnter:()=>setHovered(true),onMouseLeave:()=>setHovered(false),style:{position:\"relative\",display:\"block\",width:\"100%\",aspectRatio:isMobile?\"auto\":\"4 / 5\",paddingTop:isMobile?\"68%\":undefined,boxSizing:\"border-box\",borderRadius:24,overflow:\"hidden\",background:category.gradient,textDecoration:\"none\",color:\"#FFFFFF\",boxShadow:isDark?\"0 30px 80px rgba(0,0,0,0.5)\":\"0 30px 80px rgba(43,75,58,0.18)\",opacity:shown?1:0,transform:shown?hovered?\"translateY(-6px)\":\"translateY(0)\":\"translateY(24px)\",transition:`opacity 0.8s ${ease} ${delay}ms, transform 0.5s ${ease}, box-shadow 0.4s ${ease}`,cursor:\"pointer\",willChange:\"transform\"},children:[showImg&&/*#__PURE__*/_jsx(\"img\",{src:category.photo,alt:\"\",loading:\"lazy\",onError:()=>setImgFailed(true),style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",display:\"block\",transform:hovered?\"scale(1.04)\":\"scale(1)\",transition:`transform 0.7s ${ease}`}}),/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",left:0,right:0,bottom:0,height:revealMore?\"86%\":\"60%\",background:revealMore?\"linear-gradient(180deg, transparent 0%, rgba(14,14,14,0.82) 100%)\":\"linear-gradient(180deg, transparent 0%, rgba(14,14,14,0.58) 100%)\",pointerEvents:\"none\",transition:`height 0.5s ${ease}, background 0.5s ${ease}`}}),category.priceFrom&&category.priceFrom.trim().length>0&&/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",top:20,left:20,padding:\"7px 14px\",borderRadius:999,background:\"rgba(255,255,255,0.18)\",backdropFilter:\"blur(10px)\",WebkitBackdropFilter:\"blur(10px)\",border:\"1px solid rgba(255,255,255,0.22)\",fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 11 → 13, the badge/chrome band. Tracking\n// stays at 0.16em — it is already inside the eased range, and the\n// pill is whiteSpace:nowrap, ~166px wide at 13px, so it still clears\n// the arrow chip at the far corner of a 342px phone card.\nfontSize:13,fontWeight:700,letterSpacing:\"0.16em\",textTransform:\"uppercase\",color:\"#FFFFFF\",whiteSpace:\"nowrap\"},children:category.priceFrom}),/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",top:20,right:20,width:38,height:38,borderRadius:999,background:\"rgba(255,255,255,0.18)\",backdropFilter:\"blur(10px)\",WebkitBackdropFilter:\"blur(10px)\",border:\"1px solid rgba(255,255,255,0.22)\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",opacity:revealMore?1:0,transform:revealMore?\"translate(0, 0) scale(1)\":\"translate(-4px, 4px) scale(0.85)\",transition:`opacity 0.4s ${ease}, transform 0.4s ${ease}`},children:/*#__PURE__*/_jsxs(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"#FFFFFF\",strokeWidth:\"2.4\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[/*#__PURE__*/_jsx(\"line\",{x1:\"7\",y1:\"17\",x2:\"17\",y2:\"7\"}),/*#__PURE__*/_jsx(\"polyline\",{points:\"9 7 17 7 17 15\"})]})}),/*#__PURE__*/_jsxs(\"div\",{style:contentBlockStyle,children:[category.bestFor&&category.bestFor.trim().length>0&&/*#__PURE__*/_jsxs(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 10.5 → 13, the sub-11px band, and\n// the smallest text anywhere in this component. Tracking eased\n// 0.18em → 0.16em so the 24% size jump does not immediately buy\n// a second line. The three longest values still measure right at\n// the 294px text column of a 390px phone, so they may wrap — the\n// mobile card sizes to content now, so a second line grows the\n// card rather than clipping it.\nfontSize:13,fontWeight:700,letterSpacing:\"0.16em\",textTransform:\"uppercase\",color:\"rgba(170, 197, 152, 0.96)\",marginBottom:9,textShadow:\"0 1px 8px rgba(0,0,0,0.45)\"},children:[\"Best for \\xb7 \",category.bestFor]}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 18px and up: out of scope, untouched on both branches.\nfontSize:isMobile?21:\"clamp(22px, 2vw, 28px)\",fontWeight:700,letterSpacing:\"-0.01em\",lineHeight:1.15,color:\"#FFFFFF\",textShadow:\"0 2px 14px rgba(0,0,0,0.35)\",marginBottom:8},children:category.title}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 14.5 → 16, the card-body band. This is\n// the top of the small-text stack inside the card and stays above\n// the description below it.\nfontSize:16,fontWeight:400,lineHeight:1.5,color:\"rgba(255,255,255,0.92)\",maxWidth:\"92%\"},children:category.tagline}),/*#__PURE__*/_jsx(\"div\",{style:{display:\"grid\",gridTemplateRows:revealMore?\"1fr\":\"0fr\",transition:`grid-template-rows 0.5s ${ease}`},children:/*#__PURE__*/_jsx(\"div\",{style:{overflow:\"hidden\",opacity:revealMore?1:0,transform:revealMore?\"translateY(0)\":\"translateY(8px)\",transition:`opacity 0.4s ${ease} ${revealMore?\"0.1s\":\"0s\"}, transform 0.4s ${ease} ${revealMore?\"0.1s\":\"0s\"}`},children:/*#__PURE__*/_jsxs(\"div\",{style:{paddingTop:14,marginTop:4},children:[category.description&&category.description.trim().length>0&&/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 13.5 → 14. HIERARCHY CALL:\n// 13.5 falls in the gap between the 12.5-13 band (→14)\n// and the 14-15 band (→16). Taken as 14 rather than 16\n// so it stays a clear step under the 16px tagline above\n// instead of flattening against it, and so this file\n// only ever emits the shared 13/14/16/17 scale values.\nfontSize:14,fontWeight:400,lineHeight:1.55,color:\"rgba(255,255,255,0.9)\",marginBottom:14},children:category.description}),category.sampleMenus&&category.sampleMenus.trim().length>0&&/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{style:{height:1,width:32,background:\"rgba(156, 175, 136, 0.62)\",marginBottom:10}}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 11 → 13. The band mapping\n// keeps this label exactly one step under the 14px menu\n// line it introduces, so the label/content pair is not\n// flattened. Tracking already at the eased 0.16em, and\n// \"SAMPLE EXPERIENCES\" measures ~177px in a 294px column.\nfontSize:13,fontWeight:600,letterSpacing:\"0.16em\",textTransform:\"uppercase\",color:\"rgba(156, 175, 136, 0.92)\",marginBottom:6},children:\"Sample experiences\"}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 12.5 → 14, the caption/meta\n// band. Sentence case and free to wrap, so no tracking\n// change is needed.\nfontSize:14,fontWeight:500,letterSpacing:\"0.01em\",color:\"rgba(255,255,255,0.82)\",lineHeight:1.55,marginBottom:12},children:category.sampleMenus})]}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"inline-flex\",alignItems:\"center\",gap:7,fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 12.5 → 14, the link row.\n// Not uppercase and only 0.04em tracked, so it keeps\n// its letter-spacing.\nfontSize:14,fontWeight:700,letterSpacing:\"0.04em\",color:\"#FFFFFF\"},children:[\"View all \",category.title,/*#__PURE__*/_jsxs(\"svg\",{width:\"13\",height:\"13\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"#FFFFFF\",strokeWidth:\"2.4\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[/*#__PURE__*/_jsx(\"line\",{x1:\"5\",y1:\"12\",x2:\"19\",y2:\"12\"}),/*#__PURE__*/_jsx(\"polyline\",{points:\"12 5 19 12 12 19\"})]})]})]})})})]})]});}function QuizCta({question,buttonLabel,buttonLink,isDark,isMobile}){const[ref,shown]=useReveal(.4);const[hovered,setHovered]=useState(false);const accent=\"#9CAF88\";const surface=isDark?\"#0F1F18\":\"#FAF8F3\";const ease=\"cubic-bezier(0.16, 1, 0.3, 1)\";return /*#__PURE__*/_jsxs(\"div\",{ref:ref,style:{textAlign:\"center\",maxWidth:600,margin:\"0 auto\",padding:\"120px 40px 0\"},children:[/*#__PURE__*/_jsx(\"p\",{style:{fontFamily:\"'janelotus Regular', 'Janelotus', 'Allura', cursive\",// 2026-08-12: 3.6vw = 14px at 390px, so this clamp never left its\n// 34px floor on a phone. Flat 28px below the mobile breakpoint.\n// 2026-08-12 (type scale): both branches are 18px and up — script\n// display type, out of scope, untouched.\nfontSize:isMobile?28:\"clamp(34px, 3.6vw, 46px)\",fontWeight:500,color:accent,margin:0,marginBottom:32,letterSpacing:\"0.02em\",lineHeight:1.2,opacity:shown?1:0,transform:shown?\"translateY(0)\":\"translateY(20px)\",transition:`opacity 0.8s ${ease}, transform 0.8s ${ease}`},children:question}),/*#__PURE__*/_jsx(\"a\",{href:buttonLink,onMouseEnter:()=>setHovered(true),onMouseLeave:()=>setHovered(false),style:{display:\"inline-flex\",alignItems:\"center\",gap:14,padding:\"17px 40px\",border:`1px solid ${accent}`,borderRadius:999,color:hovered?surface:accent,background:hovered?accent:\"transparent\",fontFamily:\"'Urbanist', sans-serif\",fontWeight:600,// 2026-08-12 (type scale): 13 → 14, the caption/chrome band, with\n// tracking eased 0.18em → 0.16em. \"DESIGN YOUR EVENT →\" measures\n// ~192px against the ~230px the 40px section gutters plus the 40px\n// button padding leave at 390px, so it holds one line; at 360px the\n// margin is only a few px, which is flagged rather than solved by\n// shrinking the padding.\n// 2026-08-17: the label is now \"BUILD MY EVENT\" — and, once the\n// owner dropped the trailing arrow the same day, shorter still than\n// the string measured above. The fit note holds with room to spare.\n// No size or tracking change.\nfontSize:14,letterSpacing:\"0.16em\",textTransform:\"uppercase\",textDecoration:\"none\",transition:`background-color 0.36s ${ease}, color 0.36s ${ease}, opacity 0.8s ${ease}, transform 0.8s ${ease}`,opacity:shown?1:0,transform:shown?\"translateY(0)\":\"translateY(20px)\",transitionDelay:shown?\"180ms\":\"0ms\",cursor:\"pointer\"},children:/*#__PURE__*/_jsx(\"span\",{children:buttonLabel})})]});}export default function CategoryGridSection(props){const{eyebrow=\"The Catalog\",headline=\"Find the moment you're cooking for.\",subhead=SMCO_DEFAULT_SUBHEAD,categories,showCards=true,showQuiz=true,quizQuestion=\"still deciding?\",// 2026-08-17: was \"Build My Event →\". Brent: \"We can drop the arrow for the\n// Build my Event.\" The shim above catches instances that still carry one.\nquizButtonLabel=\"Build My Event\",quizButtonLink=\"/design-your-event/\"}=props;// 2026-08-17: every rendered row now goes through the migration shim, so the\n// instance array's placeholder copy, missing hrefs and retired \"Seasonal\" row\n// are corrected on the way out. DEFAULT_CATEGORIES round-trips unchanged.\nconst list=resolveCategories(categories&&categories.length>0?categories:DEFAULT_CATEGORIES);// DEAD-LINK DEFECT CLASS: `href` on the Categories array control is a ControlType.Link with\n// no defaultValue, so an unset row would emit an invalid `url: \"\"`. Both numberOfItems and\n// itemListElement below derive from THIS one filtered array so they can never disagree.\nconst linkedCategories=list.filter(c=>absoluteUrl(c.href).length>0);// 2026-08-17: the count stated in the subhead is DERIVED, never a literal. `list` is\n// exactly what the grid below maps over, so the sentence and the cards are reading the\n// same array. `linkedCategories` is a subset of `list` guarded against an empty href —\n// and resolveCategories() has already dropped every row without one, so it is the same\n// length today; deriving from `list` means the copy tracks what a visitor can actually\n// see even if that defensive filter ever bites.\n// 2026-08-25 (live bug): the /experiences/ instance carries one placeholder row in its\n// Categories array control — a row with no href, which resolveCategories() correctly\n// drops. That left `list` empty and published \"Zero curated categories.\" on a page that\n// still offers every category through its filter row and the nav. Zero is never a\n// publishable number in this sentence, so the stated count falls back to the canonical\n// catalog size when the rendered array is empty. When the grid does render rows — the\n// normal case, and any deliberate instance-supplied subset — the sentence still reads\n// the same array the cards do, which is the whole point of the derivation.\nconst statedCategoryCount=list.length>0?list.length:SMCO_CATEGORY_COUNT;const subheadText=resolveCountCopy(subhead,statedCategoryCount);// ItemList JSON-LD over the RENDERED list (respects the `categories` prop override).\n// 2026-08-26: `showCards` gates this too, and that is a CORRECTNESS requirement, not a\n// nicety. Structured data must describe what is actually on the page, and the standing\n// rule on this project is to never emit schema for content a visitor cannot see. A\n// header-only instance renders no cards, so it emits no ItemList at all.\nconst itemListJson=showCards&&linkedCategories.length>0?{\"@context\":\"https://schema.org\",\"@type\":\"ItemList\",name:headline,numberOfItems:linkedCategories.length,itemListOrder:\"https://schema.org/ItemListOrderAscending\",isPartOf:{\"@id\":SITE_ID},publisher:{\"@id\":ORG_ID},// DEAD-LINK DEFECT CLASS: same filtered array as numberOfItems above, so the\n// count and the entries can never disagree; filtering first keeps `position`\n// contiguous rather than leaving gaps.\nitemListElement:linkedCategories.map((c,i)=>({\"@type\":\"ListItem\",position:i+1,name:c.title,description:c.tagline,url:absoluteUrl(c.href)}))}:null;const isDark=useDarkMode();const[headerRef,headerShown]=useReveal(.18);const bg=isDark?\"#1a1612\":\"#FAF8F3\";const eyebrowColor=\"#9CAF88\";// BLANKABLE LABEL (2026-08-17): String()/trim() so a whitespace-only value also\n// hides the label instead of leaving an element that still holds a line box.\nconst hasEyebrow=String(eyebrow??\"\").trim().length>0;const headlineColor=isDark?\"#FAF8F3\":\"#1B3A2F\";const subheadColor=isDark?\"rgba(244, 244, 244, 0.70)\":\"#4A5847\";const ease=\"cubic-bezier(0.16, 1, 0.3, 1)\";const[isMobile,setIsMobile]=useState(false);const[isTablet,setIsTablet]=useState(false);useEffect(()=>{if(typeof window===\"undefined\"||!window.matchMedia)return;const mqMobile=window.matchMedia(\"(max-width: 640px)\");const mqTablet=window.matchMedia(\"(min-width: 641px) and (max-width: 1020px)\");const update=()=>{setIsMobile(mqMobile.matches);setIsTablet(mqTablet.matches);};update();mqMobile.addEventListener(\"change\",update);mqTablet.addEventListener(\"change\",update);return()=>{mqMobile.removeEventListener(\"change\",update);mqTablet.removeEventListener(\"change\",update);};},[]);const columns=isMobile?\"1fr\":isTablet?\"1fr 1fr\":\"1fr 1fr 1fr\";return /*#__PURE__*/_jsxs(\"section\",{\"data-section\":\"experience-catalog\",style:{position:\"relative\",width:\"100%\",background:bg,// GAP ABOVE HEADLINE (2026-08-12): this section is the /experiences/\n// hero — the first thing under the nav — and it measured a 165px gap\n// from the nav's visible bottom to \"The Catalog\" eyebrow at 414px.\n// Attribution: 25px of nav layout overhang (the Framer canvas container\n// around the Navigation instance, fixed in Navigation.tsx) + this 140px\n// padding-top. 140 → 32 lands the eyebrow ~33px under the nav, inside\n// the 32-44px target, so the headline and the first cards are above the\n// fold instead of a screen of empty background.\n// Checked for the /pricing/ centring-slack trap before cutting: this\n// section is a plain block with no min-height and no align-items:center\n// anywhere above the eyebrow, so unlike InteriorHero the whole cut lands\n// rather than being half-absorbed by re-centring.\n// Bottom padding is deliberately untouched. Desktop (>640px) keeps\n// 180px/160px exactly.\npaddingTop:isMobile?\"32px\":\"180px\",paddingBottom:isMobile?\"100px\":\"160px\",fontFamily:\"'Urbanist', sans-serif\",transition:\"background-color 480ms ease, color 480ms ease\",overflow:\"hidden\"},children:[itemListJson&&/*#__PURE__*/_jsx(\"script\",{type:\"application/ld+json\",dangerouslySetInnerHTML:{__html:jsonLdText(itemListJson)}}),/*#__PURE__*/_jsxs(\"div\",{ref:headerRef,style:{textAlign:\"center\",maxWidth:920,margin:\"0 auto 96px\",padding:\"0 24px\",display:\"flex\",flexDirection:\"column\",alignItems:\"center\",gap:24},children:[hasEyebrow&&/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12 (type scale): 13 → 14, the caption/chrome band.\n// Tracking deliberately LEFT at 0.24em: \"THE CATALOG\" measures\n// ~124px inside a 342px column at 390px, so there is no line to\n// protect, and 0.24em is the signature treatment shared by the\n// section eyebrows across the site.\nfontSize:14,fontWeight:600,letterSpacing:\"0.24em\",textTransform:\"uppercase\",color:eyebrowColor,opacity:headerShown?1:0,transform:headerShown?\"translateY(0)\":\"translateY(12px)\",transition:`opacity 0.7s ${ease}, transform 0.7s ${ease}`},children:eyebrow}),/*#__PURE__*/_jsx(\"h1\",{style:{fontFamily:\"'Urbanist', sans-serif\",// 2026-08-12: the mobile branch was clamp(40px, 9vw, 56px) —\n// 9vw is only 35.1px at 390px, so it sat on the 40px floor and\n// the phone got a near-desktop headline. Flat 30px now; the\n// desktop branch below is untouched.\n// 2026-08-12 (type scale): both branches are 18px and up —\n// display type, out of scope, untouched.\nfontSize:isMobile?\"30px\":\"clamp(54px, 6vw, 88px)\",fontWeight:700,lineHeight:1.02,letterSpacing:\"-0.025em\",color:headlineColor,margin:0,opacity:headerShown?1:0,transform:headerShown?\"translateY(0)\":\"translateY(18px)\",transition:`opacity 0.85s ${ease} 0.08s, transform 0.85s ${ease} 0.08s, color 0.48s ease`},children:headline}),/*#__PURE__*/_jsx(\"p\",{style:{fontFamily:\"'Urbanist', sans-serif\",fontSize:isMobile?17:20,lineHeight:1.6,color:subheadColor,margin:0,maxWidth:720,opacity:headerShown?1:0,transform:headerShown?\"translateY(0)\":\"translateY(18px)\",transition:`opacity 0.85s ${ease} 0.16s, transform 0.85s ${ease} 0.16s, color 0.48s ease`},children:subheadText})]}),showCards&&/*#__PURE__*/_jsx(\"div\",{style:{maxWidth:1280,margin:\"0 auto\",padding:isMobile?\"0 24px\":\"0 64px\",display:\"grid\",gridTemplateColumns:columns,gap:isMobile?24:32},children:list.map((cat,idx)=>/*#__PURE__*/_jsx(CategoryCard,{category:cat,isDark:isDark,isMobile:isMobile,delay:idx*80},cat.title+idx))}),showQuiz&&/*#__PURE__*/_jsx(QuizCta,{question:quizQuestion,buttonLabel:resolveCtaLabel(quizButtonLabel),buttonLink:quizButtonLink,isDark:isDark,isMobile:isMobile})]});}addPropertyControls(CategoryGridSection,{eyebrow:{type:ControlType.String,title:\"Eyebrow\",defaultValue:\"The Catalog\"},headline:{type:ControlType.String,title:\"Headline\",defaultValue:\"Find the moment you're cooking for.\",displayTextArea:true},subhead:{type:ControlType.String,title:\"Subhead\",// Derived, so the value Framer copies onto a NEW instance is already correct.\n// Existing instances keep their own string and are corrected by resolveCountCopy().\ndefaultValue:SMCO_DEFAULT_SUBHEAD,displayTextArea:true},categories:{type:ControlType.Array,title:\"Categories\",control:{type:ControlType.Object,controls:{title:{type:ControlType.String,title:\"Title\",defaultValue:\"Category\"},tagline:{type:ControlType.String,title:\"Tagline\",defaultValue:\"Tagline\",displayTextArea:true},bestFor:{type:ControlType.String,title:\"Best For\",defaultValue:\"Team-building\"},description:{type:ControlType.String,title:\"Description\",defaultValue:\"What this category is, and who it's for.\",displayTextArea:true},sampleMenus:{type:ControlType.String,title:\"Sample Menus\",defaultValue:\"Menu A \\xb7 Menu B \\xb7 Menu C\"},priceFrom:{type:ControlType.String,title:\"Price From\",defaultValue:\"From $140 / kit\"},href:{type:ControlType.Link,title:\"Link\"},photo:{type:ControlType.Image,title:\"Photo\"},gradient:{type:ControlType.String,title:\"Fallback Gradient\",defaultValue:\"linear-gradient(160deg, #6b8e6c 0%, #2d3f2f 100%)\"}}},defaultValue:DEFAULT_CATEGORIES},// HEADER-ONLY MODE (2026-08-26): the /experiences/ page instance uses this section as\n// a header-only block — eyebrow + headline + subhead, no category cards. Until now that\n// was achieved by accident-shaped means: the instance carried ONE placeholder row in its\n// Categories array control, which resolveCategories() correctly drops for having no\n// href, leaving the rendered array empty. That made the suppression invisible in the UI\n// and fragile — anyone who \"cleaned up\" that junk-looking row would silently republish\n// eight category cards onto a page that is not meant to have any. Brent confirmed\n// 2026-08-26 that header-only is INTENTIONAL, so the intent now lives in a control that\n// says so out loud. Defaults to true, so every existing instance and every new one\n// inserted elsewhere is completely unaffected.\nshowCards:{type:ControlType.Boolean,title:\"Show Cards\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Header Only\"},showQuiz:{type:ControlType.Boolean,title:\"Show Quiz CTA\",defaultValue:true},quizQuestion:{type:ControlType.String,title:\"Quiz Question\",defaultValue:\"still deciding?\",hidden:props=>props.showQuiz===false},quizButtonLabel:{type:ControlType.String,title:\"Quiz Button\",// 2026-08-17: arrow dropped — see the CTA shim near the top of this file.\n// This default only reaches instances inserted from now on.\ndefaultValue:\"Build My Event\",hidden:props=>props.showQuiz===false},quizButtonLink:{type:ControlType.Link,title:\"Quiz Link\",hidden:props=>props.showQuiz===false}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CategoryGridSection\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"SMCO_CATEGORY_COUNT\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"SMCO_CATEGORY_COUNT_WORD\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CategoryGridSection.map","/*\n * CategoryGridSection\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/537ZFkQkAwY9MLf6iV1Z/3MZCvBGENNVjU7Z6RJCQ/CategoryGridSection.js\"\nexport { default } from \"https://framerusercontent.com/modules/537ZFkQkAwY9MLf6iV1Z/3MZCvBGENNVjU7Z6RJCQ/CategoryGridSection.js\"\n","// SMCo HubCTABlock — 3-column equal-weight conversion block.\n// Multiple paths of equal importance, not a single primary CTA. Used in hub closes.\n// CTAs use the SECONDARY GlassCta recipe — equal weight by design.\n// colTitleSize: per-instance column-title size (default 18).\n// SIZE CONTROLS (2026-06-30): eyebrowScale / headlineScale — proportional multipliers\n// (0.5–1.5, default 1) on the block's eyebrow + headline.\n// FAIL-OPEN REVEAL (2026-08-11): retrofitted to the project reveal contract — the whole\n// 3-column block used to hang off a bare IntersectionObserver, so one observer that never\n// fired rendered every conversion path invisible. Visible is now the default.\n// MOBILE TYPE SCALE (2026-08-11): mobile-only overrides in the media block at the bottom.\n// TABLET BREAKPOINT UNIFIED (2026-08-12): the block used to split its own responsive\n// logic across two breakpoints — the grid collapsed to one column at 880px while the\n// headline, card padding and column titles only restyled at 767px. Every viewport in\n// the 768–880px band (iPad portrait is 810px) therefore rendered full-width single-column\n// cards carrying desktop type: the headline clamp resolved to 4vw = 32.4px at 810px and\n// cards kept their 40px/32px padding. Both rules now live in one 880px block, so the\n// mobile layout and the mobile type scale switch on together. Desktop (>880px) is\n// byte-identical — 880px was already the collapse point, so nothing above it moved.\n// SMALL-TEXT SCALE (2026-08-12): site-wide legibility lift, matching Navigation and Footer.\n// Two values were under 18px and both are raised below: the eyebrow (13 → 14) and the\n// column description / card body (15 → 16). Both are plain inline sizes shared by desktop\n// AND mobile — the 880px media block overrides only the headline, card padding and column\n// title — so a single edit each covers every viewport and there is no mobile branch to\n// raise separately. Nothing 18px or over moved: the headline clamp (32px floor / 4vw /\n// 56px max), the mobile headline band (20–26px) and the column title (18px default, capped\n// at 20px on mobile) are byte-identical. Hierarchy inside the card is preserved — eyebrow\n// 14 < description 16 < column title 18, the same three steps as before at 13/15/18.\n// COPY CONSISTENCY (2026-08-17): three of Brent's four rulings land in this one block —\n// the category count, the one-business-day response promise, and the \"Build My Event\" CTA.\n// All three are INSTANCE-supplied on every page that renders this component, so the\n// corrections are applied at render time; see the shim note above resolveHubCopy.\n// DERIVED CATEGORY COUNT (2026-08-17): the count is no longer a literal anywhere in this\n// file. It is imported from CategoryGridSection.tsx, which owns the category list, so the\n// catalog, its ItemList, its subhead and the \"Browse all N categories…\" column on every\n// hub page all move together the next time a category is added or pulled.\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useRef,useState}from\"react\";import{GlassCta}from\"https://framer.com/m/GlassCta-gNbKgs.js\";import{SMCO_CATEGORY_COUNT_WORD}from\"https://framer.com/m/CategoryGridSection-agP4td.js\";function useDarkMode(){const[isDark,setIsDark]=useState(false);useEffect(()=>{if(typeof document===\"undefined\")return;const check=()=>setIsDark(document.documentElement.classList.contains(\"dark\"));check();const onChange=()=>check();document.addEventListener(\"smco-theme-change\",onChange);const observer=new MutationObserver(check);observer.observe(document.documentElement,{attributes:true,attributeFilter:[\"class\"]});return()=>{document.removeEventListener(\"smco-theme-change\",onChange);observer.disconnect();};},[]);return isDark;}// Mirrors the observer's own threshold AND rootMargin, so the guard fires at the\n// same scroll position a working observer would — a healthy observer always wins\n// the race and the motion is unchanged. Anything unmeasurable reveals.\nconst isOnScreen=(node,threshold,bottomInset=0)=>{if(typeof node.getBoundingClientRect!==\"function\")return true;const rect=node.getBoundingClientRect();const vh=window.innerHeight||document.documentElement.clientHeight||0;if(rect.height<=0||vh<=0)return true;const visible=Math.min(rect.bottom,vh*(1-bottomInset))-Math.max(rect.top,0);return visible>0&&visible/rect.height>=threshold;};// FAIL-OPEN REVEAL (2026-08-11): every conversion path out of a hub page lives in\n// this block — it can never depend on an effect firing. Static export and canvas\n// start revealed, a missing OR throwing IntersectionObserver reveals immediately,\n// and the rect guard below force-reveals if the observer is constructed but never\n// reports. The guard mirrors the observer's own threshold (0.15, no rootMargin).\nfunction useReveal(ref,isStatic){const[revealed,setRevealed]=useState(isStatic);useEffect(()=>{if(isStatic||revealed)return;const el=ref.current;if(!el||typeof IntersectionObserver===\"undefined\"){setRevealed(true);return;}let io=null;try{io=new IntersectionObserver(entries=>{for(const entry of entries){if(entry.isIntersecting){setRevealed(true);break;}}},{threshold:.15});io.observe(el);}catch{setRevealed(true);return;}// Guard: the observer is decoration, never a gate. Poll the rect at the\n// observer's own trigger point, and force-reveal outright once the\n// deadline passes even if the rect can't be trusted.\nconst deadline=Date.now()+2e4;const guard=window.setInterval(()=>{if(isOnScreen(el,.15,0)||Date.now()>deadline){setRevealed(true);}},400);return()=>{if(io)io.disconnect();window.clearInterval(guard);};},[isStatic,revealed,ref]);return revealed;}// ── TEMPORARY MIGRATION SHIM (2026-08-17) ─────────────────────────────────\n// Three of Brent's copy rulings, all of them landing on props that are supplied by\n// the CANVAS INSTANCE on every page this block appears on. Framer copies\n// defaultProps onto an instance at insert time and the instance wins forever\n// after, so editing the defaultValues below reaches nothing that already exists —\n// and String props on a linked code-component instance cannot be written through\n// the MCP XML API (updateXmlForNode answers \"No changes were made\"). Same shape,\n// and the same reasoning, as the copyright / contactEmail shims in Footer.tsx and\n// resolveCategories() in CategoryGridSection.tsx.\n//\n// RULING 1 — every CTA that invites someone to START AN EVENT reads \"Build My\n//   Event\". Brent's reasoning is why this is a rename and not a synonym swap: \"we\n//   want it to be not a booking thing, but they're building something creative and\n//   something cool.\" Audited instances carried \"Start Booking →\", \"Start booking →\"\n//   and \"Design your event →\" in col3CtaLabel, and \"BOOK YOUR EVENT\" /\n//   \"DESIGN YOUR EVENT\" / \"BUILD YOUR EVENT\" in col3Title.\n// RULING 2 — the response-time promise is \"within one business day\". Instances\n//   carried \"within 24 hours\" (pricing, the-smco-difference, how-it-works). The\n//   \"within the hour\" variant is matched too because it is live elsewhere on the\n//   site and could be pasted in here.\n// RULING 3 — the category count. This ruling was originally \"there are EIGHT\n//   categories, not nine\", and instances carried \"Browse all nine categories by\n//   collection, dietary, and format.\" It was superseded the SAME DAY by the Lunch &\n//   Learn merge, which took the catalog to seven — and then superseded AGAIN, also\n//   the same day, when Brent reversed the merge (\"nevermind then. lets add the Lunch\n//   and learn back in.\") and the catalog went back to eight. Three states in one day\n//   is exactly why the number is no longer written down here at all. The count table\n//   below is GENERATED from SMCO_CATEGORY_COUNT_WORD, imported from\n//   CategoryGridSection.tsx, so any stale number an instance carries is rewritten to\n//   whatever the catalog actually renders — nine → eight, seven → eight — and not one\n//   character of this file had to change when the reversal landed.\n//\n// DELIBERATELY NARROW, on both halves:\n//   * resolveCtaLabel matches FOUR whole-string legacy phrases and nothing else. It\n//     is not a fuzzy CTA rewriter — \"Browse Experiences →\", \"Schedule a Call →\",\n//     \"Get in Touch →\" and every other descriptive label pass through untouched, and\n//     so does any genuine custom string an author typed.\n//   * resolveHubCopy replaces fixed sub-phrases inside a longer sentence and\n//     leaves the rest of the author's prose exactly as written. It does not rewrite\n//     a description wholesale. A number word is only ever touched when the very next\n//     word is \"categories\".\n// Both fail open: anything unrecognised is returned unchanged.\n//\n// The CTA comparison is case-insensitive and tolerates a trailing arrow only so one\n// legacy phrase is not four entries (\"Start Booking →\" / \"Start booking →\").\n//\n// ARROW DROPPED (2026-08-17, second pass — Brent: \"We can drop the arrow for the\n// Build my Event.\"). The arrow used to be handed straight back on the way out; it is\n// now DISCARDED, so col3 paints exactly \"Build My Event\" with no trailing arrow and\n// no trailing space. Scoped to THIS ONE LABEL — the other columns' CTAs (\"Browse\n// Experiences →\", \"Schedule a Call →\") are outside the match list and keep their\n// arrows, as does every other arrow on the site. The canonical phrase is on the\n// match list for exactly this reason: an instance already reading \"Build My Event →\"\n// has to lose its arrow like everything else.\n//\n// PURE RENDER-TIME DERIVATION — no state, no effect. Framer static-renders this\n// block, and a falsy-seeded state corrected in an effect is a known first-paint bug\n// on this project.\n//\n// TEMPORARY. Delete this block, and the three resolve* calls in allCols, once every\n// canvas instance carries the corrected strings. A silent rewrite inside a render is\n// a trap for whoever reads this next.\nconst SMCO_CANONICAL_EVENT_CTA=\"Build My Event\";const SMCO_LEGACY_EVENT_CTAS=[\"book your event\",\"build your event\",\"design your event\",\"start booking\"];function resolveCtaLabel(label){if(typeof label!==\"string\")return label;const trimmed=label.trim();if(trimmed.length===0)return label;// Split a single trailing arrow off so a phrase typed WITH one still matches.\n// 2026-08-17 (second pass): what comes off is DISCARDED, not re-attached.\nconst match=/^(.*?)(\\s*→)$/.exec(trimmed);const core=(match?match[1]:trimmed).trim().toLowerCase();if(core!==SMCO_CANONICAL_EVENT_CTA.toLowerCase()&&SMCO_LEGACY_EVENT_CTAS.indexOf(core)<0)return label;return SMCO_CANONICAL_EVENT_CTA;}// Column TITLES are normalised through the same match list. These cards are the\n// conversion block — the title IS the call to action and the button under it only\n// repeats it — so leaving \"BOOK YOUR EVENT\" set in 18px uppercase sage directly\n// above a \"Build My Event\" button would ship exactly the split the ruling exists to\n// remove. Titles render through textTransform: uppercase, so the canonical string\n// paints as \"BUILD MY EVENT\" with no casing work here — and a title is a heading,\n// never an inline link, so the dropped arrow costs it nothing.\nfunction resolveColTitle(title){return resolveCtaLabel(title);}// ── DERIVED CATEGORY COUNT (2026-08-17) ───────────────────────────────────\n// This block STATES the catalog size (\"Browse all eight categories…\") but does not\n// RENDER the catalog, so it has nothing local to count. The number is imported from\n// CategoryGridSection.tsx, which owns the category list and applies the same\n// withdrawal filter the grid applies — ONE source of truth, so pulling a category\n// moves the cards, the ItemList, the catalog subhead and this sentence together.\n//\n// It arrives as an English word (\"eight\", at the time of writing) to match the copy\n// voice, and is lowercased here because every audited instance uses it mid-sentence\n// (\"Browse all N…\"). The sentence-initial form is generated separately below.\n//\n// FAILS OPEN, and deliberately WITHOUT a literal fallback: if the import ever\n// resolves to something that is not a usable string, the generated table comes out\n// EMPTY and author copy passes through untouched. A stale-but-authored number is a\n// smaller failure than a wrong one asserted by a broken shim — and a hardcoded\n// fallback is precisely the drift this change exists to remove.\nconst SMCO_DERIVED_COUNT_WORD=typeof SMCO_CATEGORY_COUNT_WORD===\"string\"&&SMCO_CATEGORY_COUNT_WORD.trim().length>0?SMCO_CATEGORY_COUNT_WORD.trim().toLowerCase():\"\";// Number words plausibly written into this one sentence. Each is only ever consulted\n// with the literal word \"categories\" immediately after it, so no other number in an\n// author's prose — headcounts, minutes, prices — can be caught by this.\nconst SMCO_COUNT_WORDS_IN_COPY=[\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"ten\",\"eleven\",\"twelve\"];const capitalizeWord=word=>word.length===0?word:word.charAt(0).toUpperCase()+word.slice(1);// Emits every \"all N categories\" pair BEFORE every bare \"N categories\" pair, so no\n// entry can be a prefix of a later one — the same longest-first invariant the\n// hand-written rows below rely on. The canonical word is skipped: rewriting it to\n// itself is a no-op that would only make the table harder to read.\nfunction buildCountCopyPairs(){const pairs=[];if(SMCO_DERIVED_COUNT_WORD.length===0)return pairs;const stale=SMCO_COUNT_WORDS_IN_COPY.filter(w=>w!==SMCO_DERIVED_COUNT_WORD);const canon=SMCO_DERIVED_COUNT_WORD;const Canon=capitalizeWord(canon);for(const w of stale){pairs.push([`all ${w} categories`,`all ${canon} categories`]);}for(const w of stale){pairs.push([`${w} categories`,`${canon} categories`]);}// Sentence-initial variant — \"Nine categories, all chef-led.\" — same narrowness.\nfor(const w of stale){pairs.push([`${capitalizeWord(w)} categories`,`${Canon} categories`]);}return pairs;}// Ordered longest-first so no entry can be a prefix of a later one. The category-count\n// rows are generated (see buildCountCopyPairs above); the response-time rows are fixed\n// phrases and stay written out.\nconst SMCO_LEGACY_COPY=[...buildCountCopyPairs(),[\"within 24 hours\",\"within one business day\"],[\"within the hour\",\"within one business day\"]];function resolveHubCopy(copy){if(typeof copy!==\"string\"||copy.length===0)return copy;let out=copy;for(const[legacy,canonical]of SMCO_LEGACY_COPY){if(out.indexOf(legacy)>=0)out=out.split(legacy).join(canonical);}return out;}// Panel default for the browse column, built from the derived word so a NEWLY\n// inserted instance starts correct. Existing instances carry their own string and are\n// corrected by resolveHubCopy() at render time. With no usable count it degrades to a\n// sentence that states no number at all rather than asserting a wrong one.\nconst SMCO_BROWSE_COL_DEFAULT=SMCO_DERIVED_COUNT_WORD.length>0?`Browse all ${SMCO_DERIVED_COUNT_WORD} categories by tier, dietary, format.`:\"Browse the full catalog by tier, dietary, format.\";/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n * @framerIntrinsicHeight 480\n */export default function HubCTABlock(props){// DEAD-LINK DEFECT CLASS: col1/2/3 CtaHref are ControlType.Link props with no defaultValue\n// and an \"\" destructure default, while their labels DO ship defaults — so the CTA renders\n// (it gates on label only) with an empty href that just reloads the page. Defaults below\n// match each column's default label and follow site CTA doctrine. /book/ is retired.\nconst{variant=\"three-column\",eyebrow=\"\",headline=\"\",colTitleSize=18,eyebrowScale=1,headlineScale=1,col1Title=\"\",col1Description=\"\",col1CtaLabel=\"\",col1CtaHref=\"/experiences/\",col2Title=\"\",col2Description=\"\",col2CtaLabel=\"\",col2CtaHref=\"/contact/\",col3Title=\"\",col3Description=\"\",col3CtaLabel=\"\",col3CtaHref=\"/design-your-event/\",col4Title=\"\",col4Description=\"\",col4CtaLabel=\"\",col4CtaHref=\"\",accentColor=\"#96c0a5\",surfaceColor=\"#f8f5f0\",surfaceDarkColor=\"#1a1612\",cardSurfaceColor=\"#ffffff\",cardSurfaceDarkColor=\"#25201b\",textColor=\"#0e0e0e\",textDarkColor=\"#f4f4f4\",subtleTextColor=\"rgba(14, 14, 14, 0.62)\",subtleTextDarkColor=\"rgba(244, 244, 244, 0.7)\",hairlineColor=\"rgba(14, 14, 14, 0.1)\",actionColor=\"#ff7f50\",maxWidth=1200}=props;const isDark=useDarkMode();const containerRef=useRef(null);const effSurface=isDark?surfaceDarkColor:surfaceColor;const effCardSurface=isDark?cardSurfaceDarkColor:cardSurfaceColor;const effText=isDark?textDarkColor:textColor;const effSubtle=isDark?subtleTextDarkColor:subtleTextColor;const effHairline=isDark?\"rgba(244, 244, 244, 0.14)\":hairlineColor;const eS=typeof eyebrowScale===\"number\"&&eyebrowScale>0?eyebrowScale:1;const hS=typeof headlineScale===\"number\"&&headlineScale>0?headlineScale:1;const isStatic=RenderTarget.current()===RenderTarget.canvas||typeof window===\"undefined\";const revealed=useReveal(containerRef,isStatic);// MOBILE TYPE SCALE (2026-08-11): at 400px the headline clamp resolves to its\n// 32px FLOOR — 4vw is only 16px there, so the floor governs and lowering it\n// would change nothing. This mobile-only value overrides the inline clamp via\n// !important below; the desktop clamp stays byte-identical. headlineScale still\n// steers it proportionally, capped so no instance lands out of band.\n// Column titles are a CAP, not a set: the 18px default is already under the\n// 20–22px band, so it passes through untouched and only oversized per-instance\n// colTitleSize values (up to 28) get pulled back down on mobile.\n// (2026-08-12): both values now apply from 880px down rather than 767px down —\n// values themselves unchanged, only the width at which they take effect.\n// SMALL-TEXT SCALE (2026-08-12): both bands below sit at 20px and up, i.e. above\n// the small-text ceiling, so the legibility lift leaves them byte-identical.\nconst mobileHeadlinePx=Math.min(26,Math.max(20,25*hS)).toFixed(1);const safeColTitle=typeof colTitleSize===\"number\"&&colTitleSize>0?colTitleSize:18;const mobileColTitlePx=Math.min(safeColTitle,20);const ease=\"cubic-bezier(0.16, 1, 0.3, 1)\";// TEMPORARY MIGRATION SHIM (2026-08-17) — see the note above resolveHubCopy.\n// Applied here, at the single point every column already funnels through, so the\n// empty-title filter below and the ctaLabel gate in HubCol keep working on the\n// resolved values and no call site can be missed.\nconst allCols=[{title:resolveColTitle(col1Title),description:resolveHubCopy(col1Description),ctaLabel:resolveCtaLabel(col1CtaLabel),ctaHref:col1CtaHref},{title:resolveColTitle(col2Title),description:resolveHubCopy(col2Description),ctaLabel:resolveCtaLabel(col2CtaLabel),ctaHref:col2CtaHref},{title:resolveColTitle(col3Title),description:resolveHubCopy(col3Description),ctaLabel:resolveCtaLabel(col3CtaLabel),ctaHref:col3CtaHref},{title:resolveColTitle(col4Title),description:resolveHubCopy(col4Description),ctaLabel:resolveCtaLabel(col4CtaLabel),ctaHref:col4CtaHref}];const cols=(variant===\"four-column\"?allCols:allCols.slice(0,3)).filter(c=>c.title.trim().length>0);const revealStyle=delayMs=>({opacity:revealed?1:0,transform:revealed?\"translateY(0)\":\"translateY(12px)\",transition:`opacity 720ms ${ease} ${delayMs}ms, transform 720ms ${ease} ${delayMs}ms`});return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,style:{width:\"100%\",padding:\"100px 24px\",boxSizing:\"border-box\",backgroundColor:effSurface},children:[/*#__PURE__*/_jsxs(\"div\",{style:{maxWidth:maxWidth,margin:\"0 auto\"},children:[(eyebrow.trim().length>0||headline.trim().length>0)&&/*#__PURE__*/_jsxs(\"div\",{style:{marginBottom:56,textAlign:\"center\"},children:[eyebrow.trim().length>0&&/*#__PURE__*/_jsx(\"div\",{style:{...revealStyle(0),fontFamily:\"Urbanist, sans-serif\",fontSize:14*eS,fontWeight:600,letterSpacing:\"0.18em\",textTransform:\"uppercase\",color:accentColor,marginBottom:16},children:eyebrow}),headline.trim().length>0&&/*#__PURE__*/_jsx(\"div\",{\"data-hub-cta-headline\":true,style:{...revealStyle(60),fontFamily:\"Urbanist, sans-serif\",fontSize:`clamp(${(32*hS).toFixed(1)}px, ${(4*hS).toFixed(2)}vw, ${(56*hS).toFixed(1)}px)`,fontWeight:700,lineHeight:1.05,letterSpacing:\"-0.025em\",color:effText},children:headline})]}),/*#__PURE__*/_jsx(\"div\",{\"data-hub-cta-grid\":true,style:{display:\"grid\",gridTemplateColumns:`repeat(${cols.length}, 1fr)`,gap:24},children:cols.map((col,i)=>/*#__PURE__*/_jsx(HubCol,{col:col,index:i,titleSize:colTitleSize,cardSurface:effCardSurface,text:effText,subtle:effSubtle,hairline:effHairline,accent:accentColor,action:actionColor,isDark:isDark,ease:ease,revealed:revealed},i))})]}),/*#__PURE__*/_jsx(\"style\",{children:`@media (max-width: 880px) { [data-hub-cta-grid] { grid-template-columns: 1fr !important; } [data-hub-cta-headline] { font-size: ${mobileHeadlinePx}px !important; } [data-hub-cta-card] { padding: 32px 22px !important; } [data-hub-cta-coltitle] { font-size: ${mobileColTitlePx}px !important; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }`})]});}function HubCol({col,index,titleSize,cardSurface,text,subtle,hairline,accent,action,isDark,ease,revealed}){const[hovered,setHovered]=useState(false);const big=titleSize>=16;return /*#__PURE__*/_jsxs(\"div\",{\"data-hub-cta-card\":true,onMouseEnter:()=>setHovered(true),onMouseLeave:()=>setHovered(false),style:{backgroundColor:cardSurface,borderRadius:20,border:`1px solid ${hairline}`,padding:\"40px 32px\",display:\"flex\",flexDirection:\"column\",alignItems:\"flex-start\",gap:16,opacity:revealed?1:0,transform:revealed?hovered?\"translateY(-2px)\":\"translateY(0)\":\"translateY(16px)\",boxShadow:hovered?\"0 16px 40px rgba(150, 192, 165, 0.18)\":\"0 4px 12px rgba(14, 14, 14, 0.04)\",transition:`opacity 720ms ${ease} ${120+index*100}ms, transform 320ms ${ease}, box-shadow 320ms ${ease}`},children:[/*#__PURE__*/_jsx(\"div\",{\"data-hub-cta-coltitle\":true,style:{fontFamily:\"Urbanist, sans-serif\",fontSize:titleSize,fontWeight:big?700:600,letterSpacing:big?\"0.08em\":\"0.22em\",textTransform:\"uppercase\",color:accent,lineHeight:1.2},children:col.title}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"Urbanist, sans-serif\",fontSize:16,lineHeight:1.55,color:subtle,flexGrow:1},children:col.description}),(col.ctaLabel||\"\").trim().length>0&&/*#__PURE__*/_jsx(\"div\",{style:{marginTop:12},children:/*#__PURE__*/_jsx(GlassCta,{label:col.ctaLabel,href:col.ctaHref,variant:\"secondary\",accentColor:accent,actionColor:action,textColor:text,isDark:isDark,ease:ease})})]});}addPropertyControls(HubCTABlock,{variant:{type:ControlType.Enum,title:\"Variant\",options:[\"three-column\",\"four-column\"],defaultValue:\"three-column\"},eyebrow:{type:ControlType.String,title:\"Eyebrow\",defaultValue:\"READY WHEN YOU ARE\"},headline:{type:ControlType.String,title:\"Headline\",defaultValue:\"Three Ways to Move Forward.\"},colTitleSize:{type:ControlType.Number,title:\"Column Title Size\",defaultValue:18,min:11,max:28,step:1},eyebrowScale:{type:ControlType.Number,title:\"Eyebrow Size\",defaultValue:1,min:.5,max:1.5,step:.05,displayStepper:true},headlineScale:{type:ControlType.Number,title:\"Headline Size\",defaultValue:1,min:.5,max:1.5,step:.05,displayStepper:true},col1Title:{type:ControlType.String,title:\"Col 1 Title\",defaultValue:\"EXPLORE THE EXPERIENCES\"},col1Description:{type:ControlType.String,title:\"Col 1 Description\",displayTextArea:true,defaultValue:SMCO_BROWSE_COL_DEFAULT},col1CtaLabel:{type:ControlType.String,title:\"Col 1 CTA\",defaultValue:\"Browse Experiences →\"},col1CtaHref:{type:ControlType.Link,title:\"Col 1 CTA Link\"},col2Title:{type:ControlType.String,title:\"Col 2 Title\",defaultValue:\"TALK TO A FOUNDER\"},col2Description:{type:ControlType.String,title:\"Col 2 Description\",displayTextArea:true,defaultValue:\"Brent or Therese, on Zoom. 30 minutes. No deck.\"},col2CtaLabel:{type:ControlType.String,title:\"Col 2 CTA\",defaultValue:\"Schedule a Call →\"},col2CtaHref:{type:ControlType.Link,title:\"Col 2 CTA Link\"},col3Title:{type:ControlType.String,title:\"Col 3 Title\",defaultValue:\"BUILD MY EVENT\"},col3Description:{type:ControlType.String,title:\"Col 3 Description\",displayTextArea:true,defaultValue:\"Self-serve booking flow. Most events confirmed within one business day.\"},// 2026-08-17: arrow dropped — Brent, \"We can drop the arrow for the Build my Event.\"\n// The shim above catches instances that still carry one. Col 1 and Col 2 keep theirs.\ncol3CtaLabel:{type:ControlType.String,title:\"Col 3 CTA\",defaultValue:\"Build My Event\"},col3CtaHref:{type:ControlType.Link,title:\"Col 3 CTA Link\"},col4Title:{type:ControlType.String,title:\"Col 4 Title\",defaultValue:\"\",hidden:props=>props.variant!==\"four-column\"},col4Description:{type:ControlType.String,title:\"Col 4 Description\",displayTextArea:true,defaultValue:\"\",hidden:props=>props.variant!==\"four-column\"},col4CtaLabel:{type:ControlType.String,title:\"Col 4 CTA\",defaultValue:\"\",hidden:props=>props.variant!==\"four-column\"},col4CtaHref:{type:ControlType.Link,title:\"Col 4 CTA Link\",hidden:props=>props.variant!==\"four-column\"},maxWidth:{type:ControlType.Number,title:\"Max Width\",defaultValue:1200,min:600,max:1600,step:20},accentColor:{type:ControlType.Color,title:\"Accent (Sage)\",defaultValue:\"#96c0a5\"},surfaceColor:{type:ControlType.Color,title:\"Surface\",defaultValue:\"#f8f5f0\"},surfaceDarkColor:{type:ControlType.Color,title:\"Surface Dark\",defaultValue:\"#1a1612\"},cardSurfaceColor:{type:ControlType.Color,title:\"Card Surface\",defaultValue:\"#ffffff\"},cardSurfaceDarkColor:{type:ControlType.Color,title:\"Card Surface Dark\",defaultValue:\"#25201b\"},textColor:{type:ControlType.Color,title:\"Text\",defaultValue:\"#0e0e0e\"},textDarkColor:{type:ControlType.Color,title:\"Text Dark\",defaultValue:\"#f4f4f4\"},subtleTextColor:{type:ControlType.Color,title:\"Text Subtle\",defaultValue:\"rgba(14, 14, 14, 0.62)\"},subtleTextDarkColor:{type:ControlType.Color,title:\"Text Subtle Dark\",defaultValue:\"rgba(244, 244, 244, 0.7)\"},hairlineColor:{type:ControlType.Color,title:\"Hairline\",defaultValue:\"rgba(14, 14, 14, 0.1)\"},actionColor:{type:ControlType.Color,title:\"Action (Burnt Orange)\",defaultValue:\"#ff7f50\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"HubCTABlock\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"480\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./HubCTABlock.map"],"mappings":"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"}