@neowhale/storefront 0.2.54 → 0.2.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2235,6 +2235,11 @@ function HeroSection({ section, theme, tracking, onEvent, data }) {
2235
2235
  source: c.inline_form?.source || "landing_page",
2236
2236
  landing_page_slug: slug || void 0,
2237
2237
  tags: c.inline_form?.tags || void 0,
2238
+ segment_id: c.inline_form?.segment_id || void 0,
2239
+ campaign_id: c.inline_form?.campaign_id || void 0,
2240
+ preferred_location_id: c.inline_form?.preferred_location_id || void 0,
2241
+ template_slug: c.inline_form?.template_slug || void 0,
2242
+ acquisition_campaign: c.inline_form?.acquisition_campaign || void 0,
2238
2243
  visitor_id: data?.analyticsContext?.visitorId || void 0,
2239
2244
  session_id: data?.analyticsContext?.sessionId || void 0,
2240
2245
  utm_source: urlParams?.get("utm_source") || void 0,
@@ -2333,10 +2338,11 @@ function HeroSection({ section, theme, tracking, onEvent, data }) {
2333
2338
  ] });
2334
2339
  }
2335
2340
  function HeroInlineForm({ ctaText, formOpen, setFormOpen, firstName, setFirstName, email, setEmail, status, errorMsg, onSubmit, successHeading, successMessage, submitText, theme, onEvent, tracking }) {
2341
+ const formMaxW = "min(480px, 90vw)";
2336
2342
  if (status === "success") {
2337
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "1.25rem 2rem", background: `${theme.fg}08`, border: `1px solid ${theme.fg}15`, maxWidth: 420, margin: "0 auto" }, children: [
2338
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "1.1rem", fontWeight: 300, color: theme.fg, margin: "0 0 0.25rem", fontFamily: theme.fontDisplay || "inherit" }, children: successHeading }),
2339
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.8rem", color: `${theme.fg}80`, margin: 0 }, children: successMessage })
2343
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { maxWidth: formMaxW, margin: "0 auto", padding: "1.5rem 2rem", background: `${theme.fg}06`, border: `1px solid ${theme.fg}10` }, children: [
2344
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "clamp(1rem, 3vw, 1.25rem)", fontWeight: 300, color: theme.fg, margin: "0 0 0.375rem", fontFamily: theme.fontDisplay || "inherit" }, children: successHeading }),
2345
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.85rem", color: `${theme.fg}70`, margin: 0, lineHeight: 1.5 }, children: successMessage })
2340
2346
  ] });
2341
2347
  }
2342
2348
  if (!formOpen) {
@@ -2350,37 +2356,39 @@ function HeroInlineForm({ ctaText, formOpen, setFormOpen, firstName, setFirstNam
2350
2356
  },
2351
2357
  style: {
2352
2358
  display: "inline-block",
2353
- padding: "0.875rem 2rem",
2359
+ padding: "clamp(0.875rem, 2.5vw, 1.125rem) clamp(2rem, 5vw, 3rem)",
2354
2360
  background: theme.fg,
2355
2361
  color: theme.bg,
2356
2362
  border: "none",
2357
2363
  cursor: "pointer",
2358
- fontSize: "0.85rem",
2364
+ fontSize: "clamp(0.85rem, 2vw, 1rem)",
2359
2365
  fontWeight: 500,
2360
- letterSpacing: "0.08em",
2366
+ letterSpacing: "0.06em",
2361
2367
  textTransform: "uppercase",
2362
- fontFamily: "inherit",
2363
- transition: "transform 0.2s"
2368
+ fontFamily: "inherit"
2364
2369
  },
2365
2370
  children: ctaText
2366
2371
  }
2367
2372
  );
2368
2373
  }
2369
- const inputStyle = {
2370
- flex: 1,
2371
- minWidth: 0,
2372
- padding: "0.875rem 1rem",
2374
+ const inputBase = {
2375
+ padding: "clamp(0.75rem, 2vw, 0.875rem) clamp(0.75rem, 2vw, 1rem)",
2373
2376
  background: theme.surface,
2374
- border: `1px solid ${theme.fg}25`,
2377
+ border: `1px solid ${theme.fg}20`,
2375
2378
  color: theme.fg,
2376
- fontSize: "0.9rem",
2379
+ fontSize: "clamp(0.8rem, 2vw, 0.9rem)",
2377
2380
  fontWeight: 300,
2378
2381
  outline: "none",
2379
2382
  fontFamily: "inherit",
2380
- boxSizing: "border-box"
2383
+ boxSizing: "border-box",
2384
+ width: "100%"
2381
2385
  };
2382
- return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit, style: { maxWidth: 480, margin: "0 auto" }, children: [
2383
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 0 }, children: [
2386
+ return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit, style: { maxWidth: formMaxW, margin: "0 auto", width: "100%" }, children: [
2387
+ /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: `
2388
+ .hero-form-row{display:flex;gap:0}
2389
+ @media(max-width:480px){.hero-form-row{flex-direction:column;gap:0.5rem}}
2390
+ ` } }),
2391
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hero-form-row", children: [
2384
2392
  /* @__PURE__ */ jsxRuntime.jsx(
2385
2393
  "input",
2386
2394
  {
@@ -2389,7 +2397,7 @@ function HeroInlineForm({ ctaText, formOpen, setFormOpen, firstName, setFirstNam
2389
2397
  value: firstName,
2390
2398
  autoFocus: true,
2391
2399
  onChange: (e) => setFirstName(e.target.value),
2392
- style: { ...inputStyle, borderRight: "none" }
2400
+ style: { ...inputBase, flex: 1, minWidth: 0, borderRight: "none" }
2393
2401
  }
2394
2402
  ),
2395
2403
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -2400,33 +2408,33 @@ function HeroInlineForm({ ctaText, formOpen, setFormOpen, firstName, setFirstNam
2400
2408
  value: email,
2401
2409
  required: true,
2402
2410
  onChange: (e) => setEmail(e.target.value),
2403
- style: { ...inputStyle, borderRight: "none" }
2404
- }
2405
- ),
2406
- /* @__PURE__ */ jsxRuntime.jsx(
2407
- "button",
2408
- {
2409
- type: "submit",
2410
- disabled: status === "loading",
2411
- style: {
2412
- padding: "0.875rem 1.25rem",
2413
- background: theme.fg,
2414
- color: theme.bg,
2415
- border: "none",
2416
- fontSize: "0.75rem",
2417
- fontWeight: 600,
2418
- letterSpacing: "0.08em",
2419
- textTransform: "uppercase",
2420
- cursor: status === "loading" ? "wait" : "pointer",
2421
- fontFamily: "inherit",
2422
- whiteSpace: "nowrap",
2423
- flexShrink: 0,
2424
- opacity: status === "loading" ? 0.7 : 1
2425
- },
2426
- children: status === "loading" ? "..." : submitText
2411
+ style: { ...inputBase, flex: 1.2, minWidth: 0 }
2427
2412
  }
2428
2413
  )
2429
2414
  ] }),
2415
+ /* @__PURE__ */ jsxRuntime.jsx(
2416
+ "button",
2417
+ {
2418
+ type: "submit",
2419
+ disabled: status === "loading",
2420
+ style: {
2421
+ width: "100%",
2422
+ padding: "clamp(0.75rem, 2vw, 0.875rem)",
2423
+ background: theme.fg,
2424
+ color: theme.bg,
2425
+ border: "none",
2426
+ fontSize: "clamp(0.8rem, 2vw, 0.85rem)",
2427
+ fontWeight: 600,
2428
+ letterSpacing: "0.08em",
2429
+ textTransform: "uppercase",
2430
+ cursor: status === "loading" ? "wait" : "pointer",
2431
+ fontFamily: "inherit",
2432
+ marginTop: "0.5rem",
2433
+ opacity: status === "loading" ? 0.7 : 1
2434
+ },
2435
+ children: status === "loading" ? "..." : submitText
2436
+ }
2437
+ ),
2430
2438
  status === "error" && errorMsg && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.75rem", color: "#e55", margin: "0.5rem 0 0", textAlign: "left" }, children: errorMsg })
2431
2439
  ] });
2432
2440
  }
@@ -2531,29 +2539,100 @@ function CollageHeroSection({ section, theme, tracking, onEvent }) {
2531
2539
  ] })
2532
2540
  ] });
2533
2541
  }
2534
- function GallerySection({ section, theme }) {
2535
- const { images } = section.content;
2542
+ function GallerySection({ section, theme, onEvent }) {
2543
+ const c = section.content;
2544
+ const images = c.images || [];
2536
2545
  const columns = section.config?.columns || 3;
2537
2546
  const layout = section.config?.layout || "grid";
2547
+ const loc = c.location_card;
2538
2548
  if (!images || images.length === 0) return null;
2539
2549
  if (layout === "collage") {
2540
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "0.375rem", maxWidth: 900, margin: "0 auto" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.375rem" }, children: images.map((img, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
2541
- gridColumn: i === 0 ? "1 / -1" : void 0,
2542
- aspectRatio: i === 0 ? "16/9" : i % 3 === 0 ? "3/4" : "1",
2543
- overflow: "hidden",
2544
- background: theme.surface
2545
- }, children: /* @__PURE__ */ jsxRuntime.jsx(
2546
- "img",
2547
- {
2548
- src: img.url,
2549
- alt: img.alt || "",
2550
- loading: i < 2 ? "eager" : "lazy",
2551
- style: { width: "100%", height: "100%", objectFit: "cover", display: "block" }
2552
- }
2553
- ) }, i)) }) });
2550
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "0.375rem", maxWidth: 900, margin: "0 auto" }, children: [
2551
+ loc && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.375rem", marginBottom: "0.375rem" }, children: [
2552
+ /* @__PURE__ */ jsxRuntime.jsx(GalleryLocationCard, { loc, theme, onEvent }),
2553
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { aspectRatio: "4/5", overflow: "hidden", background: theme.surface }, children: /* @__PURE__ */ jsxRuntime.jsx(
2554
+ "img",
2555
+ {
2556
+ src: images[0].url,
2557
+ alt: images[0].alt || "",
2558
+ loading: "eager",
2559
+ style: { width: "100%", height: "100%", objectFit: "cover", display: "block" }
2560
+ }
2561
+ ) })
2562
+ ] }),
2563
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.375rem" }, children: images.slice(loc ? 1 : 0).map((img, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
2564
+ gridColumn: !loc && i === 0 ? "1 / -1" : void 0,
2565
+ aspectRatio: !loc && i === 0 ? "16/9" : i % 3 === 0 ? "3/4" : "1",
2566
+ overflow: "hidden",
2567
+ background: theme.surface
2568
+ }, children: /* @__PURE__ */ jsxRuntime.jsx(
2569
+ "img",
2570
+ {
2571
+ src: img.url,
2572
+ alt: img.alt || "",
2573
+ loading: i < 2 ? "eager" : "lazy",
2574
+ style: { width: "100%", height: "100%", objectFit: "cover", display: "block" }
2575
+ }
2576
+ ) }, i)) })
2577
+ ] });
2554
2578
  }
2555
2579
  return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "1.5rem", maxWidth: 800, margin: "0 auto" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: "0.5rem" }, children: images.map((img, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: { aspectRatio: "1", overflow: "hidden", background: theme.surface }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: img.url, alt: img.alt || "", style: { width: "100%", height: "100%", objectFit: "cover", display: "block" } }) }, i)) }) });
2556
2580
  }
2581
+ function GalleryLocationCard({ loc, theme, onEvent }) {
2582
+ const dirUrl = loc.directions_url || `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(loc.address + ", " + loc.city + ", " + loc.state)}`;
2583
+ const brandFont = loc.brand_font || "inherit";
2584
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "#0C0C0C", border: "1px solid rgba(255,255,255,0.06)", overflow: "hidden", display: "flex", flexDirection: "column" }, children: [
2585
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative", flex: 1, minHeight: 0, overflow: "hidden" }, children: [
2586
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: loc.image, alt: loc.name, style: { width: "100%", height: "100%", objectFit: "cover", display: "block" } }),
2587
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, background: "linear-gradient(to top, rgba(0,0,0,0.6) 0%, transparent 50%)" } }),
2588
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", bottom: 0, left: 0, padding: "clamp(0.75rem, 3vw, 1.25rem)" }, children: [
2589
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "loc-card-name", style: { fontFamily: brandFont, fontSize: "clamp(1.25rem, 5vw, 1.75rem)", color: "#fff", margin: 0, lineHeight: 1 }, children: loc.name }),
2590
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "0.6rem", letterSpacing: "0.2em", color: "rgba(255,255,255,0.6)", margin: "0.25rem 0 0", fontWeight: 600, textTransform: "uppercase" }, children: [
2591
+ loc.city,
2592
+ ", ",
2593
+ loc.state
2594
+ ] })
2595
+ ] })
2596
+ ] }),
2597
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "clamp(0.625rem, 2vw, 1rem)", display: "flex", flexDirection: "column", gap: "0.4rem" }, children: [
2598
+ loc.tagline && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.75rem", color: "rgba(255,255,255,0.5)", fontWeight: 500, fontStyle: "italic", margin: 0 }, children: loc.tagline }),
2599
+ loc.rating != null && loc.review_count != null && loc.review_count > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.375rem" }, children: [
2600
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-flex", gap: "2px" }, children: [1, 2, 3, 4, 5].map((s) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: 12, height: 12, viewBox: "0 0 20 20", fill: s <= Math.round(loc.rating) ? theme.accent : "rgba(255,255,255,0.1)", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" }) }, s)) }),
2601
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.7rem", color: "rgba(255,255,255,0.5)", fontWeight: 500 }, children: `${loc.rating.toFixed(1)} \xB7 ${loc.review_count} reviews` })
2602
+ ] }),
2603
+ loc.address && /* @__PURE__ */ jsxRuntime.jsxs("a", { href: dirUrl, target: "_blank", rel: "noopener noreferrer", style: { fontSize: "0.7rem", color: "rgba(255,255,255,0.35)", fontWeight: 500, textDecoration: "none" }, children: [
2604
+ loc.address,
2605
+ ", ",
2606
+ loc.city,
2607
+ ", ",
2608
+ loc.state
2609
+ ] }),
2610
+ loc.phone && /* @__PURE__ */ jsxRuntime.jsx("a", { href: loc.phone_href || `tel:${loc.phone}`, style: { fontSize: "0.7rem", color: "rgba(255,255,255,0.35)", fontWeight: 500, textDecoration: "none" }, children: loc.phone }),
2611
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "0.375rem", marginTop: "auto", paddingTop: "0.125rem" }, children: [
2612
+ /* @__PURE__ */ jsxRuntime.jsx(
2613
+ "a",
2614
+ {
2615
+ href: dirUrl,
2616
+ target: "_blank",
2617
+ rel: "noopener noreferrer",
2618
+ onClick: () => onEvent?.("cta_click", { label: "directions", location: loc.name }),
2619
+ style: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", gap: "0.25rem", padding: "0.5rem", background: "#fff", color: "#000", fontSize: "0.65rem", fontWeight: 700, letterSpacing: "0.1em", textTransform: "uppercase", textDecoration: "none" },
2620
+ children: "directions"
2621
+ }
2622
+ ),
2623
+ loc.shop_url && /* @__PURE__ */ jsxRuntime.jsx(
2624
+ "a",
2625
+ {
2626
+ href: loc.shop_url,
2627
+ onClick: () => onEvent?.("cta_click", { label: "shop", location: loc.name }),
2628
+ style: { flex: 1, display: "flex", alignItems: "center", justifyContent: "center", gap: "0.25rem", padding: "0.5rem", border: "1px solid rgba(255,255,255,0.15)", color: "rgba(255,255,255,0.8)", fontSize: "0.65rem", fontWeight: 700, letterSpacing: "0.1em", textTransform: "uppercase", textDecoration: "none" },
2629
+ children: "shop"
2630
+ }
2631
+ )
2632
+ ] })
2633
+ ] })
2634
+ ] });
2635
+ }
2557
2636
  function SocialLinksSection({ section, theme }) {
2558
2637
  const { links } = section.content;
2559
2638
  if (!links || links.length === 0) return null;
@@ -2972,15 +3051,26 @@ function SuccessState({ theme, heading, message, couponCode }) {
2972
3051
  }, children: couponCode })
2973
3052
  ] }) });
2974
3053
  }
3054
+ var GOOGLE_G_LG = '<svg width="28" height="28" viewBox="0 0 48 48"><path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"/><path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"/><path fill="#FBBC05" d="M10.53 28.59a14.5 14.5 0 010-9.18l-7.98-6.19a24.03 24.03 0 000 21.56l7.98-6.19z"/><path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"/></svg>';
3055
+ var GOOGLE_G_SM = '<svg width="14" height="14" viewBox="0 0 48 48"><path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"/><path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"/><path fill="#FBBC05" d="M10.53 28.59a14.5 14.5 0 010-9.18l-7.98-6.19a24.03 24.03 0 000 21.56l7.98-6.19z"/><path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"/></svg>';
2975
3056
  function TestimonialsSection({ section, theme }) {
2976
3057
  const c = section.content;
2977
- const layout = section.config?.layout || "grid";
3058
+ section.config?.layout || "grid";
2978
3059
  const reviews = c.reviews || [];
2979
3060
  if (reviews.length === 0) return null;
2980
3061
  const overallRating = c.rating ?? 5;
2981
3062
  const reviewCount = c.review_count ?? reviews.length;
2982
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "3rem 1.5rem", maxWidth: 640, margin: "0 auto" }, children: [
2983
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "center", marginBottom: "2rem" }, children: [
3063
+ const googleUrl = section.config?.google_url || void 0;
3064
+ const directionsUrl = section.config?.directions_url || void 0;
3065
+ `reviews-${section.id}`;
3066
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "3rem 0", overflow: "hidden" }, children: [
3067
+ /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: `
3068
+ .rv-scroll{display:flex;gap:clamp(0.5rem,2vw,0.75rem);overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:0 clamp(1rem,4vw,3rem)}
3069
+ .rv-scroll::-webkit-scrollbar{display:none}
3070
+ .rv-card{flex:0 0 clamp(260px,40vw,320px);scroll-snap-align:start}
3071
+ ` } }),
3072
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "center", marginBottom: "2rem", padding: "0 1.5rem" }, children: [
3073
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", justifyContent: "center", marginBottom: "0.75rem" }, children: /* @__PURE__ */ jsxRuntime.jsx("span", { dangerouslySetInnerHTML: { __html: GOOGLE_G_LG } }) }),
2984
3074
  c.heading && /* @__PURE__ */ jsxRuntime.jsx("h2", { style: {
2985
3075
  fontSize: "clamp(1.25rem, 4vw, 1.75rem)",
2986
3076
  fontWeight: 300,
@@ -2991,42 +3081,121 @@ function TestimonialsSection({ section, theme }) {
2991
3081
  color: theme.fg
2992
3082
  }, children: /* @__PURE__ */ jsxRuntime.jsx(AnimatedText, { text: c.heading }) }),
2993
3083
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "0.5rem", marginBottom: "0.25rem" }, children: [
2994
- /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: overallRating, color: theme.accent, size: 18 }),
3084
+ /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: overallRating, color: "#FBBC05", size: 18 }),
2995
3085
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "1.1rem", fontWeight: 500, color: theme.fg }, children: /* @__PURE__ */ jsxRuntime.jsx(AnimatedText, { text: overallRating.toFixed(1) }) })
2996
3086
  ] }),
2997
3087
  c.subtitle ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.8rem", color: theme.muted, margin: 0, letterSpacing: "0.1em", textTransform: "uppercase" }, children: c.subtitle }) : /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "0.8rem", color: theme.muted, margin: 0, letterSpacing: "0.1em", textTransform: "uppercase" }, children: [
2998
3088
  "from ",
2999
3089
  /* @__PURE__ */ jsxRuntime.jsx(AnimatedText, { text: String(reviewCount) }),
3000
3090
  " reviews"
3091
+ ] }),
3092
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "0.625rem", justifyContent: "center", marginTop: "1.5rem", flexWrap: "wrap" }, children: [
3093
+ googleUrl && /* @__PURE__ */ jsxRuntime.jsxs("a", { href: googleUrl, target: "_blank", rel: "noopener noreferrer", style: {
3094
+ display: "inline-flex",
3095
+ alignItems: "center",
3096
+ gap: "0.5rem",
3097
+ padding: "clamp(0.75rem, 2vw, 0.875rem) clamp(1.25rem, 3vw, 2rem)",
3098
+ background: theme.fg,
3099
+ color: theme.bg,
3100
+ textDecoration: "none",
3101
+ fontSize: "clamp(0.8rem, 2vw, 0.9rem)",
3102
+ fontWeight: 600,
3103
+ letterSpacing: "0.06em",
3104
+ textTransform: "uppercase"
3105
+ }, children: [
3106
+ /* @__PURE__ */ jsxRuntime.jsx("span", { dangerouslySetInnerHTML: { __html: GOOGLE_G_SM } }),
3107
+ `see all ${reviewCount} reviews`
3108
+ ] }),
3109
+ directionsUrl && /* @__PURE__ */ jsxRuntime.jsx("a", { href: directionsUrl, target: "_blank", rel: "noopener noreferrer", style: {
3110
+ display: "inline-flex",
3111
+ alignItems: "center",
3112
+ gap: "0.5rem",
3113
+ padding: "clamp(0.75rem, 2vw, 0.875rem) clamp(1.25rem, 3vw, 2rem)",
3114
+ border: `1px solid ${theme.fg}25`,
3115
+ color: theme.fg,
3116
+ textDecoration: "none",
3117
+ fontSize: "clamp(0.8rem, 2vw, 0.9rem)",
3118
+ fontWeight: 600,
3119
+ letterSpacing: "0.06em",
3120
+ textTransform: "uppercase"
3121
+ }, children: "get directions" })
3001
3122
  ] })
3002
3123
  ] }),
3003
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
3004
- display: "grid",
3005
- gridTemplateColumns: layout === "list" ? "1fr" : `repeat(${Math.min(reviews.length, 2)}, 1fr)`,
3006
- gap: "0.75rem"
3007
- }, children: reviews.map((review, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: {
3008
- background: theme.surface,
3009
- border: `1px solid ${theme.fg}08`,
3010
- padding: "1.25rem"
3011
- }, children: [
3012
- /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: review.rating ?? 5, color: theme.accent, size: 14 }),
3013
- /* @__PURE__ */ jsxRuntime.jsxs("p", { style: {
3014
- fontSize: "0.88rem",
3015
- color: `${theme.fg}CC`,
3016
- margin: "0.75rem 0",
3017
- lineHeight: 1.6,
3018
- fontWeight: 300,
3019
- fontStyle: "italic"
3124
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rv-scroll", children: [
3125
+ reviews.map((review, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rv-card", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: {
3126
+ background: theme.surface,
3127
+ border: `1px solid ${theme.fg}08`,
3128
+ padding: "clamp(1rem, 3vw, 1.5rem)",
3129
+ height: "100%",
3130
+ display: "flex",
3131
+ flexDirection: "column"
3020
3132
  }, children: [
3021
- '"',
3022
- review.text,
3023
- '"'
3024
- ] }),
3025
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: "0.375rem" }, children: [
3026
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.8rem", fontWeight: 500, color: theme.fg }, children: review.name }),
3027
- review.location && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.7rem", color: theme.muted }, children: review.location })
3028
- ] })
3029
- ] }, i)) })
3133
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "0.75rem" }, children: [
3134
+ /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: review.rating ?? 5, color: "#FBBC05", size: 13 }),
3135
+ review.location && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.6rem", letterSpacing: "0.15em", textTransform: "uppercase", color: theme.muted, fontWeight: 500 }, children: review.location })
3136
+ ] }),
3137
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: {
3138
+ fontSize: "0.9rem",
3139
+ color: `${theme.fg}B0`,
3140
+ margin: "0 0 auto",
3141
+ lineHeight: 1.65,
3142
+ fontWeight: 400,
3143
+ paddingBottom: "1rem"
3144
+ }, children: `\u201C${review.text}\u201D` }),
3145
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderTop: `1px solid ${theme.fg}08`, paddingTop: "0.75rem", display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
3146
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
3147
+ width: 28,
3148
+ height: 28,
3149
+ borderRadius: "50%",
3150
+ background: `${theme.accent}18`,
3151
+ border: `1px solid ${theme.accent}15`,
3152
+ display: "flex",
3153
+ alignItems: "center",
3154
+ justifyContent: "center",
3155
+ flexShrink: 0
3156
+ }, children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.7rem", fontWeight: 600, color: theme.accent, textTransform: "uppercase" }, children: review.name.charAt(0) }) }),
3157
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.8rem", fontWeight: 500, color: `${theme.fg}AA` }, children: review.name })
3158
+ ] })
3159
+ ] }) }, i)),
3160
+ googleUrl && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rv-card", children: /* @__PURE__ */ jsxRuntime.jsxs("a", { href: googleUrl, target: "_blank", rel: "noopener noreferrer", style: {
3161
+ height: "100%",
3162
+ display: "flex",
3163
+ flexDirection: "column",
3164
+ alignItems: "center",
3165
+ justifyContent: "center",
3166
+ gap: "0.75rem",
3167
+ background: theme.surface,
3168
+ border: `1px solid ${theme.fg}08`,
3169
+ padding: "clamp(1rem, 3vw, 1.5rem)",
3170
+ textDecoration: "none"
3171
+ }, children: [
3172
+ /* @__PURE__ */ jsxRuntime.jsx("span", { dangerouslySetInnerHTML: { __html: GOOGLE_G_LG } }),
3173
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.85rem", color: theme.fg, fontWeight: 500 }, children: `read all ${reviewCount}` }),
3174
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.75rem", color: theme.muted, letterSpacing: "0.08em" }, children: "reviews on google" })
3175
+ ] }) })
3176
+ ] }),
3177
+ googleUrl && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "center", marginTop: "1.5rem", padding: "0 1.5rem" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
3178
+ "a",
3179
+ {
3180
+ href: googleUrl,
3181
+ target: "_blank",
3182
+ rel: "noopener noreferrer",
3183
+ style: {
3184
+ display: "inline-flex",
3185
+ alignItems: "center",
3186
+ gap: "0.5rem",
3187
+ fontSize: "0.8rem",
3188
+ color: theme.muted,
3189
+ textDecoration: "none",
3190
+ letterSpacing: "0.08em",
3191
+ fontWeight: 500
3192
+ },
3193
+ children: [
3194
+ /* @__PURE__ */ jsxRuntime.jsx("span", { dangerouslySetInnerHTML: { __html: GOOGLE_G_SM } }),
3195
+ `read all ${reviewCount} reviews on google`
3196
+ ]
3197
+ }
3198
+ ) })
3030
3199
  ] });
3031
3200
  }
3032
3201
  function Stars({ rating, color, size }) {
@@ -3460,7 +3629,7 @@ function SectionRenderer({
3460
3629
  case "video":
3461
3630
  return /* @__PURE__ */ jsxRuntime.jsx(VideoSection, { section, theme });
3462
3631
  case "gallery":
3463
- return /* @__PURE__ */ jsxRuntime.jsx(GallerySection, { section, theme });
3632
+ return /* @__PURE__ */ jsxRuntime.jsx(GallerySection, { section, theme, onEvent });
3464
3633
  case "cta":
3465
3634
  return /* @__PURE__ */ jsxRuntime.jsx(CTASection, { section, theme, tracking, onEvent });
3466
3635
  case "stats":