@sonordev/site-kit 7.3.0 → 7.4.0

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.
Files changed (97) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/agent-manifest.json +1 -1
  3. package/dist/{AnalyticsProvider-DJQA66AG.js → AnalyticsProvider-BQXV3ZF3.js} +4 -4
  4. package/dist/{ArticleViewTracker-GFOAXFV7.js → ArticleViewTracker-3DH53RSB.js} +3 -3
  5. package/dist/{BlocksPopup-AHDU34TL.js → BlocksPopup-FGWYVHCH.js} +4 -4
  6. package/dist/{ChatWidget-FHBAHFZX.js → ChatWidget-CDQZCLVH.js} +5 -5
  7. package/dist/{FileField-J5W5MIAZ.js → FileField-IPJ7L2W6.js} +3 -3
  8. package/dist/{FormSpotlight-PE5YZBFZ.js → FormSpotlight-CQI2DBWI.js} +1 -1
  9. package/dist/{FormStage-OOPQC27J.js → FormStage-4WHD6ED4.js} +1 -1
  10. package/dist/{ManagedForm-JRZAJ7SZ.js → ManagedForm-7FZNH4L2.js} +6 -6
  11. package/dist/{ManagedNewsletterForm-TC5542ZG.js → ManagedNewsletterForm-3D2BK3KQ.js} +4 -4
  12. package/dist/{SignalCore-2YP5FCAS.js → SignalCore-HEQYITTM.js} +3 -3
  13. package/dist/{SiteChat-EGEZJJVV.js → SiteChat-DMPDXY3W.js} +1 -1
  14. package/dist/{SiteDesignReporter-YEEWJKWN.js → SiteDesignReporter-Y2IOJE52.js} +5 -5
  15. package/dist/{SitePopups-LQBIXIFV.js → SitePopups-HD2LDKVU.js} +4 -4
  16. package/dist/SitemapSync-OKPZHRX6.js +8 -0
  17. package/dist/_client/booking-widget.js +5 -5
  18. package/dist/_client/testimonial-section.d.ts +1 -1
  19. package/dist/_client/testimonial-section.js +2 -1
  20. package/dist/affiliates/index.js +3 -3
  21. package/dist/analytics/index.js +4 -4
  22. package/dist/articles/index.js +1 -1
  23. package/dist/articles/server-ui.js +1 -1
  24. package/dist/chat/index.js +6 -6
  25. package/dist/{chunk-BEBR4OJD.js → chunk-3E3PPSNR.js} +2 -2
  26. package/dist/{chunk-6U3VLV2C.js → chunk-4BHRA7TI.js} +1 -1
  27. package/dist/{chunk-Y6LP36UW.js → chunk-4DJMJ4V5.js} +2 -2
  28. package/dist/{chunk-WDQB4OXY.js → chunk-5O62CER4.js} +1 -1
  29. package/dist/{chunk-YJLS6JBI.js → chunk-6LLTLLEJ.js} +2 -2
  30. package/dist/{chunk-BR4ZKUHH.js → chunk-7HPZSWS4.js} +17 -1
  31. package/dist/{chunk-CYUFBKJQ.js → chunk-AH4AXO4P.js} +1 -1
  32. package/dist/{chunk-ZKHI4E2B.js → chunk-ATE6IFVK.js} +1 -1
  33. package/dist/{chunk-L7U23XI2.js → chunk-AV4QAK5F.js} +1 -1
  34. package/dist/chunk-CAT235HY.js +13 -0
  35. package/dist/{chunk-I2YX3HVD.js → chunk-CG4ETW5Y.js} +2 -2
  36. package/dist/{chunk-MKMD2HJW.js → chunk-CKW4HFJG.js} +1 -1
  37. package/dist/{chunk-EPT6FJUY.js → chunk-CSN45MHO.js} +1 -1
  38. package/dist/{chunk-T4DLETKR.js → chunk-D2RGEWHS.js} +1 -1
  39. package/dist/{chunk-ZHS2XFLV.js → chunk-DA5XC7Y6.js} +1 -1
  40. package/dist/{chunk-UPRSH6Q4.js → chunk-EHR4NIMX.js} +2 -2
  41. package/dist/{chunk-XLSQTTUE.js → chunk-FUQTV5O6.js} +1 -1
  42. package/dist/{chunk-WGG6GTKW.js → chunk-GK7TV7EK.js} +1 -1
  43. package/dist/{chunk-DNPNYWVL.js → chunk-IE5SSOCN.js} +3 -10
  44. package/dist/{chunk-VF4F5WXZ.js → chunk-JRCNUUNG.js} +1 -1
  45. package/dist/{chunk-56KNHB4U.js → chunk-KHQ5GD6T.js} +1 -1
  46. package/dist/{chunk-WGIDC6QP.js → chunk-MDP7EB4J.js} +3 -3
  47. package/dist/{chunk-2ECWEUHP.js → chunk-MHGAZ3LL.js} +1 -1
  48. package/dist/chunk-OD2ULW5Z.js +57 -0
  49. package/dist/{chunk-O5RGXTWU.js → chunk-OOD6GMT4.js} +2 -2
  50. package/dist/{chunk-MVR4FY5R.js → chunk-PF64OEXC.js} +1 -1
  51. package/dist/{chunk-MRQ2U4LZ.js → chunk-PQDJNIHR.js} +1 -1
  52. package/dist/{chunk-VX5CMNMM.js → chunk-UAYAJPEP.js} +7 -1
  53. package/dist/{chunk-NI2XNEMR.js → chunk-XA2BNW5M.js} +1 -1
  54. package/dist/{chunk-2AD3CDRR.js → chunk-XEMHGJEG.js} +8 -8
  55. package/dist/{chunk-RDPW4D33.js → chunk-YCFW2OQO.js} +1 -1
  56. package/dist/{chunk-Z65DHMTW.js → chunk-ZTLU3BSW.js} +2 -2
  57. package/dist/client/index.js +3 -3
  58. package/dist/commerce/index.js +4 -4
  59. package/dist/engage/index.js +7 -7
  60. package/dist/fleet/index.js +4 -4
  61. package/dist/forms/index.js +7 -7
  62. package/dist/forms/server.js +2 -2
  63. package/dist/images/index.js +4 -4
  64. package/dist/index.js +1 -1
  65. package/dist/layout/client.js +7 -7
  66. package/dist/layout/index.js +9 -9
  67. package/dist/llms/index.js +6 -6
  68. package/dist/maps/index.js +3 -3
  69. package/dist/mcp/sonor.js +8 -8
  70. package/dist/reputation/TestimonialSection.d.ts +1 -1
  71. package/dist/reputation/VisualReviewCard.d.ts +6 -0
  72. package/dist/reputation/index.d.ts +2 -1
  73. package/dist/reputation/index.js +3 -1
  74. package/dist/reputation/review-photo.d.ts +2 -0
  75. package/dist/reputation/server.d.ts +3 -2
  76. package/dist/reputation/server.js +2 -0
  77. package/dist/reputation/types.d.ts +22 -0
  78. package/dist/revalidate/index.js +2 -2
  79. package/dist/seo/client.js +4 -4
  80. package/dist/seo/index.js +4 -4
  81. package/dist/seo/llms.js +6 -6
  82. package/dist/seo/register-sitemap-cli.js +1 -1
  83. package/dist/seo/sitemap.js +4 -4
  84. package/dist/server/index.js +3 -3
  85. package/dist/server/mint-site-token.d.ts +1 -2
  86. package/dist/shared/fresh-fetch.d.ts +9 -3
  87. package/dist/shared/version.d.ts +1 -1
  88. package/dist/signal/index.js +2 -2
  89. package/dist/sitemap/index.js +4 -4
  90. package/dist/sync/index.js +5 -5
  91. package/dist/website/images.js +4 -4
  92. package/dist/website/index.js +5 -5
  93. package/dist/website/popups.js +4 -4
  94. package/dist/{writeLLMsTxt-2NQVDGYI.js → writeLLMsTxt-OL4KQERZ.js} +3 -3
  95. package/package.json +1 -1
  96. package/src/reputation/README.md +25 -0
  97. package/dist/SitemapSync-LSZ2EYOF.js +0 -8
@@ -1,5 +1,5 @@
1
1
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
2
- import { configureSiteCredential, currentCredential } from './chunk-WGG6GTKW.js';
2
+ import { configureSiteCredential, currentCredential } from './chunk-GK7TV7EK.js';
3
3
 
4
4
  // src/shared/publishCredential.ts
5
5
  function publishSiteCredential({
@@ -1,4 +1,4 @@
1
1
  // src/shared/version.ts
2
- var SITE_KIT_VERSION = "7.3.0";
2
+ var SITE_KIT_VERSION = "7.4.0";
3
3
 
4
4
  export { SITE_KIT_VERSION };
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- import { countStageViews, countStageQuestions, useFieldControls } from './chunk-ZKHI4E2B.js';
2
+ import { countStageViews, countStageQuestions, useFieldControls } from './chunk-ATE6IFVK.js';
3
3
  import { HoneypotField } from './chunk-DXO6SBMD.js';
4
4
  import { DelightStyles, FormMomentum, FormField } from './chunk-4NTBQNHA.js';
5
- import { useFormLoadedAt, useFormTracking, submitForm, useRecaptchaWarmup, useForm } from './chunk-EPT6FJUY.js';
5
+ import { useFormLoadedAt, useFormTracking, submitForm, useRecaptchaWarmup, useForm } from './chunk-CSN45MHO.js';
6
6
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
7
7
  import { isFieldVisible, validateField, isFieldComplete, isDisplayOnly, unseenControlValues } from './chunk-C2FZBUSS.js';
8
8
  import { DEFAULT_FORM_SUCCESS_MESSAGE } from './chunk-5SQK3D53.js';
@@ -63,7 +63,7 @@ function FormClient({
63
63
  return;
64
64
  }
65
65
  let cancelled = false;
66
- const load = resolvedExperience === "stage" ? import('./FormStage-OOPQC27J.js').then((m) => m.FormStage) : import('./FormSpotlight-PE5YZBFZ.js').then((m) => m.FormSpotlight);
66
+ const load = resolvedExperience === "stage" ? import('./FormStage-4WHD6ED4.js').then((m) => m.FormStage) : import('./FormSpotlight-CQI2DBWI.js').then((m) => m.FormSpotlight);
67
67
  load.then((Component) => {
68
68
  if (!cancelled) setExperience(() => Component);
69
69
  }).catch((err) => {
@@ -1,4 +1,4 @@
1
- import { sonorFetch } from './chunk-BEBR4OJD.js';
1
+ import { sonorFetch } from './chunk-3E3PPSNR.js';
2
2
 
3
3
  // src/sync/api.ts
4
4
  var DEFAULT_API_URL = "https://api.sonor.io";
@@ -0,0 +1,57 @@
1
+ import { reviewPhotoUrl } from './chunk-CAT235HY.js';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+
4
+ var styles = `
5
+ .sk-visual-review-gallery{font-family:var(--sk-font,inherit);color:var(--sk-text-primary);padding-block:2rem}
6
+ .sk-visual-review-gallery-header{margin-block-end:1.5rem}.sk-visual-review-gallery-header h2{margin:0 0 .5rem}.sk-visual-review-gallery-header p{margin:0;color:var(--sk-text-secondary)}
7
+ .sk-visual-review-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,19rem),1fr));gap:1.5rem;align-items:start}
8
+ .sk-visual-review{min-width:0;overflow:hidden;border:1px solid var(--sk-surface-border);border-radius:var(--sk-radius-lg,.75rem);background:var(--sk-bg);color:var(--sk-text-primary);font-family:var(--sk-font,inherit)}
9
+ .sk-visual-review-photo{margin:0;background:var(--sk-surface)}.sk-visual-review-photo img{display:block;aspect-ratio:4/3;width:100%;object-fit:cover}
10
+ .sk-visual-review-photo figcaption{padding:.75rem 1rem;color:var(--sk-text-secondary);font-size:.875rem;line-height:1.5;overflow-wrap:anywhere}
11
+ .sk-visual-review-body{position:relative;padding:1.5rem;border-block-start:3px solid var(--sk-primary)}
12
+ .sk-visual-review-stars{display:flex;gap:.2rem;margin-block-end:1rem;color:var(--sk-primary)}.sk-visual-review-star-empty{opacity:.25}
13
+ .sk-visual-review blockquote{margin:0;font-size:1.125rem;line-height:1.7;white-space:pre-line;overflow-wrap:anywhere}
14
+ .sk-visual-review-author{display:flex;align-items:center;gap:.75rem;margin-block-start:1.25rem}.sk-visual-review-avatar{width:2.75rem;height:2.75rem;border-radius:50%;object-fit:cover;flex:none}
15
+ .sk-visual-review-name{font-weight:600;overflow-wrap:anywhere}.sk-visual-review-role{margin-block-start:.2rem;font-size:.875rem;color:var(--sk-text-secondary);overflow-wrap:anywhere}
16
+ `;
17
+ function CardContent({ review, showRating = true, className = "" }) {
18
+ const photoUrl = reviewPhotoUrl(review.photo?.url);
19
+ const avatarUrl = reviewPhotoUrl(review.image);
20
+ const rating = Number.isFinite(review.rating) ? Math.max(0, Math.min(5, review.rating)) : 0;
21
+ return /* @__PURE__ */ jsxs("article", { className: `sk-visual-review ${className}`, "data-site-kit-visual-review": review.id, children: [
22
+ photoUrl && /* @__PURE__ */ jsxs("figure", { className: "sk-visual-review-photo", children: [
23
+ /* @__PURE__ */ jsx("img", { src: photoUrl, alt: review.photo?.altText || `Photo accompanying ${review.name}'s review`, loading: "lazy", decoding: "async" }),
24
+ review.photo?.caption && /* @__PURE__ */ jsx("figcaption", { children: review.photo.caption })
25
+ ] }),
26
+ /* @__PURE__ */ jsxs("div", { className: "sk-visual-review-body", children: [
27
+ showRating && /* @__PURE__ */ jsx("div", { className: "sk-visual-review-stars", role: "img", "aria-label": `${rating} out of 5 stars`, children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: star > rating ? "sk-visual-review-star-empty" : void 0, children: "\u2605" }, star)) }),
28
+ /* @__PURE__ */ jsx("blockquote", { children: review.quote }),
29
+ /* @__PURE__ */ jsxs("div", { className: "sk-visual-review-author", children: [
30
+ avatarUrl && /* @__PURE__ */ jsx("img", { className: "sk-visual-review-avatar", src: avatarUrl, alt: "", loading: "lazy", decoding: "async" }),
31
+ /* @__PURE__ */ jsxs("div", { children: [
32
+ /* @__PURE__ */ jsx("div", { className: "sk-visual-review-name", children: review.name }),
33
+ review.role && /* @__PURE__ */ jsx("div", { className: "sk-visual-review-role", children: review.role })
34
+ ] })
35
+ ] })
36
+ ] })
37
+ ] });
38
+ }
39
+ function VisualReviewCard(props) {
40
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
41
+ /* @__PURE__ */ jsx("style", { children: styles }),
42
+ /* @__PURE__ */ jsx(CardContent, { ...props })
43
+ ] });
44
+ }
45
+ function VisualReviewGallery({ reviews, title, subtitle, showRating = true, className = "" }) {
46
+ if (!reviews.length) return null;
47
+ return /* @__PURE__ */ jsxs("section", { className: `sk-visual-review-gallery ${className}`, "data-site-kit-visual-reviews": true, children: [
48
+ /* @__PURE__ */ jsx("style", { children: styles }),
49
+ (title || subtitle) && /* @__PURE__ */ jsxs("header", { className: "sk-visual-review-gallery-header", children: [
50
+ title && /* @__PURE__ */ jsx("h2", { children: title }),
51
+ subtitle && /* @__PURE__ */ jsx("p", { children: subtitle })
52
+ ] }),
53
+ /* @__PURE__ */ jsx("div", { className: "sk-visual-review-grid", children: reviews.map((review) => /* @__PURE__ */ jsx(CardContent, { review, showRating }, review.id)) })
54
+ ] });
55
+ }
56
+
57
+ export { VisualReviewCard, VisualReviewGallery };
@@ -2,9 +2,9 @@
2
2
  import { VISUAL_VIEWPORT_GAP_PROPERTY } from './chunk-6T6CQVNL.js';
3
3
  import { GlassStyles } from './chunk-JE4A5S4F.js';
4
4
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
5
- import { useForm } from './chunk-EPT6FJUY.js';
5
+ import { useForm } from './chunk-CSN45MHO.js';
6
6
  import { parseColor, relativeLuminance, DARK_LUMINANCE, contrastRatio } from './chunk-S22FSH7C.js';
7
- import { sonorFetch } from './chunk-BEBR4OJD.js';
7
+ import { sonorFetch } from './chunk-3E3PPSNR.js';
8
8
  import { useState, useEffect, useRef, useLayoutEffect, useCallback, Fragment as Fragment$1 } from 'react';
9
9
  import { lexer } from 'marked';
10
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -6,7 +6,7 @@ import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
6
6
  import React, { useRef, useEffect, useState, useMemo, useCallback } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
 
9
- var loadInteractiveForm = () => import('./ManagedForm-JRZAJ7SZ.js').then((m) => m.ManagedForm);
9
+ var loadInteractiveForm = () => import('./ManagedForm-7FZNH4L2.js').then((m) => m.ManagedForm);
10
10
  var REPLAY_WAIT_MS = 8e3;
11
11
  function FormEnhancer({
12
12
  formId,
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { getSiteDesignTokens, tokensForReport, shouldReportDesign, sendSiteDesign } from './chunk-I2YX3HVD.js';
2
+ import { getSiteDesignTokens, tokensForReport, shouldReportDesign, sendSiteDesign } from './chunk-CG4ETW5Y.js';
3
3
  import { designTokensHash } from './chunk-IHG36STL.js';
4
4
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
5
5
  import { resolveAnalyticsTarget } from './chunk-43OCZ3JA.js';
@@ -8,6 +8,12 @@ function resolveFetch() {
8
8
  }
9
9
  var BUILD_NONCE = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
10
10
  var FRESH_FETCH_NONCE_HEADER = "x-sitekit-build-nonce";
11
+ var trackedRequestSequence = 0;
12
+ function trackedFreshFetch(input, init = {}) {
13
+ const headers = new Headers(init.headers);
14
+ headers.set(FRESH_FETCH_NONCE_HEADER, `${BUILD_NONCE}-${++trackedRequestSequence}`);
15
+ return fetch(input, { ...init, headers, cache: "force-cache" });
16
+ }
11
17
  function freshFetch(input, init = {}) {
12
18
  const current = globalThis.fetch;
13
19
  const { fn, unpatched } = resolveFetch();
@@ -23,4 +29,4 @@ function buildFetch(input, init = {}) {
23
29
  return isNextProductionBuild() ? freshFetch(input, init) : fetch(input, init);
24
30
  }
25
31
 
26
- export { buildFetch, freshFetch, resolveFetch };
32
+ export { buildFetch, freshFetch, resolveFetch, trackedFreshFetch };
@@ -1,5 +1,5 @@
1
1
  import { secretsMatch, readCappedBody } from './chunk-XTRZGXB2.js';
2
- import { SITE_KIT_VERSION } from './chunk-56KNHB4U.js';
2
+ import { SITE_KIT_VERSION } from './chunk-KHQ5GD6T.js';
3
3
 
4
4
  // src/llms/revalidate.ts
5
5
  function createLlmsRevalidateHandler(secret, options) {
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { SITE_EDIT_PARAM } from './chunk-6G43IRWR.js';
3
- import { publishSiteCredential } from './chunk-VF4F5WXZ.js';
4
- import { FleetHeartbeat } from './chunk-UPRSH6Q4.js';
5
- import { SignalBridge } from './chunk-CYUFBKJQ.js';
3
+ import { publishSiteCredential } from './chunk-JRCNUUNG.js';
4
+ import { FleetHeartbeat } from './chunk-EHR4NIMX.js';
5
+ import { SignalBridge } from './chunk-AH4AXO4P.js';
6
6
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
7
7
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
8
8
  import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-24QZEO3Q.js';
@@ -33,23 +33,23 @@ function startEditBridge() {
33
33
  };
34
34
  }
35
35
  var LazyAnalyticsProvider = dynamic(
36
- () => import('./AnalyticsProvider-DJQA66AG.js').then((m) => ({ default: m.AnalyticsProvider })),
36
+ () => import('./AnalyticsProvider-BQXV3ZF3.js').then((m) => ({ default: m.AnalyticsProvider })),
37
37
  { ssr: false }
38
38
  );
39
39
  var LazySiteChat = dynamic(
40
- () => import('./SiteChat-EGEZJJVV.js').then((m) => ({ default: m.SiteChat })),
40
+ () => import('./SiteChat-DMPDXY3W.js').then((m) => ({ default: m.SiteChat })),
41
41
  { ssr: false }
42
42
  );
43
43
  var LazySitePopups = dynamic(
44
- () => import('./SitePopups-LQBIXIFV.js').then((m) => ({ default: m.SitePopups })),
44
+ () => import('./SitePopups-HD2LDKVU.js').then((m) => ({ default: m.SitePopups })),
45
45
  { ssr: false }
46
46
  );
47
47
  var LazySiteDesignReporter = dynamic(
48
- () => import('./SiteDesignReporter-YEEWJKWN.js').then((m) => ({ default: m.SiteDesignReporter })),
48
+ () => import('./SiteDesignReporter-Y2IOJE52.js').then((m) => ({ default: m.SiteDesignReporter })),
49
49
  { ssr: false }
50
50
  );
51
51
  var LazySitemapSync = dynamic(
52
- () => import('./SitemapSync-LSZ2EYOF.js').then((m) => ({ default: m.SitemapSync })),
52
+ () => import('./SitemapSync-OKPZHRX6.js').then((m) => ({ default: m.SitemapSync })),
53
53
  { ssr: false }
54
54
  );
55
55
  function SiteKitClientProviders({
@@ -7,7 +7,7 @@ import dynamic from 'next/dynamic';
7
7
  import { jsx } from 'react/jsx-runtime';
8
8
 
9
9
  var LazyChatWidget = dynamic(
10
- () => import('./ChatWidget-FHBAHFZX.js').then((m) => ({ default: m.ChatWidget })),
10
+ () => import('./ChatWidget-CDQZCLVH.js').then((m) => ({ default: m.ChatWidget })),
11
11
  { ssr: false }
12
12
  );
13
13
  function SiteChat(props) {
@@ -1,7 +1,7 @@
1
- import { getLLMsData, getOptimizedLLMsTxt } from './chunk-6U3VLV2C.js';
1
+ import { getLLMsData, getOptimizedLLMsTxt } from './chunk-4BHRA7TI.js';
2
2
  import { linkClassificationHost } from './chunk-L5UOHS6E.js';
3
3
  import { resolveArticleUrl } from './chunk-WMVK77ND.js';
4
- import { freshFetch } from './chunk-VX5CMNMM.js';
4
+ import { freshFetch } from './chunk-UAYAJPEP.js';
5
5
  import { LLM_GEO_CONTRACT_VERSION, sanitizePrimaryLanguageTag, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary } from './chunk-NZ4RXN3G.js';
6
6
  import { resolveTrailingSlash, applyTrailingSlash } from './chunk-YVKRYQRG.js';
7
7
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { publishSiteCredential } from '../chunk-VF4F5WXZ.js';
2
+ import { publishSiteCredential } from '../chunk-JRCNUUNG.js';
3
3
  export { useDeferredActivation } from '../chunk-YC7ELZS3.js';
4
4
  import '../chunk-FESKKJAS.js';
5
5
  import '../chunk-A4CC4ZG3.js';
@@ -7,8 +7,8 @@ export { trackConversion, trackEvent } from '../chunk-LCDVPAMR.js';
7
7
  export { VISUAL_VIEWPORT_GAP_PROPERTY, VisualViewportGap, useVisualViewportGap } from '../chunk-6T6CQVNL.js';
8
8
  export { getOrCreateSessionId, getOrCreateVisitorId, useSiteKitIdentity } from '../chunk-24QZEO3Q.js';
9
9
  import '../chunk-GJWI74ZZ.js';
10
- import '../chunk-WGG6GTKW.js';
11
- import '../chunk-56KNHB4U.js';
10
+ import '../chunk-GK7TV7EK.js';
11
+ import '../chunk-KHQ5GD6T.js';
12
12
  import '../chunk-PKBMQBKP.js';
13
13
 
14
14
  // src/client/SiteKitCredential.tsx
@@ -1,15 +1,15 @@
1
1
  'use client';
2
2
  import '../chunk-P5GB6NEO.js';
3
- import { useAnalyticsOptional } from '../chunk-MKMD2HJW.js';
3
+ import { useAnalyticsOptional } from '../chunk-CKW4HFJG.js';
4
4
  import '../chunk-LCDVPAMR.js';
5
5
  import '../chunk-24QZEO3Q.js';
6
6
  import '../chunk-L2V5PUFN.js';
7
7
  import '../chunk-GJWI74ZZ.js';
8
8
  import '../chunk-43OCZ3JA.js';
9
9
  import '../chunk-EKBEOXTH.js';
10
- import { sonorFetch } from '../chunk-BEBR4OJD.js';
11
- import '../chunk-WGG6GTKW.js';
12
- import '../chunk-56KNHB4U.js';
10
+ import { sonorFetch } from '../chunk-3E3PPSNR.js';
11
+ import '../chunk-GK7TV7EK.js';
12
+ import '../chunk-KHQ5GD6T.js';
13
13
  import '../chunk-PKBMQBKP.js';
14
14
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
15
15
  import React5, { useState, useEffect, useMemo, useRef, useCallback } from 'react';
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
  export { SONOR_PUBLIC_ECHO_DEFAULTS, getEchoWidgetProps } from '../chunk-HODO5BX5.js';
3
- export { ChatWidget } from '../chunk-O5RGXTWU.js';
4
- import { SiteChat } from '../chunk-RDPW4D33.js';
3
+ export { ChatWidget } from '../chunk-OOD6GMT4.js';
4
+ import { SiteChat } from '../chunk-YCFW2OQO.js';
5
5
  import '../chunk-6T6CQVNL.js';
6
6
  import '../chunk-JE4A5S4F.js';
7
- import { SitePopups } from '../chunk-YJLS6JBI.js';
7
+ import { SitePopups } from '../chunk-6LLTLLEJ.js';
8
8
  import '../chunk-27FISYK4.js';
9
- import '../chunk-EPT6FJUY.js';
9
+ import '../chunk-CSN45MHO.js';
10
10
  import '../chunk-Q6E4OPGG.js';
11
11
  import '../chunk-C2FZBUSS.js';
12
12
  import '../chunk-5SQK3D53.js';
@@ -18,9 +18,9 @@ import '../chunk-L2V5PUFN.js';
18
18
  import '../chunk-GJWI74ZZ.js';
19
19
  import '../chunk-43OCZ3JA.js';
20
20
  import '../chunk-EKBEOXTH.js';
21
- import '../chunk-BEBR4OJD.js';
22
- import '../chunk-WGG6GTKW.js';
23
- import '../chunk-56KNHB4U.js';
21
+ import '../chunk-3E3PPSNR.js';
22
+ import '../chunk-GK7TV7EK.js';
23
+ import '../chunk-KHQ5GD6T.js';
24
24
  import '../chunk-PKBMQBKP.js';
25
25
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
26
26
 
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { FLEET_HEARTBEAT_PATH, FleetHeartbeat, detectNextVersion, sendFleetHeartbeat } from '../chunk-UPRSH6Q4.js';
2
+ export { FLEET_HEARTBEAT_PATH, FleetHeartbeat, detectNextVersion, sendFleetHeartbeat } from '../chunk-EHR4NIMX.js';
3
3
  export { FLEET_CONTRACT_VERSION, FLEET_MODULES, FLEET_MODULES_MAX, FLEET_SITE_MAX_LENGTH, FLEET_VERSION_MAX_LENGTH, FLEET_VERSION_PATTERN, buildFleetHeartbeatPayload, isFleetModule, normalizeFleetModules, normalizeFleetSite, sanitizeFleetVersion } from '../chunk-ZTZQPYP6.js';
4
4
  import '../chunk-YC7ELZS3.js';
5
5
  import '../chunk-43OCZ3JA.js';
6
6
  import '../chunk-EKBEOXTH.js';
7
- import '../chunk-BEBR4OJD.js';
8
- import '../chunk-WGG6GTKW.js';
9
- import '../chunk-56KNHB4U.js';
7
+ import '../chunk-3E3PPSNR.js';
8
+ import '../chunk-GK7TV7EK.js';
9
+ import '../chunk-KHQ5GD6T.js';
10
10
  import '../chunk-PKBMQBKP.js';
@@ -1,13 +1,13 @@
1
1
  'use client';
2
2
  export { FormCelebration } from '../chunk-YGGDU6C3.js';
3
- export { FormClient, ManagedForm } from '../chunk-WGIDC6QP.js';
4
- import '../chunk-ZKHI4E2B.js';
3
+ export { FormClient, ManagedForm } from '../chunk-MDP7EB4J.js';
4
+ import '../chunk-ATE6IFVK.js';
5
5
  export { DatePicker } from '../chunk-SOD2F6C2.js';
6
- export { FormEnhancer } from '../chunk-MVR4FY5R.js';
6
+ export { FormEnhancer } from '../chunk-PF64OEXC.js';
7
7
  import '../chunk-YC7ELZS3.js';
8
8
  import '../chunk-DXO6SBMD.js';
9
9
  export { FormField as FormFieldComponent } from '../chunk-4NTBQNHA.js';
10
- export { useForm, useFormTracking } from '../chunk-EPT6FJUY.js';
10
+ export { useForm, useFormTracking } from '../chunk-CSN45MHO.js';
11
11
  import '../chunk-Q6E4OPGG.js';
12
12
  import '../chunk-C2FZBUSS.js';
13
13
  export { DEFAULT_FORM_SUCCESS_MESSAGE } from '../chunk-5SQK3D53.js';
@@ -15,9 +15,9 @@ import '../chunk-HW7B43E5.js';
15
15
  import '../chunk-NJCTQH2P.js';
16
16
  import '../chunk-L2V5PUFN.js';
17
17
  import '../chunk-GJWI74ZZ.js';
18
- import { sonorFetch } from '../chunk-BEBR4OJD.js';
19
- import '../chunk-WGG6GTKW.js';
20
- import '../chunk-56KNHB4U.js';
18
+ import { sonorFetch } from '../chunk-3E3PPSNR.js';
19
+ import '../chunk-GK7TV7EK.js';
20
+ import '../chunk-KHQ5GD6T.js';
21
21
  import '../chunk-PKBMQBKP.js';
22
22
 
23
23
  // src/forms/formsApi.ts
@@ -1,5 +1,5 @@
1
- export { ServerForm, getFormConfig } from '../chunk-XLSQTTUE.js';
2
- import '../chunk-MVR4FY5R.js';
1
+ export { ServerForm, getFormConfig } from '../chunk-FUQTV5O6.js';
2
+ import '../chunk-PF64OEXC.js';
3
3
  import '../chunk-YC7ELZS3.js';
4
4
  export { StaticForm } from '../chunk-ZTLMPUO6.js';
5
5
  import '../chunk-DXO6SBMD.js';
@@ -1,6 +1,6 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-ZHS2XFLV.js';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-DA5XC7Y6.js';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
3
- import '../chunk-BEBR4OJD.js';
4
- import '../chunk-WGG6GTKW.js';
5
- import '../chunk-56KNHB4U.js';
3
+ import '../chunk-3E3PPSNR.js';
4
+ import '../chunk-GK7TV7EK.js';
5
+ import '../chunk-KHQ5GD6T.js';
6
6
  import '../chunk-PKBMQBKP.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { SITE_KIT_VERSION } from './chunk-56KNHB4U.js';
1
+ export { SITE_KIT_VERSION } from './chunk-KHQ5GD6T.js';
2
2
  import './chunk-PKBMQBKP.js';
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-2AD3CDRR.js';
2
+ export { SiteKitClientProviders } from '../chunk-XEMHGJEG.js';
3
3
  import '../chunk-6G43IRWR.js';
4
- import '../chunk-VF4F5WXZ.js';
5
- import '../chunk-UPRSH6Q4.js';
4
+ import '../chunk-JRCNUUNG.js';
5
+ import '../chunk-EHR4NIMX.js';
6
6
  import '../chunk-ZTZQPYP6.js';
7
- import '../chunk-CYUFBKJQ.js';
7
+ import '../chunk-AH4AXO4P.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
9
  import '../chunk-FESKKJAS.js';
10
10
  import '../chunk-A4CC4ZG3.js';
@@ -12,7 +12,7 @@ import '../chunk-24QZEO3Q.js';
12
12
  import '../chunk-GJWI74ZZ.js';
13
13
  import '../chunk-43OCZ3JA.js';
14
14
  import '../chunk-EKBEOXTH.js';
15
- import '../chunk-BEBR4OJD.js';
16
- import '../chunk-WGG6GTKW.js';
17
- import '../chunk-56KNHB4U.js';
15
+ import '../chunk-3E3PPSNR.js';
16
+ import '../chunk-GK7TV7EK.js';
17
+ import '../chunk-KHQ5GD6T.js';
18
18
  import '../chunk-PKBMQBKP.js';
@@ -1,13 +1,13 @@
1
- import { SiteKitClientProviders } from '../chunk-2AD3CDRR.js';
1
+ import { SiteKitClientProviders } from '../chunk-XEMHGJEG.js';
2
2
  import '../chunk-6G43IRWR.js';
3
- import '../chunk-VF4F5WXZ.js';
4
- import '../chunk-UPRSH6Q4.js';
3
+ import '../chunk-JRCNUUNG.js';
4
+ import '../chunk-EHR4NIMX.js';
5
5
  import '../chunk-ZTZQPYP6.js';
6
6
  import { ManagedFavicon } from '../chunk-GW7GSBO7.js';
7
- import '../chunk-CYUFBKJQ.js';
7
+ import '../chunk-AH4AXO4P.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
- import { resolveClientCredential } from '../chunk-DNPNYWVL.js';
10
- import '../chunk-VX5CMNMM.js';
9
+ import { resolveClientCredential } from '../chunk-IE5SSOCN.js';
10
+ import '../chunk-UAYAJPEP.js';
11
11
  import { ManagedScripts } from '../chunk-MVLMXC44.js';
12
12
  import { resolveApiOrigin } from '../chunk-X6F6SO4S.js';
13
13
  import '../chunk-MH2DSGC6.js';
@@ -17,9 +17,9 @@ import '../chunk-24QZEO3Q.js';
17
17
  import '../chunk-GJWI74ZZ.js';
18
18
  import '../chunk-43OCZ3JA.js';
19
19
  import '../chunk-EKBEOXTH.js';
20
- import '../chunk-BEBR4OJD.js';
21
- import '../chunk-WGG6GTKW.js';
22
- import '../chunk-56KNHB4U.js';
20
+ import '../chunk-3E3PPSNR.js';
21
+ import '../chunk-GK7TV7EK.js';
22
+ import '../chunk-KHQ5GD6T.js';
23
23
  import '../chunk-PKBMQBKP.js';
24
24
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
25
25
 
@@ -1,19 +1,19 @@
1
- export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-WDQB4OXY.js';
1
+ export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-5O62CER4.js';
2
2
  export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-PO2TRJPY.js';
3
3
  export { AI_RETRIEVAL_CRAWLERS, AI_TRAINING_CRAWLERS, buildAiCrawlerRules, createRobotsTxtHandler } from '../chunk-QLTDFUJ7.js';
4
- export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-NI2XNEMR.js';
4
+ export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-XA2BNW5M.js';
5
5
  import '../chunk-XTRZGXB2.js';
6
6
  export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-PSAG45YF.js';
7
- export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-Z65DHMTW.js';
8
- export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-6U3VLV2C.js';
7
+ export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-ZTLU3BSW.js';
8
+ export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-4BHRA7TI.js';
9
9
  import '../chunk-L5UOHS6E.js';
10
10
  import '../chunk-WMVK77ND.js';
11
- import '../chunk-VX5CMNMM.js';
11
+ import '../chunk-UAYAJPEP.js';
12
12
  export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../chunk-NZ4RXN3G.js';
13
13
  import '../chunk-4KZ6W3ZH.js';
14
14
  import '../chunk-MJP63SSS.js';
15
15
  import '../chunk-YVKRYQRG.js';
16
16
  import '../chunk-FESKKJAS.js';
17
17
  import '../chunk-A4CC4ZG3.js';
18
- import '../chunk-56KNHB4U.js';
18
+ import '../chunk-KHQ5GD6T.js';
19
19
  import '../chunk-PKBMQBKP.js';
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { monotonicMs } from '../chunk-MH2DSGC6.js';
3
- import { sonorFetch } from '../chunk-BEBR4OJD.js';
4
- import '../chunk-WGG6GTKW.js';
5
- import '../chunk-56KNHB4U.js';
3
+ import { sonorFetch } from '../chunk-3E3PPSNR.js';
4
+ import '../chunk-GK7TV7EK.js';
5
+ import '../chunk-KHQ5GD6T.js';
6
6
  import '../chunk-PKBMQBKP.js';
7
7
  import { useState, useCallback, useEffect } from 'react';
8
8
  import { APIProvider, Map as Map$1, AdvancedMarker, Pin, InfoWindow } from '@vis.gl/react-google-maps';
package/dist/mcp/sonor.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { toolErrorResult } from '../chunk-FYAB6CXS.js';
2
2
  import { fetchReviews, fetchReviewStats } from '../chunk-EDYHROQ7.js';
3
3
  import { getOfferings } from '../chunk-G3NHWMP5.js';
4
- import { fetchBookingTypes, fetchAvailability } from '../chunk-2ECWEUHP.js';
5
- import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-6U3VLV2C.js';
6
- import { getFormConfig } from '../chunk-XLSQTTUE.js';
7
- import '../chunk-MVR4FY5R.js';
4
+ import { fetchBookingTypes, fetchAvailability } from '../chunk-MHGAZ3LL.js';
5
+ import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-4BHRA7TI.js';
6
+ import { getFormConfig } from '../chunk-FUQTV5O6.js';
7
+ import '../chunk-PF64OEXC.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
9
  import '../chunk-ZTLMPUO6.js';
10
10
  import '../chunk-DXO6SBMD.js';
@@ -13,7 +13,7 @@ import { getAllArticles, getArticle } from '../chunk-PKGN32AU.js';
13
13
  import '../chunk-Y3INC4QJ.js';
14
14
  import '../chunk-QXMIKDOL.js';
15
15
  import '../chunk-WMVK77ND.js';
16
- import { resolveFetch } from '../chunk-VX5CMNMM.js';
16
+ import { resolveFetch } from '../chunk-UAYAJPEP.js';
17
17
  import '../chunk-NZ4RXN3G.js';
18
18
  import '../chunk-VWWITFWM.js';
19
19
  import '../chunk-MJP63SSS.js';
@@ -25,9 +25,9 @@ import '../chunk-C2FZBUSS.js';
25
25
  import '../chunk-5SQK3D53.js';
26
26
  import '../chunk-HW7B43E5.js';
27
27
  import '../chunk-NJCTQH2P.js';
28
- import '../chunk-BEBR4OJD.js';
29
- import '../chunk-WGG6GTKW.js';
30
- import { SITE_KIT_VERSION } from '../chunk-56KNHB4U.js';
28
+ import '../chunk-3E3PPSNR.js';
29
+ import '../chunk-GK7TV7EK.js';
30
+ import { SITE_KIT_VERSION } from '../chunk-KHQ5GD6T.js';
31
31
  import '../chunk-PKBMQBKP.js';
32
32
  import 'server-only';
33
33
  import { after } from 'next/server.js';
@@ -8,4 +8,4 @@
8
8
  */
9
9
  import React from 'react';
10
10
  import type { TestimonialSectionProps } from './types';
11
- export declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): React.JSX.Element | null;
11
+ export declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, showPhoto, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): React.JSX.Element | null;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { VisualReviewCardProps, VisualReviewGalleryProps } from './types';
3
+ /** Static, server-renderable photo and review card. Review quotes are rendered verbatim. */
4
+ export declare function VisualReviewCard(props: VisualReviewCardProps): React.JSX.Element;
5
+ /** Responsive server-renderable gallery; reviews without photos keep their quote card. */
6
+ export declare function VisualReviewGallery({ reviews, title, subtitle, showRating, className }: VisualReviewGalleryProps): React.JSX.Element | null;
@@ -4,5 +4,6 @@
4
4
  * Display client reviews and testimonials on your website
5
5
  */
6
6
  export { TestimonialSection } from './TestimonialSection';
7
+ export { VisualReviewCard, VisualReviewGallery } from './VisualReviewCard';
7
8
  export { fetchReviews, fetchReviewStats } from './api';
8
- export type { Review, ReviewStats, TestimonialSectionProps } from './types';
9
+ export type { Review, ReviewPhoto, ReviewStats, TestimonialSectionProps, VisualReviewCardProps, VisualReviewGalleryProps } from './types';
@@ -1,4 +1,6 @@
1
- export { TestimonialSection } from '../chunk-BR4ZKUHH.js';
1
+ export { TestimonialSection } from '../chunk-7HPZSWS4.js';
2
+ export { VisualReviewCard, VisualReviewGallery } from '../chunk-OD2ULW5Z.js';
3
+ import '../chunk-CAT235HY.js';
2
4
  export { fetchReviewStats, fetchReviews } from '../chunk-EDYHROQ7.js';
3
5
  import '../chunk-MH2DSGC6.js';
4
6
  import '../chunk-PKBMQBKP.js';
@@ -0,0 +1,2 @@
1
+ /** Public review photos must be ordinary HTTPS images, never inline or script URLs. */
2
+ export declare function reviewPhotoUrl(value: unknown): string | undefined;
@@ -1,9 +1,10 @@
1
1
  /**
2
- * @sonordev/site-kit/reputation/server - Server-safe API functions
2
+ * @sonordev/site-kit/reputation/server - Server-safe review feed and visual cards
3
3
  *
4
4
  * Use this entry point from React Server Components or any server-side context.
5
5
  * Importing from `./reputation` (which includes TestimonialSection) pulls in a
6
6
  * client-tainted bundle that can't be called from RSC.
7
7
  */
8
8
  export { fetchReviews, fetchReviewStats } from './api';
9
- export type { Review, ReviewStats, TestimonialSectionProps } from './types';
9
+ export { VisualReviewCard, VisualReviewGallery } from './VisualReviewCard';
10
+ export type { Review, ReviewPhoto, ReviewStats, TestimonialSectionProps, VisualReviewCardProps, VisualReviewGalleryProps } from './types';
@@ -1,3 +1,5 @@
1
+ export { VisualReviewCard, VisualReviewGallery } from '../chunk-OD2ULW5Z.js';
2
+ import '../chunk-CAT235HY.js';
1
3
  export { fetchReviewStats, fetchReviews } from '../chunk-EDYHROQ7.js';
2
4
  import '../chunk-MH2DSGC6.js';
3
5
  import '../chunk-PKBMQBKP.js';
@@ -8,11 +8,31 @@ export interface Review {
8
8
  role?: string;
9
9
  rating: number;
10
10
  image?: string;
11
+ /** A business-supplied work/property photo. `image` remains the reviewer avatar. */
12
+ photo?: ReviewPhoto | null;
11
13
  date?: string;
12
14
  platform?: string;
13
15
  isFeatured?: boolean;
14
16
  serviceTags?: string[];
15
17
  }
18
+ export interface ReviewPhoto {
19
+ fileId: string;
20
+ url: string;
21
+ altText: string;
22
+ caption: string;
23
+ }
24
+ export interface VisualReviewCardProps {
25
+ review: Review;
26
+ showRating?: boolean;
27
+ className?: string;
28
+ }
29
+ export interface VisualReviewGalleryProps {
30
+ reviews: Review[];
31
+ title?: string;
32
+ subtitle?: string;
33
+ showRating?: boolean;
34
+ className?: string;
35
+ }
16
36
  export interface ReviewStats {
17
37
  total_reviews: number;
18
38
  average_rating: number;
@@ -30,6 +50,8 @@ export interface TestimonialSectionProps {
30
50
  autoplay?: boolean;
31
51
  autoplayInterval?: number;
32
52
  showRating?: boolean;
53
+ /** Show attached business photos above the quote. Defaults to true. */
54
+ showPhoto?: boolean;
33
55
  maxReviews?: number;
34
56
  featuredOnly?: boolean;
35
57
  service?: string;
@@ -1,7 +1,7 @@
1
- import { createSeoRevalidationHandler } from '../chunk-NI2XNEMR.js';
1
+ import { createSeoRevalidationHandler } from '../chunk-XA2BNW5M.js';
2
2
  import '../chunk-XTRZGXB2.js';
3
3
  export { SITE_CACHE_TAGS, SITE_REVALIDATE_PATH, isSiteRevalidatePong } from '../chunk-RYVDGXC2.js';
4
- import '../chunk-56KNHB4U.js';
4
+ import '../chunk-KHQ5GD6T.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
 
7
7
  // src/revalidate/index.ts