@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,9 +1,9 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-T4DLETKR.js';
2
+ export { SitemapSync } from '../chunk-D2RGEWHS.js';
3
3
  import '../chunk-YVKRYQRG.js';
4
4
  import '../chunk-43OCZ3JA.js';
5
5
  import '../chunk-EKBEOXTH.js';
6
- import '../chunk-BEBR4OJD.js';
7
- import '../chunk-WGG6GTKW.js';
8
- import '../chunk-56KNHB4U.js';
6
+ import '../chunk-3E3PPSNR.js';
7
+ import '../chunk-GK7TV7EK.js';
8
+ import '../chunk-KHQ5GD6T.js';
9
9
  import '../chunk-PKBMQBKP.js';
package/dist/seo/index.js CHANGED
@@ -2,7 +2,7 @@ export { ManagedNoScripts, ManagedScripts } from '../chunk-MVLMXC44.js';
2
2
  import { pickManagedLlmSchemaForJsonLd } from '../chunk-NZ4RXN3G.js';
3
3
  import { safeJsonLd } from '../chunk-4KZ6W3ZH.js';
4
4
  import { withoutSchemaPlaceholders } from '../chunk-VWWITFWM.js';
5
- export { SitemapSync } from '../chunk-T4DLETKR.js';
5
+ export { SitemapSync } from '../chunk-D2RGEWHS.js';
6
6
  import { getManagedMetadata } from '../chunk-4YTYGG2C.js';
7
7
  export { generateSitemap, getABVariant, getManagedMetadata, getManagedMetadataWithAB, getRedirect, getRobotsDirective, isIndexable } from '../chunk-4YTYGG2C.js';
8
8
  import { getContentBlock, getSchemaMarkups, getSEOPageData, getEntityEnhancedSchema, getFAQData, getInternalLinks, getEntities, pruneSchemaTypes } from '../chunk-662ILEZ6.js';
@@ -18,9 +18,9 @@ import '../chunk-FESKKJAS.js';
18
18
  import '../chunk-A4CC4ZG3.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 { Suspense } from 'react';
26
26
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
package/dist/seo/llms.js CHANGED
@@ -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';
@@ -458,7 +458,7 @@ async function registerLocalSitemap(options) {
458
458
  }
459
459
  if (options.writeLlms && result.success) {
460
460
  try {
461
- const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-2NQVDGYI.js');
461
+ const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-OL4KQERZ.js');
462
462
  const written = await writeLLMsTxtToPublic({
463
463
  // Resolved here too: the sync's own `site` is scoped to the branch that
464
464
  // posts, and this runs on the skip path as well.
@@ -1,10 +1,10 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-Y6LP36UW.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-4DJMJ4V5.js';
2
2
  import '../chunk-Z22QVHT4.js';
3
- import '../chunk-Z65DHMTW.js';
4
- import '../chunk-6U3VLV2C.js';
3
+ import '../chunk-ZTLU3BSW.js';
4
+ import '../chunk-4BHRA7TI.js';
5
5
  import '../chunk-L5UOHS6E.js';
6
6
  import '../chunk-WMVK77ND.js';
7
- import '../chunk-VX5CMNMM.js';
7
+ import '../chunk-UAYAJPEP.js';
8
8
  import '../chunk-NZ4RXN3G.js';
9
9
  import '../chunk-MJP63SSS.js';
10
10
  import '../chunk-ZEGVKVD5.js';
@@ -1,6 +1,6 @@
1
- export { resolveClientCredential } from '../chunk-DNPNYWVL.js';
2
- import '../chunk-VX5CMNMM.js';
1
+ export { resolveClientCredential } from '../chunk-IE5SSOCN.js';
2
+ import '../chunk-UAYAJPEP.js';
3
3
  export { requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch } from '../chunk-X6F6SO4S.js';
4
4
  import '../chunk-MH2DSGC6.js';
5
- import '../chunk-56KNHB4U.js';
5
+ import '../chunk-KHQ5GD6T.js';
6
6
  import '../chunk-PKBMQBKP.js';
@@ -39,8 +39,7 @@
39
39
  * realistic redeploy gap; marketing sites routinely go many months untouched.
40
40
  */
41
41
  import 'server-only';
42
- import { resolveFetch } from '../shared/fresh-fetch';
43
- export { resolveFetch };
42
+ export { resolveFetch } from '../shared/fresh-fetch';
44
43
  /**
45
44
  * Next signals "this render must go dynamic" by THROWING (DynamicServerError,
46
45
  * static-gen bailout, redirect/notFound digests, React's postpone). Those are
@@ -2,9 +2,9 @@
2
2
  * @sonordev/site-kit shared - Fetch outside Next's Data Cache
3
3
  *
4
4
  * Single source of truth for requests that must not touch Next's Data Cache
5
- * and must not change how the calling route renders. Used by the build-time
6
- * writers (public/llms.txt, the sitemap's Sonor reads) and the site credential
7
- * mint (server/mint-site-token.ts). Don't re-fork this into a module.
5
+ * and must not change how the calling route renders. Used by build-time
6
+ * writers and the site credential mint. The mint uses trackedFreshFetch so
7
+ * Cache Components can await it without an uncached prerender bailout.
8
8
  *
9
9
  * Next.js monkey-patches `globalThis.fetch` so every call joins its Data Cache
10
10
  * and static-generation tracking. That's wrong for these requests, and the
@@ -38,6 +38,12 @@ export declare function resolveFetch(): {
38
38
  unpatched: boolean;
39
39
  };
40
40
  export declare const FRESH_FETCH_NONCE_HEADER = "x-sitekit-build-nonce";
41
+ /**
42
+ * A fresh request that Next can await during a Cache Components prerender.
43
+ * A unique cache key per request prevents reuse after a credential expires or
44
+ * across deploys. The caller owns memoization and concurrent-request deduping.
45
+ */
46
+ export declare function trackedFreshFetch(input: string | URL, init?: RequestInit): Promise<Response>;
41
47
  /**
42
48
  * Fetch that never reads a response cached by an earlier build.
43
49
  *
@@ -7,4 +7,4 @@
7
7
  * it matches package.json at publish time, and version.test.ts asserts it in
8
8
  * dev, so it can't silently drift.
9
9
  */
10
- export declare const SITE_KIT_VERSION = "7.3.0";
10
+ export declare const SITE_KIT_VERSION = "7.4.0";
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useSignalExperiment, useSignalEvent } from '../chunk-CYUFBKJQ.js';
3
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-CYUFBKJQ.js';
2
+ import { useSignalExperiment, useSignalEvent } from '../chunk-AH4AXO4P.js';
3
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-AH4AXO4P.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
5
  import React, { useEffect } from 'react';
6
6
  import { jsx, Fragment } from 'react/jsx-runtime';
@@ -1,10 +1,10 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-Y6LP36UW.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-4DJMJ4V5.js';
2
2
  import '../chunk-Z22QVHT4.js';
3
- import '../chunk-Z65DHMTW.js';
4
- import '../chunk-6U3VLV2C.js';
3
+ import '../chunk-ZTLU3BSW.js';
4
+ import '../chunk-4BHRA7TI.js';
5
5
  import '../chunk-L5UOHS6E.js';
6
6
  import '../chunk-WMVK77ND.js';
7
- import '../chunk-VX5CMNMM.js';
7
+ import '../chunk-UAYAJPEP.js';
8
8
  import '../chunk-NZ4RXN3G.js';
9
9
  import '../chunk-MJP63SSS.js';
10
10
  import '../chunk-ZEGVKVD5.js';
@@ -1,6 +1,6 @@
1
- export { BookingWidget } from '../chunk-L7U23XI2.js';
2
- export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-2ECWEUHP.js';
3
- import '../chunk-BEBR4OJD.js';
4
- import '../chunk-WGG6GTKW.js';
5
- import '../chunk-56KNHB4U.js';
1
+ export { BookingWidget } from '../chunk-AV4QAK5F.js';
2
+ export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-MHGAZ3LL.js';
3
+ import '../chunk-3E3PPSNR.js';
4
+ import '../chunk-GK7TV7EK.js';
5
+ import '../chunk-KHQ5GD6T.js';
6
6
  import '../chunk-PKBMQBKP.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';
@@ -1,13 +1,13 @@
1
1
  'use client';
2
- export { SiteDesignReporter } from '../chunk-MRQ2U4LZ.js';
3
- export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-I2YX3HVD.js';
2
+ export { SiteDesignReporter } from '../chunk-PQDJNIHR.js';
3
+ export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-CG4ETW5Y.js';
4
4
  export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-BF7TZYC3.js';
5
5
  import '../chunk-IHG36STL.js';
6
6
  import '../chunk-YC7ELZS3.js';
7
7
  import '../chunk-S22FSH7C.js';
8
8
  import '../chunk-43OCZ3JA.js';
9
9
  import '../chunk-EKBEOXTH.js';
10
- import '../chunk-BEBR4OJD.js';
11
- import '../chunk-WGG6GTKW.js';
12
- import '../chunk-56KNHB4U.js';
10
+ import '../chunk-3E3PPSNR.js';
11
+ import '../chunk-GK7TV7EK.js';
12
+ import '../chunk-KHQ5GD6T.js';
13
13
  import '../chunk-PKBMQBKP.js';
@@ -1,14 +1,14 @@
1
1
  'use client';
2
2
  export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-BF7TZYC3.js';
3
3
  import '../chunk-IHG36STL.js';
4
- export { SitePopups } from '../chunk-YJLS6JBI.js';
4
+ export { SitePopups } from '../chunk-6LLTLLEJ.js';
5
5
  import '../chunk-27FISYK4.js';
6
6
  import '../chunk-S22FSH7C.js';
7
7
  import '../chunk-24QZEO3Q.js';
8
8
  import '../chunk-GJWI74ZZ.js';
9
9
  import '../chunk-43OCZ3JA.js';
10
10
  import '../chunk-EKBEOXTH.js';
11
- import '../chunk-BEBR4OJD.js';
12
- import '../chunk-WGG6GTKW.js';
13
- import '../chunk-56KNHB4U.js';
11
+ import '../chunk-3E3PPSNR.js';
12
+ import '../chunk-GK7TV7EK.js';
13
+ import '../chunk-KHQ5GD6T.js';
14
14
  import '../chunk-PKBMQBKP.js';
@@ -1,8 +1,8 @@
1
- export { writeLLMsTxtToPublic } from './chunk-Z65DHMTW.js';
2
- import './chunk-6U3VLV2C.js';
1
+ export { writeLLMsTxtToPublic } from './chunk-ZTLU3BSW.js';
2
+ import './chunk-4BHRA7TI.js';
3
3
  import './chunk-L5UOHS6E.js';
4
4
  import './chunk-WMVK77ND.js';
5
- import './chunk-VX5CMNMM.js';
5
+ import './chunk-UAYAJPEP.js';
6
6
  import './chunk-NZ4RXN3G.js';
7
7
  import './chunk-MJP63SSS.js';
8
8
  import './chunk-YVKRYQRG.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonordev/site-kit",
3
- "version": "7.3.0",
3
+ "version": "7.4.0",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@11.5.3",
6
6
  "description": "Complete client-side integration kit for Sonor - SEO, Analytics, Engage, Forms, Blog",
@@ -27,6 +27,7 @@ interface TestimonialSectionProps {
27
27
  autoplay?: boolean // Auto-rotate reviews
28
28
  autoplayInterval?: number // ms between rotations
29
29
  showRating?: boolean // Display star ratings
30
+ showPhoto?: boolean // Show attached business photo (default true)
30
31
  maxReviews?: number // Limit displayed count
31
32
  featuredOnly?: boolean // Show featured reviews only
32
33
  service?: string // Filter by service tag
@@ -34,6 +35,29 @@ interface TestimonialSectionProps {
34
35
  }
35
36
  ```
36
37
 
38
+ ## Visual review cards
39
+
40
+ Render a photo and its original review together with a responsive, server-rendered gallery:
41
+
42
+ ```tsx
43
+ import { fetchReviews, VisualReviewGallery } from '@sonordev/site-kit/reputation/server'
44
+
45
+ export default async function ReviewsPage() {
46
+ const reviews = await fetchReviews({ limit: 12 })
47
+ return <VisualReviewGallery reviews={reviews} title="What Our Clients Say" />
48
+ }
49
+ ```
50
+
51
+ `VisualReviewCard` accepts one `review`, optional `showRating` and `className`.
52
+ `VisualReviewGallery` accepts `reviews`, optional `title`, `subtitle`, `showRating`
53
+ and `className`. Both use the site's `--sk-*` brand tokens and work in React
54
+ Server Components. Import `@sonordev/site-kit/brand.css` once for token defaults,
55
+ then override them in your site's CSS.
56
+
57
+ Text-only reviews stay visible while a photo is pending. Adding or removing a
58
+ photo in Sonor updates the public review feed; `image` continues to mean the
59
+ reviewer's avatar. Only HTTPS photo URLs are displayed.
60
+
37
61
  ## API Functions
38
62
 
39
63
  ```ts
@@ -50,6 +74,7 @@ interface Review {
50
74
  id: string; quote: string; name: string; role?: string;
51
75
  rating: number; image?: string; date?: string;
52
76
  platform?: string; isFeatured?: boolean; serviceTags?: string[];
77
+ photo?: { fileId: string; url: string; altText: string; caption: string } | null;
53
78
  }
54
79
 
55
80
  interface ReviewStats {
@@ -1,8 +0,0 @@
1
- export { SitemapSync } from './chunk-T4DLETKR.js';
2
- import './chunk-YVKRYQRG.js';
3
- import './chunk-43OCZ3JA.js';
4
- import './chunk-EKBEOXTH.js';
5
- import './chunk-BEBR4OJD.js';
6
- import './chunk-WGG6GTKW.js';
7
- import './chunk-56KNHB4U.js';
8
- import './chunk-PKBMQBKP.js';