@sonordev/site-kit 8.0.1 → 8.2.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 (90) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/agent-manifest.json +1 -1
  3. package/dist/{AnalyticsProvider-EGCZ2MVM.js → AnalyticsProvider-6TAA3XYB.js} +4 -4
  4. package/dist/{ArticleViewTracker-ATNVMT45.js → ArticleViewTracker-H4N7YCLC.js} +3 -3
  5. package/dist/{BlocksPopup-F636XNO4.js → BlocksPopup-FJT5YQD3.js} +4 -4
  6. package/dist/{ChatWidget-EQTLKPJX.js → ChatWidget-THQHHTAA.js} +5 -5
  7. package/dist/{FileField-BUD2YGN5.js → FileField-OZXXJGUM.js} +3 -3
  8. package/dist/{FormSpotlight-NGH56TGC.js → FormSpotlight-MLDJS246.js} +1 -1
  9. package/dist/{FormStage-XZRC54SY.js → FormStage-6RVY7M3R.js} +1 -1
  10. package/dist/{ManagedForm-CQDQ4CUN.js → ManagedForm-3VV54RVH.js} +6 -6
  11. package/dist/{ManagedNewsletterForm-KCN3BTKA.js → ManagedNewsletterForm-RTJDGMGG.js} +4 -4
  12. package/dist/{SignalCore-RDQPM2L2.js → SignalCore-T7ZOCA44.js} +3 -3
  13. package/dist/{SiteChat-QBDOQ5ZZ.js → SiteChat-JSHPGAE3.js} +1 -1
  14. package/dist/{SiteDesignReporter-426TUCUF.js → SiteDesignReporter-L2JBAKKK.js} +5 -5
  15. package/dist/{SitePopups-KLUD6XIE.js → SitePopups-K6ADAWFK.js} +4 -4
  16. package/dist/{SitemapSync-QOIMV5GO.js → SitemapSync-VV2YSMIW.js} +4 -4
  17. package/dist/_client/booking-widget.js +5 -5
  18. package/dist/affiliates/index.js +3 -3
  19. package/dist/analytics/index.js +4 -4
  20. package/dist/{article-styles-6CM5FUMV.js → article-styles-GFXJJDLE.js} +2 -0
  21. package/dist/articles/article-photos.d.ts +9 -0
  22. package/dist/articles/index.d.ts +1 -0
  23. package/dist/articles/index.js +1 -1
  24. package/dist/articles/server-core.d.ts +2 -0
  25. package/dist/articles/server-ui.d.ts +2 -0
  26. package/dist/articles/server-ui.js +7 -5
  27. package/dist/articles/server.d.ts +2 -0
  28. package/dist/articles/server.js +2 -1
  29. package/dist/articles/types.d.ts +17 -0
  30. package/dist/chat/index.js +6 -6
  31. package/dist/{chunk-IY6G67EF.js → chunk-3EU6S5YC.js} +1 -1
  32. package/dist/{chunk-M62U7TJF.js → chunk-575L73NT.js} +1 -1
  33. package/dist/{chunk-OE3NXEOF.js → chunk-57K4GW3D.js} +1 -1
  34. package/dist/{chunk-6KUCA5HG.js → chunk-5ZCY36TY.js} +1 -1
  35. package/dist/{chunk-Z6PVFZRI.js → chunk-66G47P5C.js} +1 -1
  36. package/dist/{chunk-55JLUMAC.js → chunk-727R7C5R.js} +2 -2
  37. package/dist/{chunk-6BXUSAOJ.js → chunk-7FSB2EXS.js} +1 -1
  38. package/dist/{chunk-VQQV7FOX.js → chunk-BQZPHICL.js} +1 -1
  39. package/dist/{chunk-OCKGB734.js → chunk-EBILJHUF.js} +1 -1
  40. package/dist/{chunk-XPTJRVL2.js → chunk-FQUGGPBM.js} +3 -2
  41. package/dist/{chunk-B7QRRLTU.js → chunk-FVXFLVXF.js} +2 -2
  42. package/dist/{chunk-7BSC6HF3.js → chunk-GWP2VBFH.js} +3 -3
  43. package/dist/{chunk-CAF53GKN.js → chunk-H4R2GPAB.js} +1 -1
  44. package/dist/chunk-HUBMKTPW.js +131 -0
  45. package/dist/{chunk-EE6IG5GK.js → chunk-I6QFPSUU.js} +8 -8
  46. package/dist/{chunk-NKFRW2VB.js → chunk-JBEUZJS3.js} +2 -2
  47. package/dist/{chunk-JCFQGEG7.js → chunk-JC2VS2SB.js} +1 -1
  48. package/dist/{chunk-AGJODJ4V.js → chunk-NNEIBXGU.js} +1 -1
  49. package/dist/{chunk-S5G3A7OZ.js → chunk-Q72M5KBS.js} +1 -1
  50. package/dist/{chunk-GMXY2OOY.js → chunk-SMYX3AAO.js} +1 -1
  51. package/dist/{chunk-J6N5DCGW.js → chunk-WBC5B3JD.js} +2 -2
  52. package/dist/{chunk-FIGIJK5F.js → chunk-WK3N3Y7V.js} +1 -1
  53. package/dist/{chunk-5GB2HHVJ.js → chunk-WSNG2K3T.js} +2 -2
  54. package/dist/{chunk-Z4MK4VOG.js → chunk-WYZ4OUON.js} +1 -1
  55. package/dist/{chunk-DWNS6ZJM.js → chunk-X7VKRHFF.js} +1 -1
  56. package/dist/{chunk-YGXWG54S.js → chunk-XWIRU6UT.js} +1 -1
  57. package/dist/{chunk-3222QBUS.js → chunk-YBAFUM3Z.js} +1 -1
  58. package/dist/{chunk-H3SDOSVU.js → chunk-ZM2FNWIQ.js} +1 -1
  59. package/dist/client/index.js +3 -3
  60. package/dist/contracts/editorial-media.d.ts +39 -0
  61. package/dist/contracts/entries.d.ts +1 -1
  62. package/dist/fleet/index.js +4 -4
  63. package/dist/forms/index.js +7 -7
  64. package/dist/forms/server.js +2 -2
  65. package/dist/images/index.js +4 -4
  66. package/dist/index.js +1 -1
  67. package/dist/layout/client.js +7 -7
  68. package/dist/layout/index.js +8 -8
  69. package/dist/llms/index.js +4 -4
  70. package/dist/maps/index.js +3 -3
  71. package/dist/mcp/sonor.js +11 -9
  72. package/dist/revalidate/index.js +2 -2
  73. package/dist/runtime/index.js +3 -3
  74. package/dist/seo/client.js +4 -4
  75. package/dist/seo/index.js +4 -4
  76. package/dist/seo/llms.js +4 -4
  77. package/dist/seo/register-sitemap-cli.js +1 -1
  78. package/dist/seo/sitemap.js +2 -2
  79. package/dist/server/index.js +2 -2
  80. package/dist/shared/version.d.ts +1 -1
  81. package/dist/signal/index.js +2 -2
  82. package/dist/sitemap/index.js +2 -2
  83. package/dist/sync/index.js +5 -5
  84. package/dist/website/images.js +4 -4
  85. package/dist/website/index.js +5 -5
  86. package/dist/website/popups.js +4 -4
  87. package/dist/{writeLLMsTxt-UZGN6IBU.js → writeLLMsTxt-DGKLYXIW.js} +1 -1
  88. package/package.json +1 -1
  89. package/src/articles/README.md +33 -0
  90. /package/dist/{chunk-TZ5RTANX.js → chunk-WACWV5EP.js} +0 -0
package/dist/mcp/sonor.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { fetchReviews, fetchReviewStats } from '../chunk-NFRJTOTB.js';
2
2
  import { toolErrorResult } from '../chunk-FYAB6CXS.js';
3
- import { fetchBookingTypes, fetchAvailability } from '../chunk-YGXWG54S.js';
3
+ import { fetchBookingTypes, fetchAvailability } from '../chunk-XWIRU6UT.js';
4
4
  import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-JIH32RH2.js';
5
- import { getFormConfig } from '../chunk-VQQV7FOX.js';
6
- import '../chunk-GMXY2OOY.js';
5
+ import { getFormConfig } from '../chunk-BQZPHICL.js';
6
+ import '../chunk-SMYX3AAO.js';
7
7
  import '../chunk-C2FZBUSS.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
9
  import '../chunk-LNSF6BJC.js';
@@ -12,7 +12,8 @@ import '../chunk-TYAVHRWH.js';
12
12
  import '../chunk-5SQK3D53.js';
13
13
  import '../chunk-HW7B43E5.js';
14
14
  import '../chunk-NJCTQH2P.js';
15
- import { getAllArticles, getArticle } from '../chunk-XPTJRVL2.js';
15
+ import { getAllArticles, getArticle } from '../chunk-FQUGGPBM.js';
16
+ import '../chunk-HUBMKTPW.js';
16
17
  import '../chunk-Y3INC4QJ.js';
17
18
  import '../chunk-QXMIKDOL.js';
18
19
  import '../chunk-WMVK77ND.js';
@@ -25,9 +26,9 @@ import '../chunk-MH2DSGC6.js';
25
26
  import { resolveSiteHost } from '../chunk-FESKKJAS.js';
26
27
  import '../chunk-A4CC4ZG3.js';
27
28
  import '../chunk-3G7YABRA.js';
28
- import '../chunk-55JLUMAC.js';
29
- import '../chunk-IY6G67EF.js';
30
- import { SITE_KIT_VERSION } from '../chunk-S5G3A7OZ.js';
29
+ import '../chunk-727R7C5R.js';
30
+ import '../chunk-3EU6S5YC.js';
31
+ import { SITE_KIT_VERSION } from '../chunk-Q72M5KBS.js';
31
32
  import '../chunk-PKBMQBKP.js';
32
33
  import 'server-only';
33
34
  import { after } from 'next/server.js';
@@ -225,7 +226,7 @@ function getArticleTool(ctx, basePath) {
225
226
  return {
226
227
  name: "get_article",
227
228
  title: "Read an article",
228
- description: "One article in full, by the slug list_articles returned. Cite it by its URL.",
229
+ description: "One article in full, with approved supporting photo descriptions and section placements, by the slug list_articles returned. Cite it by its URL. Photo captions describe context; they do not verify claims beyond the article.",
229
230
  inputSchema: {
230
231
  type: "object",
231
232
  properties: { slug: { type: "string", description: "The article slug from list_articles." } },
@@ -247,7 +248,8 @@ function getArticleTool(ctx, basePath) {
247
248
  published_at: post.published_at,
248
249
  content: content.slice(0, ARTICLE_CONTENT_MAX),
249
250
  truncated: content.length > ARTICLE_CONTENT_MAX,
250
- faq: post.faq_items
251
+ faq: post.faq_items,
252
+ editorial_photos: post.editorial_photos?.slice(0, 8).map(({ url, alt, caption, width, height, placement }) => ({ url, alt, caption, width, height, placement }))
251
253
  };
252
254
  }
253
255
  };
@@ -1,7 +1,7 @@
1
- import { createSeoRevalidationHandler } from '../chunk-DWNS6ZJM.js';
1
+ import { createSeoRevalidationHandler } from '../chunk-X7VKRHFF.js';
2
2
  import '../chunk-XTRZGXB2.js';
3
3
  export { SITE_CACHE_TAGS, SITE_REVALIDATE_PATH, isSiteRevalidatePong } from '../chunk-6KU7STM3.js';
4
- import '../chunk-S5G3A7OZ.js';
4
+ import '../chunk-Q72M5KBS.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
 
7
7
  // src/revalidate/index.ts
@@ -1,7 +1,7 @@
1
1
  export { readAnalyticsIdentity } from '../chunk-5ROTTMBL.js';
2
2
  import '../chunk-5TM3WPCI.js';
3
3
  export { DEFAULT_SONOR_API_URL, getClientApiConfig, readPublishedApiConfig } from '../chunk-3G7YABRA.js';
4
- export { sonorFetch } from '../chunk-55JLUMAC.js';
5
- import '../chunk-IY6G67EF.js';
6
- import '../chunk-S5G3A7OZ.js';
4
+ export { sonorFetch } from '../chunk-727R7C5R.js';
5
+ import '../chunk-3EU6S5YC.js';
6
+ import '../chunk-Q72M5KBS.js';
7
7
  import '../chunk-PKBMQBKP.js';
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-FIGIJK5F.js';
2
+ export { SitemapSync } from '../chunk-WK3N3Y7V.js';
3
3
  import '../chunk-YVKRYQRG.js';
4
4
  import '../chunk-CAH4Y4PY.js';
5
5
  import '../chunk-EKBEOXTH.js';
6
6
  import '../chunk-3G7YABRA.js';
7
- import '../chunk-55JLUMAC.js';
8
- import '../chunk-IY6G67EF.js';
9
- import '../chunk-S5G3A7OZ.js';
7
+ import '../chunk-727R7C5R.js';
8
+ import '../chunk-3EU6S5YC.js';
9
+ import '../chunk-Q72M5KBS.js';
10
10
  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-FIGIJK5F.js';
5
+ export { SitemapSync } from '../chunk-WK3N3Y7V.js';
6
6
  import { getManagedMetadata, mergeAlternates } from '../chunk-URJN75ZG.js';
7
7
  export { generateSitemap, getABVariant, getManagedMetadata, getManagedMetadataWithAB, getRedirect, getRobotsDirective, isIndexable } from '../chunk-URJN75ZG.js';
8
8
  import { getSchemaMarkups, getSEOPageData, getEntityEnhancedSchema, getFAQData, getInternalLinks, pruneSchemaTypes } from '../chunk-Y35BWW2C.js';
@@ -19,9 +19,9 @@ import '../chunk-A4CC4ZG3.js';
19
19
  import '../chunk-CAH4Y4PY.js';
20
20
  import '../chunk-EKBEOXTH.js';
21
21
  import '../chunk-3G7YABRA.js';
22
- import '../chunk-55JLUMAC.js';
23
- import '../chunk-IY6G67EF.js';
24
- import '../chunk-S5G3A7OZ.js';
22
+ import '../chunk-727R7C5R.js';
23
+ import '../chunk-3EU6S5YC.js';
24
+ import '../chunk-Q72M5KBS.js';
25
25
  import '../chunk-PKBMQBKP.js';
26
26
  import { Suspense } from 'react';
27
27
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
package/dist/seo/llms.js CHANGED
@@ -1,10 +1,10 @@
1
- export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-M62U7TJF.js';
1
+ export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-575L73NT.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-DWNS6ZJM.js';
4
+ export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-X7VKRHFF.js';
5
5
  export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-PSAG45YF.js';
6
6
  import '../chunk-XTRZGXB2.js';
7
- export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-TZ5RTANX.js';
7
+ export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-WACWV5EP.js';
8
8
  export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-JIH32RH2.js';
9
9
  import '../chunk-L5UOHS6E.js';
10
10
  import '../chunk-WMVK77ND.js';
@@ -16,5 +16,5 @@ import '../chunk-YVKRYQRG.js';
16
16
  import '../chunk-FESKKJAS.js';
17
17
  import '../chunk-A4CC4ZG3.js';
18
18
  import '../chunk-3G7YABRA.js';
19
- import '../chunk-S5G3A7OZ.js';
19
+ import '../chunk-Q72M5KBS.js';
20
20
  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-UZGN6IBU.js');
461
+ const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-DGKLYXIW.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,5 +1,5 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-OE3NXEOF.js';
2
- import '../chunk-TZ5RTANX.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-57K4GW3D.js';
2
+ import '../chunk-WACWV5EP.js';
3
3
  import '../chunk-JIH32RH2.js';
4
4
  import '../chunk-Z22QVHT4.js';
5
5
  import '../chunk-L5UOHS6E.js';
@@ -1,7 +1,7 @@
1
- export { resolveClientCredential } from '../chunk-H3SDOSVU.js';
1
+ export { resolveClientCredential } from '../chunk-ZM2FNWIQ.js';
2
2
  import '../chunk-UAYAJPEP.js';
3
3
  export { SITE_CACHE_TAGS } from '../chunk-6KU7STM3.js';
4
4
  export { isNextControlFlow, requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch } from '../chunk-C7TLGL3R.js';
5
5
  import '../chunk-MH2DSGC6.js';
6
- import '../chunk-S5G3A7OZ.js';
6
+ import '../chunk-Q72M5KBS.js';
7
7
  import '../chunk-PKBMQBKP.js';
@@ -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 = "8.0.1";
10
+ export declare const SITE_KIT_VERSION = "8.2.0";
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useSignalExperiment, useSignalEvent } from '../chunk-Z4MK4VOG.js';
3
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-Z4MK4VOG.js';
2
+ import { useSignalExperiment, useSignalEvent } from '../chunk-WYZ4OUON.js';
3
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-WYZ4OUON.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
5
  import React, { useEffect } from 'react';
6
6
  import { jsx, Fragment } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-OE3NXEOF.js';
2
- import '../chunk-TZ5RTANX.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-57K4GW3D.js';
2
+ import '../chunk-WACWV5EP.js';
3
3
  import '../chunk-JIH32RH2.js';
4
4
  import '../chunk-Z22QVHT4.js';
5
5
  import '../chunk-L5UOHS6E.js';
@@ -1,7 +1,7 @@
1
- export { BookingWidget } from '../chunk-Z6PVFZRI.js';
2
- export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-YGXWG54S.js';
1
+ export { BookingWidget } from '../chunk-66G47P5C.js';
2
+ export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-XWIRU6UT.js';
3
3
  import '../chunk-3G7YABRA.js';
4
- import '../chunk-55JLUMAC.js';
5
- import '../chunk-IY6G67EF.js';
6
- import '../chunk-S5G3A7OZ.js';
4
+ import '../chunk-727R7C5R.js';
5
+ import '../chunk-3EU6S5YC.js';
6
+ import '../chunk-Q72M5KBS.js';
7
7
  import '../chunk-PKBMQBKP.js';
@@ -1,6 +1,6 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-6BXUSAOJ.js';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-7FSB2EXS.js';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
3
- import '../chunk-55JLUMAC.js';
4
- import '../chunk-IY6G67EF.js';
5
- import '../chunk-S5G3A7OZ.js';
3
+ import '../chunk-727R7C5R.js';
4
+ import '../chunk-3EU6S5YC.js';
5
+ import '../chunk-Q72M5KBS.js';
6
6
  import '../chunk-PKBMQBKP.js';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { SiteDesignReporter } from '../chunk-CAF53GKN.js';
3
- export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-J6N5DCGW.js';
2
+ export { SiteDesignReporter } from '../chunk-H4R2GPAB.js';
3
+ export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-WBC5B3JD.js';
4
4
  export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-BF7TZYC3.js';
5
5
  import '../chunk-IHG36STL.js';
6
6
  import '../chunk-YC7ELZS3.js';
@@ -8,7 +8,7 @@ import '../chunk-S22FSH7C.js';
8
8
  import '../chunk-CAH4Y4PY.js';
9
9
  import '../chunk-EKBEOXTH.js';
10
10
  import '../chunk-3G7YABRA.js';
11
- import '../chunk-55JLUMAC.js';
12
- import '../chunk-IY6G67EF.js';
13
- import '../chunk-S5G3A7OZ.js';
11
+ import '../chunk-727R7C5R.js';
12
+ import '../chunk-3EU6S5YC.js';
13
+ import '../chunk-Q72M5KBS.js';
14
14
  import '../chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { SitePopups } from '../chunk-NKFRW2VB.js';
2
+ export { SitePopups } from '../chunk-JBEUZJS3.js';
3
3
  import '../chunk-27FISYK4.js';
4
4
  export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-BF7TZYC3.js';
5
5
  import '../chunk-IHG36STL.js';
@@ -11,7 +11,7 @@ import '../chunk-GJWI74ZZ.js';
11
11
  import '../chunk-CAH4Y4PY.js';
12
12
  import '../chunk-EKBEOXTH.js';
13
13
  import '../chunk-3G7YABRA.js';
14
- import '../chunk-55JLUMAC.js';
15
- import '../chunk-IY6G67EF.js';
16
- import '../chunk-S5G3A7OZ.js';
14
+ import '../chunk-727R7C5R.js';
15
+ import '../chunk-3EU6S5YC.js';
16
+ import '../chunk-Q72M5KBS.js';
17
17
  import '../chunk-PKBMQBKP.js';
@@ -1,4 +1,4 @@
1
- export { writeLLMsTxtToPublic } from './chunk-TZ5RTANX.js';
1
+ export { writeLLMsTxtToPublic } from './chunk-WACWV5EP.js';
2
2
  import './chunk-JIH32RH2.js';
3
3
  import './chunk-L5UOHS6E.js';
4
4
  import './chunk-WMVK77ND.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonordev/site-kit",
3
- "version": "8.0.1",
3
+ "version": "8.2.0",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@11.5.3",
6
6
  "description": "The Sonor modules a Next.js site needs, from one package and one API key: SEO, analytics, forms, articles, chat, booking, AI visibility and agent tools. Selling online? Add @sonordev/commerce-kit.",
@@ -326,3 +326,36 @@ Components use `.sk-article-*` and `.sk-article-list-*` classes. Import default
326
326
  ```
327
327
 
328
328
  Or use `unstyled` prop + `children` render prop for complete control.
329
+
330
+ ## Supporting photos (8.1)
331
+
332
+ Sonor's article photo plan can attach up to eight supporting images to exact
333
+ places in the article. The public response includes `editorial_photos`, an
334
+ optional array of approved snapshots with `url`, `alt`, optional `caption`,
335
+ `width`, `height`, and `placement`. Placement is `{ kind: 'after_intro' }` or
336
+ `{ kind: 'after_heading', heading: 'Exact section heading' }`. Photo briefs,
337
+ file ownership and private source notes stay in the authenticated API.
338
+
339
+ The default `Article` renderer and the RSS/Atom generators apply these
340
+ placements automatically. Custom publications use the same pure helper after
341
+ converting Markdown to HTML and before rendering their content:
342
+
343
+ ```tsx
344
+ import { insertArticlePhotos, articlePhotoCss } from '@sonordev/site-kit/articles/server-ui'
345
+
346
+ const html = insertArticlePhotos(articleHtml, post.editorial_photos)
347
+ // Render articlePhotoCss once and use html with your existing trusted-content policy.
348
+ ```
349
+
350
+ The helper inserts a semantic figure after the introduction's first prose
351
+ paragraph or a section's first prose paragraph. It preserves the surrounding
352
+ HTML and includes intrinsic dimensions, descriptions, captions and lazy loading.
353
+ It skips missing or duplicate headings, code examples, tables, existing figures,
354
+ lists, and callouts. An image already in the body isn't inserted again. It
355
+ doesn't sanitize the original article HTML; retain your existing content policy.
356
+ Articles without this field render as before. Custom styles can target
357
+ `.sk-article-photo` and `.sk-article-photo figcaption` or use `articlePhotoCss`.
358
+
359
+ Agents managing photos use the authenticated Sonor article media tools. The
360
+ site's public `get_article` MCP tool only reads the approved photo descriptions
361
+ and placements; it can't attach photos or read planning briefs.
File without changes