@sonordev/site-kit 7.0.1 → 7.1.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 (147) hide show
  1. package/CHANGELOG.md +3606 -0
  2. package/README.md +12 -13
  3. package/agent-manifest.json +11 -5
  4. package/dist/{AnalyticsProvider-EMM2TKRE.js → AnalyticsProvider-ZMQUV33M.js} +4 -4
  5. package/dist/{ArticleViewTracker-RA64BGL6.js → ArticleViewTracker-V7NUXYBY.js} +3 -3
  6. package/dist/{BlocksPopup-D25RFNOV.js → BlocksPopup-52EU7OUY.js} +4 -4
  7. package/dist/{ChatWidget-RYI7BMJJ.js → ChatWidget-5BHMNR57.js} +5 -5
  8. package/dist/{EngageWidget-UKFCN33M.js → EngageWidget-PCGLX7SO.js} +4 -4
  9. package/dist/{FileField-MUHA7LZR.js → FileField-TSFGNAMY.js} +3 -3
  10. package/dist/{FormSpotlight-TCLPWPLL.js → FormSpotlight-XLBWEOTE.js} +1 -1
  11. package/dist/{FormStage-CNYLP6I6.js → FormStage-IJQ5Q2X6.js} +1 -1
  12. package/dist/{ManagedForm-7ZL5SKTO.js → ManagedForm-Z3PKOPIZ.js} +6 -6
  13. package/dist/{ManagedNewsletterForm-33B4JLX7.js → ManagedNewsletterForm-QAO3POLC.js} +4 -4
  14. package/dist/{SignalCore-L5FVDHFE.js → SignalCore-RBA3VDBL.js} +3 -3
  15. package/dist/{SiteDesignReporter-4JOFL4FP.js → SiteDesignReporter-C4LR5X2V.js} +5 -5
  16. package/dist/SitemapSync-XVMGKCF3.js +8 -0
  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/articles/index.js +1 -1
  21. package/dist/articles/server-ui.js +1 -1
  22. package/dist/chat/index.js +5 -5
  23. package/dist/{chunk-FYBZ5SNP.js → chunk-3G2SE2J4.js} +1 -1
  24. package/dist/{chunk-HGCK465A.js → chunk-3J2ERO3I.js} +1 -1
  25. package/dist/{chunk-KXPBMCFL.js → chunk-3QI26673.js} +3 -1
  26. package/dist/{chunk-BMO3VGMR.js → chunk-3XPJKZ6D.js} +30 -7
  27. package/dist/{chunk-QGHSMJKW.js → chunk-4JQQDCMO.js} +1 -1
  28. package/dist/{chunk-6HDT4G4A.js → chunk-4YTYGG2C.js} +2 -2
  29. package/dist/{chunk-N2UVOR3X.js → chunk-662ILEZ6.js} +2 -0
  30. package/dist/chunk-6G43IRWR.js +4 -0
  31. package/dist/{chunk-LVESVYCE.js → chunk-7MHHWZKC.js} +11 -117
  32. package/dist/{chunk-MV2MBTC3.js → chunk-7QTMMHUO.js} +1 -1
  33. package/dist/{chunk-KPAZG65P.js → chunk-CGWUXUYZ.js} +138 -46
  34. package/dist/{chunk-4IQ52CXL.js → chunk-DUAO4Q75.js} +2 -2
  35. package/dist/{chunk-4RMVXRBO.js → chunk-EIULXXUJ.js} +3 -3
  36. package/dist/{chunk-3KUUH2YP.js → chunk-EVFZ7KEW.js} +1 -1
  37. package/dist/{chunk-OFOAHPUV.js → chunk-F42R35NV.js} +1 -1
  38. package/dist/{chunk-QANVUXKH.js → chunk-FLR3EMK6.js} +1 -1
  39. package/dist/{chunk-P4GRY6QP.js → chunk-GIAOPEN6.js} +1 -1
  40. package/dist/{chunk-P5J7VMQ3.js → chunk-GWUKQ26F.js} +1 -1
  41. package/dist/{chunk-TT63HHIT.js → chunk-HAG4YIZY.js} +1 -1
  42. package/dist/{chunk-QZZIKMAT.js → chunk-HVH37YPX.js} +1 -1
  43. package/dist/{chunk-SSUQKA7L.js → chunk-J4D6ZXRW.js} +1 -1
  44. package/dist/{chunk-GYESATRY.js → chunk-L2DJD5Y4.js} +1 -1
  45. package/dist/{chunk-WATH55UY.js → chunk-LFXVE32I.js} +1 -1
  46. package/dist/chunk-LPH5FANE.js +169 -0
  47. package/dist/{chunk-V6LSQRTH.js → chunk-PLUP2KN5.js} +1 -1
  48. package/dist/chunk-RYVDGXC2.js +19 -0
  49. package/dist/{chunk-EGOD74PP.js → chunk-U35H2JIQ.js} +2 -2
  50. package/dist/chunk-VCJYLYJV.js +49 -0
  51. package/dist/{chunk-FL4EPUWA.js → chunk-W2CL2DB3.js} +2 -2
  52. package/dist/{chunk-UZN4ZYR2.js → chunk-XD3ZQET6.js} +1 -1
  53. package/dist/{chunk-CVTVNC2U.js → chunk-XNVSCQ2O.js} +2 -2
  54. package/dist/{chunk-T3MC4HOD.js → chunk-YLSEB32F.js} +1 -1
  55. package/dist/chunk-ZETJTCMV.js +118 -0
  56. package/dist/{chunk-5SEM2V4A.js → chunk-ZIMFQWGJ.js} +3 -3
  57. package/dist/client/index.js +3 -3
  58. package/dist/cms/CmsPage.d.ts +1 -0
  59. package/dist/cms/CmsPreview.d.ts +1 -0
  60. package/dist/cms/CmsSection.d.ts +1 -0
  61. package/dist/cms/index.d.ts +6 -0
  62. package/dist/cms/server-api.d.ts +3 -0
  63. package/dist/commerce/index.js +4 -4
  64. package/dist/config/index.js +1 -1
  65. package/dist/contracts/entries.d.ts +1 -1
  66. package/dist/contracts/site-cache.d.ts +55 -0
  67. package/dist/contracts/site-edit-param.d.ts +7 -0
  68. package/dist/contracts/site-edit.d.ts +77 -0
  69. package/dist/contracts/slot-content.d.ts +111 -0
  70. package/dist/contracts/slots.d.ts +39 -25
  71. package/dist/engage/index.js +6 -6
  72. package/dist/fleet/index.js +4 -4
  73. package/dist/forms/index.js +8 -8
  74. package/dist/forms/server.js +2 -2
  75. package/dist/forms/types.d.ts +3 -1
  76. package/dist/images/index.js +4 -4
  77. package/dist/index.js +1 -1
  78. package/dist/layout/client.js +8 -7
  79. package/dist/layout/index.js +9 -8
  80. package/dist/llms/index.js +4 -2
  81. package/dist/llms/seo-revalidate.d.ts +8 -1
  82. package/dist/maps/index.js +3 -3
  83. package/dist/mcp/sonor.js +6 -6
  84. package/dist/overlay-RXV6U6QC.js +353 -0
  85. package/dist/proxy/index.js +2 -2
  86. package/dist/proxy/securityHeaders.d.ts +4 -0
  87. package/dist/revalidate/index.d.ts +44 -0
  88. package/dist/revalidate/index.js +27 -0
  89. package/dist/seo/ManagedContent.d.ts +2 -0
  90. package/dist/seo/client.js +4 -4
  91. package/dist/seo/index.js +9 -8
  92. package/dist/seo/llms.js +4 -2
  93. package/dist/seo/register-sitemap-cli.js +1 -1
  94. package/dist/seo/server.js +3 -2
  95. package/dist/seo/sitemap.js +2 -2
  96. package/dist/server/index.js +2 -2
  97. package/dist/{server-api-GJJQZVG7.js → server-api-BVCBLJKL.js} +2 -1
  98. package/dist/shared/build-entries.d.ts +1 -0
  99. package/dist/shared/edit-bridge.d.ts +8 -0
  100. package/dist/shared/version.d.ts +1 -1
  101. package/dist/signal/index.js +2 -2
  102. package/dist/sitemap/index.js +2 -2
  103. package/dist/slots/ManagedLink.d.ts +31 -0
  104. package/dist/slots/ManagedList.d.ts +30 -0
  105. package/dist/slots/ManagedRichText.d.ts +31 -0
  106. package/dist/slots/contract.js +2 -1
  107. package/dist/slots/edit/locate.d.ts +30 -0
  108. package/dist/slots/edit/overlay.d.ts +18 -0
  109. package/dist/slots/index.d.ts +12 -4
  110. package/dist/slots/index.js +4 -2
  111. package/dist/slots/revalidate.d.ts +8 -3
  112. package/dist/slots/rich.d.ts +7 -0
  113. package/dist/slots/server-api.d.ts +6 -2
  114. package/dist/sync/index.js +5 -5
  115. package/dist/website/images.js +4 -4
  116. package/dist/website/index.js +5 -5
  117. package/dist/website/popups.js +4 -4
  118. package/dist/website/slots/contract.js +2 -1
  119. package/dist/website/slots.js +4 -2
  120. package/dist/{writeLLMsTxt-UMHKGNRR.js → writeLLMsTxt-QR23OQUE.js} +1 -1
  121. package/docs/MIGRATING-TO-7.md +146 -0
  122. package/docs.json +69 -0
  123. package/package.json +14 -4
  124. package/src/admin-auth/README.md +88 -0
  125. package/src/analytics/README.md +264 -0
  126. package/src/articles/README.md +325 -0
  127. package/src/commerce/README.md +109 -0
  128. package/src/cta-bar/README.md +154 -0
  129. package/src/engage/README.md +241 -0
  130. package/src/forms/README.md +219 -0
  131. package/src/images/README.md +74 -0
  132. package/src/layout/README.md +66 -0
  133. package/src/llms/README.md +723 -0
  134. package/src/mcp/README.md +376 -0
  135. package/src/motion/README.md +372 -0
  136. package/src/og/README.md +304 -0
  137. package/src/proxy/README.md +152 -0
  138. package/src/redirects/README.md +74 -0
  139. package/src/reputation/README.md +64 -0
  140. package/src/revalidate/README.md +82 -0
  141. package/src/seo/README.md +346 -0
  142. package/src/signal/README.md +115 -0
  143. package/src/sitemap/README.md +127 -0
  144. package/src/slots/README.md +168 -0
  145. package/src/sync/README.md +115 -0
  146. package/dist/SitemapSync-7WKY4HXI.js +0 -8
  147. package/dist/chunk-SS636UDN.js +0 -35
package/README.md CHANGED
@@ -73,7 +73,7 @@ export const config = {
73
73
  }
74
74
  ```
75
75
 
76
- Handles Portal-managed redirects, security headers, and AI discovery headers.
76
+ Handles Sonor-managed redirects, security headers, and AI discovery headers.
77
77
 
78
78
  **CLI (optional — scaffolds everything):**
79
79
 
@@ -96,15 +96,15 @@ Every module has its own README in `src/<module>/README.md` with full API docs,
96
96
  | **Layout** | `@sonordev/site-kit/layout` | RSC layout that composes all features | [README](src/layout/README.md) |
97
97
  | **SEO** | `@sonordev/site-kit/seo` | Managed metadata, schemas, FAQs, internal links | [README](src/seo/README.md) |
98
98
  | **Analytics** | `@sonordev/site-kit/analytics` | Page views, events, conversions, Web Vitals | [README](src/analytics/README.md) |
99
- | **Sitemap** | `@sonordev/site-kit/seo/sitemap` | Auto-generated sitemap with Portal sync. URLs follow next.config `trailingSlash` | [README](src/sitemap/README.md) |
99
+ | **Sitemap** | `@sonordev/site-kit/seo/sitemap` | Auto-generated sitemap with Sonor sync. URLs follow next.config `trailingSlash` | [README](src/sitemap/README.md) |
100
100
  | **Proxy** | `@sonordev/site-kit/proxy` | Redirects, security headers, AI discovery (`./middleware` is its 7.x alias) | [README](src/proxy/README.md) |
101
- | **Redirects** | `@sonordev/site-kit/seo/redirects` | Portal-managed 301/302 redirect rules | [README](src/redirects/README.md) |
101
+ | **Redirects** | `@sonordev/site-kit/seo/redirects` | Sonor-managed 301/302 redirect rules | [README](src/redirects/README.md) |
102
102
 
103
103
  ### Content
104
104
 
105
105
  | Module | Import | Purpose | Docs |
106
106
  |--------|--------|---------|------|
107
- | **Articles** | `@sonordev/site-kit/articles` | Portal-managed article with SSG, topic clusters, E-E-A-T | [README](src/article/README.md) |
107
+ | **Articles** | `@sonordev/site-kit/articles` | Sonor-managed articles with SSG, topic clusters, E-E-A-T | [README](src/articles/README.md) |
108
108
  | **Images** | `@sonordev/site-kit/website/images` | Managed image slots with dev-mode editing | [README](src/images/README.md) |
109
109
  | **Reputation** | `@sonordev/site-kit/reputation` | Reviews, testimonials, rating stats | [README](src/reputation/README.md) |
110
110
 
@@ -161,7 +161,7 @@ SONOR_API_KEY in .env.local
161
161
  ▼
162
162
  SiteKitLayout (RSC server component)
163
163
  ├── Server-side:
164
- │ ├── ManagedFavicon (Portal logo → <link> tags)
164
+ │ ├── ManagedFavicon (Sonor logo → <link> tags)
165
165
  │ ├── ManagedScripts (tracking pixels, analytics tags)
166
166
  │ └── API preconnect hints
167
167
  │
@@ -173,12 +173,12 @@ SiteKitLayout (RSC server component)
173
173
  │ └── FleetHeartbeat (kit version + modules, once per session)
174
174
  │
175
175
  └── Middleware (separate):
176
- ├── Redirects (Portal-managed 301/302)
176
+ ├── Redirects (Sonor-managed 301/302)
177
177
  ├── Security headers (CSP frame-ancestors, nosniff, etc.)
178
178
  └── AI discovery (Link: rel="describedby" → /llms.txt)
179
179
  ```
180
180
 
181
- All data flows through the Portal API (`api.sonor.io`) authenticated by your API key. No direct database access, no Supabase keys exposed to the client.
181
+ All data flows through the Sonor API (`api.sonor.io`) authenticated by your API key. No direct database access, no Supabase keys exposed to the client.
182
182
 
183
183
  ---
184
184
 
@@ -261,9 +261,8 @@ import '@sonordev/site-kit/forms/styles.css'
261
261
  SONOR_API_KEY=sonor_xxxxxxxx_xxxxx
262
262
 
263
263
  # Optional:
264
- SONOR_API_URL=https://api.sonor.io # Portal API (default)
264
+ SONOR_API_URL=https://api.sonor.io # Sonor API (default)
265
265
  NEXT_PUBLIC_SITE_URL=https://example.com # For CLI status checks + sitemap
266
- NEXT_PUBLIC_RECAPTCHA_SITE_KEY=6Le... # reCAPTCHA Enterprise (forms)
267
266
  REVALIDATION_SECRET=your_secret # On-demand ISR for llms.txt
268
267
  MCP_TRANSPORT_SECRET=... # Netlify MCP relay (npx sonor-setup mcp writes it)
269
268
  ```
@@ -288,7 +287,7 @@ Commands:
288
287
  setup AI-powered SEO setup (metadata, schemas, FAQs)
289
288
  scan Scan codebase for integration opportunities
290
289
  migrate Migrate detected components to site-kit
291
- sync Sync local content to Portal
290
+ sync Sync local content to Sonor
292
291
  status Health check (API, llms.txt, sitemap, layout)
293
292
  geo Check GEO/llms.txt wiring
294
293
  images Scan, upload, and manage images
@@ -320,11 +319,11 @@ import type { SiteKitLayoutProps } from '@sonordev/site-kit/layout'
320
319
 
321
320
  ## Architecture Note
322
321
 
323
- `@sonordev/site-kit` is the client bridge between Next.js marketing sites and the Sonor platform. All persistent data (forms, articles, SEO config, analytics) lives in the Portal API — site-kit fetches, renders, and tracks.
322
+ `@sonordev/site-kit` is the client bridge between Next.js marketing sites and the Sonor platform. All persistent data (forms, articles, SEO config, analytics) lives in Sonor — site-kit fetches, renders, and tracks.
324
323
 
325
324
  - **Server components** (SEO, Articles, Images): Import directly, RSC-compatible, no provider needed
326
325
  - **Client modules** (Analytics, Engage, Signal): Lazy-loaded via `SiteKitLayout`, tree-shaken
327
- - **Build-time** (Sitemap, llms.txt): Run during `next build`, sync to Portal
326
+ - **Build-time** (Sitemap, llms.txt): Run during `next build`, sync to Sonor
328
327
  - **Middleware** (Redirects, Security, AI Discovery): Runs on every request edge
329
328
 
330
- For the full platform architecture, see the root `CLAUDE.md`.
329
+ Full docs for every module: [sonor.dev](https://sonor.dev).
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@sonordev/site-kit",
4
- "version": "7.0.1",
4
+ "version": "7.1.0",
5
5
  "description": "Machine-readable manifest for coding agents integrating a site with Sonor. See AGENTS.md (shipped) and docs/SITE-KIT-AGENT-NATIVE.md.",
6
6
  "env": {
7
7
  "required": [
@@ -322,7 +322,7 @@
322
322
  "name": "slots",
323
323
  "import": "@sonordev/site-kit/slots",
324
324
  "side": "server",
325
- "purpose": "Managed Slots — named, Sonor-editable text regions inside elements you own.",
325
+ "purpose": "Managed copy — named, Sonor-editable text, rich text, links and lists inside elements you own.",
326
326
  "stability": "deprecated",
327
327
  "movedTo": [
328
328
  "@sonordev/site-kit/website/slots"
@@ -337,6 +337,12 @@
337
337
  "@sonordev/site-kit/website/slots/contract"
338
338
  ]
339
339
  },
340
+ {
341
+ "name": "revalidate",
342
+ "import": "@sonordev/site-kit/revalidate",
343
+ "side": "server",
344
+ "purpose": "Live updates — the one-line /api/seo-revalidate route Sonor calls when content changes, so cached pages refresh in seconds."
345
+ },
340
346
  {
341
347
  "name": "sites/contract",
342
348
  "import": "@sonordev/site-kit/sites/contract",
@@ -404,7 +410,7 @@
404
410
  "name": "website/slots",
405
411
  "import": "@sonordev/site-kit/website/slots",
406
412
  "side": "server",
407
- "purpose": "Managed Slots — named, Sonor-editable text regions inside elements you own."
413
+ "purpose": "Managed copy — named, Sonor-editable text, rich text, links and lists inside elements you own."
408
414
  },
409
415
  {
410
416
  "name": "website/slots/contract",
@@ -415,7 +421,7 @@
415
421
  "name": "website/cms",
416
422
  "import": "@sonordev/site-kit/website/cms",
417
423
  "side": "mixed",
418
- "purpose": "Sanity Content Lake integration."
424
+ "purpose": "Deprecated in 7.1, removed in 8.0: the retired Sanity CMS. Use slots (managed copy) instead."
419
425
  },
420
426
  {
421
427
  "name": "website/cms/server",
@@ -608,7 +614,7 @@
608
614
  "name": "cms",
609
615
  "import": "@sonordev/site-kit/cms",
610
616
  "side": "mixed",
611
- "purpose": "Sanity Content Lake integration.",
617
+ "purpose": "Deprecated in 7.1, removed in 8.0: the retired Sanity CMS. Use slots (managed copy) instead.",
612
618
  "stability": "deprecated",
613
619
  "movedTo": [
614
620
  "@sonordev/site-kit/website/cms"
@@ -1,11 +1,11 @@
1
- export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-HGCK465A.js';
1
+ export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-3J2ERO3I.js';
2
2
  import './chunk-LCDVPAMR.js';
3
3
  import './chunk-24QZEO3Q.js';
4
4
  import './chunk-L2V5PUFN.js';
5
5
  import './chunk-GJWI74ZZ.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-EGOD74PP.js';
9
- import './chunk-3KUUH2YP.js';
10
- import './chunk-QGHSMJKW.js';
8
+ import './chunk-U35H2JIQ.js';
9
+ import './chunk-EVFZ7KEW.js';
10
+ import './chunk-4JQQDCMO.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -3,9 +3,9 @@ import { useDeferredActivation } from './chunk-YC7ELZS3.js';
3
3
  import { withSiteBody } from './chunk-MJP63SSS.js';
4
4
  import './chunk-FESKKJAS.js';
5
5
  import './chunk-A4CC4ZG3.js';
6
- import { sonorFetch } from './chunk-EGOD74PP.js';
7
- import './chunk-3KUUH2YP.js';
8
- import './chunk-QGHSMJKW.js';
6
+ import { sonorFetch } from './chunk-U35H2JIQ.js';
7
+ import './chunk-EVFZ7KEW.js';
8
+ import './chunk-4JQQDCMO.js';
9
9
  import './chunk-PKBMQBKP.js';
10
10
  import { useEffect } from 'react';
11
11
 
@@ -1,13 +1,13 @@
1
1
  'use client';
2
- import { getSiteDesignTokens } from './chunk-FL4EPUWA.js';
2
+ import { getSiteDesignTokens } from './chunk-W2CL2DB3.js';
3
3
  import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-JSZN6LDZ.js';
4
4
  import { normalizePopupBlocks, toHexColor, readableOn } from './chunk-IHG36STL.js';
5
5
  import './chunk-S22FSH7C.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-EGOD74PP.js';
9
- import './chunk-3KUUH2YP.js';
10
- import './chunk-QGHSMJKW.js';
8
+ import './chunk-U35H2JIQ.js';
9
+ import './chunk-EVFZ7KEW.js';
10
+ import './chunk-4JQQDCMO.js';
11
11
  import './chunk-PKBMQBKP.js';
12
12
  import { useState } from 'react';
13
13
  import { jsx } from 'react/jsx-runtime';
@@ -1,15 +1,15 @@
1
- export { ChatWidget, EchoChat, isChatEnabled } from './chunk-4IQ52CXL.js';
1
+ export { ChatWidget, EchoChat, isChatEnabled } from './chunk-DUAO4Q75.js';
2
2
  import './chunk-JE4A5S4F.js';
3
3
  import './chunk-NDF4A5JM.js';
4
4
  import './chunk-6T6CQVNL.js';
5
- import './chunk-UZN4ZYR2.js';
5
+ import './chunk-XD3ZQET6.js';
6
6
  import './chunk-AQSNPZY4.js';
7
7
  import './chunk-5SQK3D53.js';
8
8
  import './chunk-NJCTQH2P.js';
9
9
  import './chunk-S22FSH7C.js';
10
10
  import './chunk-L2V5PUFN.js';
11
11
  import './chunk-GJWI74ZZ.js';
12
- import './chunk-EGOD74PP.js';
13
- import './chunk-3KUUH2YP.js';
14
- import './chunk-QGHSMJKW.js';
12
+ import './chunk-U35H2JIQ.js';
13
+ import './chunk-EVFZ7KEW.js';
14
+ import './chunk-4JQQDCMO.js';
15
15
  import './chunk-PKBMQBKP.js';
@@ -1,11 +1,11 @@
1
- export { EngageWidget } from './chunk-5SEM2V4A.js';
1
+ export { EngageWidget } from './chunk-ZIMFQWGJ.js';
2
2
  import './chunk-NDF4A5JM.js';
3
3
  import './chunk-6T6CQVNL.js';
4
4
  import './chunk-24QZEO3Q.js';
5
5
  import './chunk-GJWI74ZZ.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-EGOD74PP.js';
9
- import './chunk-3KUUH2YP.js';
10
- import './chunk-QGHSMJKW.js';
8
+ import './chunk-U35H2JIQ.js';
9
+ import './chunk-EVFZ7KEW.js';
10
+ import './chunk-4JQQDCMO.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-EGOD74PP.js';
3
- import './chunk-3KUUH2YP.js';
4
- import './chunk-QGHSMJKW.js';
2
+ import { sonorFetch } from './chunk-U35H2JIQ.js';
3
+ import './chunk-EVFZ7KEW.js';
4
+ import './chunk-4JQQDCMO.js';
5
5
  import './chunk-PKBMQBKP.js';
6
6
  import React from 'react';
7
7
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-J4FSB4OG.js';
3
- import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-T3MC4HOD.js';
3
+ import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-YLSEB32F.js';
4
4
  import { FormField } from './chunk-QPEEKFCA.js';
5
5
  import { isEmptyValue, isDisplayOnly } from './chunk-AQSNPZY4.js';
6
6
  import './chunk-PKBMQBKP.js';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-J4FSB4OG.js';
3
- import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-T3MC4HOD.js';
3
+ import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-YLSEB32F.js';
4
4
  import { FormField } from './chunk-QPEEKFCA.js';
5
5
  import { isEmptyValue } from './chunk-AQSNPZY4.js';
6
6
  import './chunk-PKBMQBKP.js';
@@ -1,14 +1,14 @@
1
- export { ManagedForm } from './chunk-4RMVXRBO.js';
2
- import './chunk-T3MC4HOD.js';
1
+ export { ManagedForm } from './chunk-EIULXXUJ.js';
2
+ import './chunk-YLSEB32F.js';
3
3
  import './chunk-DXO6SBMD.js';
4
4
  import './chunk-QPEEKFCA.js';
5
- import './chunk-UZN4ZYR2.js';
5
+ import './chunk-XD3ZQET6.js';
6
6
  import './chunk-AQSNPZY4.js';
7
7
  import './chunk-5SQK3D53.js';
8
8
  import './chunk-NJCTQH2P.js';
9
9
  import './chunk-L2V5PUFN.js';
10
10
  import './chunk-GJWI74ZZ.js';
11
- import './chunk-EGOD74PP.js';
12
- import './chunk-3KUUH2YP.js';
13
- import './chunk-QGHSMJKW.js';
11
+ import './chunk-U35H2JIQ.js';
12
+ import './chunk-EVFZ7KEW.js';
13
+ import './chunk-4JQQDCMO.js';
14
14
  import './chunk-PKBMQBKP.js';
@@ -1,14 +1,14 @@
1
1
  import { NewsletterShell } from './chunk-SC4MZGWZ.js';
2
2
  import './chunk-GYF2ULVO.js';
3
- import { useForm } from './chunk-UZN4ZYR2.js';
3
+ import { useForm } from './chunk-XD3ZQET6.js';
4
4
  import './chunk-AQSNPZY4.js';
5
5
  import './chunk-5SQK3D53.js';
6
6
  import './chunk-NJCTQH2P.js';
7
7
  import './chunk-L2V5PUFN.js';
8
8
  import './chunk-GJWI74ZZ.js';
9
- import './chunk-EGOD74PP.js';
10
- import './chunk-3KUUH2YP.js';
11
- import './chunk-QGHSMJKW.js';
9
+ import './chunk-U35H2JIQ.js';
10
+ import './chunk-EVFZ7KEW.js';
11
+ import './chunk-4JQQDCMO.js';
12
12
  import './chunk-PKBMQBKP.js';
13
13
  import { jsx } from 'react/jsx-runtime';
14
14
 
@@ -2,9 +2,9 @@
2
2
  import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-24QZEO3Q.js';
3
3
  import { onPageLeave } from './chunk-L2V5PUFN.js';
4
4
  import './chunk-GJWI74ZZ.js';
5
- import { sonorFetch } from './chunk-EGOD74PP.js';
6
- import { getFreshCredential, isSiteToken } from './chunk-3KUUH2YP.js';
7
- import './chunk-QGHSMJKW.js';
5
+ import { sonorFetch } from './chunk-U35H2JIQ.js';
6
+ import { getFreshCredential, isSiteToken } from './chunk-EVFZ7KEW.js';
7
+ import './chunk-4JQQDCMO.js';
8
8
  import './chunk-PKBMQBKP.js';
9
9
  import { useState, useRef, useEffect, useCallback } from 'react';
10
10
 
@@ -1,11 +1,11 @@
1
- export { SiteDesignReporter } from './chunk-P4GRY6QP.js';
2
- import './chunk-FL4EPUWA.js';
1
+ export { SiteDesignReporter } from './chunk-GIAOPEN6.js';
2
+ import './chunk-W2CL2DB3.js';
3
3
  import './chunk-IHG36STL.js';
4
4
  import './chunk-YC7ELZS3.js';
5
5
  import './chunk-S22FSH7C.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-EGOD74PP.js';
9
- import './chunk-3KUUH2YP.js';
10
- import './chunk-QGHSMJKW.js';
8
+ import './chunk-U35H2JIQ.js';
9
+ import './chunk-EVFZ7KEW.js';
10
+ import './chunk-4JQQDCMO.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -0,0 +1,8 @@
1
+ export { SitemapSync } from './chunk-LFXVE32I.js';
2
+ import './chunk-YVKRYQRG.js';
3
+ import './chunk-43OCZ3JA.js';
4
+ import './chunk-EKBEOXTH.js';
5
+ import './chunk-U35H2JIQ.js';
6
+ import './chunk-EVFZ7KEW.js';
7
+ import './chunk-4JQQDCMO.js';
8
+ import './chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- export { BookingWidget, BookingWidget_default as default } from '../chunk-FYBZ5SNP.js';
3
- import '../chunk-MV2MBTC3.js';
4
- import '../chunk-EGOD74PP.js';
5
- import '../chunk-3KUUH2YP.js';
6
- import '../chunk-QGHSMJKW.js';
2
+ export { BookingWidget, BookingWidget_default as default } from '../chunk-3G2SE2J4.js';
3
+ import '../chunk-7QTMMHUO.js';
4
+ import '../chunk-U35H2JIQ.js';
5
+ import '../chunk-EVFZ7KEW.js';
6
+ import '../chunk-4JQQDCMO.js';
7
7
  import '../chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-EGOD74PP.js';
3
- import '../chunk-3KUUH2YP.js';
4
- import '../chunk-QGHSMJKW.js';
2
+ import { sonorFetch } from '../chunk-U35H2JIQ.js';
3
+ import '../chunk-EVFZ7KEW.js';
4
+ import '../chunk-4JQQDCMO.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
  import { useState, useEffect } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,13 +1,13 @@
1
1
  'use client';
2
2
  export { ContactTracking, useContactTracking } from '../chunk-P5GB6NEO.js';
3
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-HGCK465A.js';
3
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-3J2ERO3I.js';
4
4
  export { trackConversion, trackEvent } from '../chunk-LCDVPAMR.js';
5
5
  import '../chunk-24QZEO3Q.js';
6
6
  import '../chunk-L2V5PUFN.js';
7
7
  import '../chunk-GJWI74ZZ.js';
8
8
  export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-43OCZ3JA.js';
9
9
  import '../chunk-EKBEOXTH.js';
10
- import '../chunk-EGOD74PP.js';
11
- import '../chunk-3KUUH2YP.js';
12
- import '../chunk-QGHSMJKW.js';
10
+ import '../chunk-U35H2JIQ.js';
11
+ import '../chunk-EVFZ7KEW.js';
12
+ import '../chunk-4JQQDCMO.js';
13
13
  import '../chunk-PKBMQBKP.js';
@@ -15,7 +15,7 @@ import '../chunk-PKBMQBKP.js';
15
15
  import React, { useState, Suspense, useEffect } from 'react';
16
16
  import { jsx, jsxs } from 'react/jsx-runtime';
17
17
 
18
- var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-33B4JLX7.js'));
18
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-QAO3POLC.js'));
19
19
  function NewsletterWidget({
20
20
  title = "Subscribe to Our Newsletter",
21
21
  description = "Get the latest posts delivered straight to your inbox.",
@@ -132,7 +132,7 @@ async function Article({
132
132
  ...item,
133
133
  answer: addExternalLinkTargets(item.answer || "", siteUrlResolved)
134
134
  })) ?? faqRaw;
135
- const { ArticleViewTracker } = await import('../ArticleViewTracker-RA64BGL6.js');
135
+ const { ArticleViewTracker } = await import('../ArticleViewTracker-V7NUXYBY.js');
136
136
  if (children) {
137
137
  return /* @__PURE__ */ jsxs(Fragment, { children: [
138
138
  /* @__PURE__ */ jsx(ArticleViewTracker, { slug: post.slug, site }),
@@ -1,16 +1,16 @@
1
1
  'use client';
2
- export { ChatWidget, EchoChat, isChatEnabled } from '../chunk-4IQ52CXL.js';
2
+ export { ChatWidget, EchoChat, isChatEnabled } from '../chunk-DUAO4Q75.js';
3
3
  import '../chunk-JE4A5S4F.js';
4
4
  export { DEFAULT_LAUNCHER_OFFSET_BOTTOM, chatLauncherStyles } from '../chunk-NDF4A5JM.js';
5
5
  import '../chunk-6T6CQVNL.js';
6
- import '../chunk-UZN4ZYR2.js';
6
+ import '../chunk-XD3ZQET6.js';
7
7
  import '../chunk-AQSNPZY4.js';
8
8
  import '../chunk-5SQK3D53.js';
9
9
  import '../chunk-NJCTQH2P.js';
10
10
  import '../chunk-S22FSH7C.js';
11
11
  import '../chunk-L2V5PUFN.js';
12
12
  import '../chunk-GJWI74ZZ.js';
13
- import '../chunk-EGOD74PP.js';
14
- import '../chunk-3KUUH2YP.js';
15
- import '../chunk-QGHSMJKW.js';
13
+ import '../chunk-U35H2JIQ.js';
14
+ import '../chunk-EVFZ7KEW.js';
15
+ import '../chunk-4JQQDCMO.js';
16
16
  import '../chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { detectTimezone, releaseSlotHold, fetchBookingTypeDetails, fetchBookingTypes, fetchAvailability, createSlotHold, createBooking, formatDuration, formatDate, formatTime, prepareMeeting } from './chunk-MV2MBTC3.js';
2
+ import { detectTimezone, releaseSlotHold, fetchBookingTypeDetails, fetchBookingTypes, fetchAvailability, createSlotHold, createBooking, formatDuration, formatDate, formatTime, prepareMeeting } from './chunk-7QTMMHUO.js';
3
3
  import { useState, useRef, useMemo, useCallback, useEffect, useId } from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -3,7 +3,7 @@ import { registerAnalyticsDispatcher } from './chunk-LCDVPAMR.js';
3
3
  import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-24QZEO3Q.js';
4
4
  import { onPageLeave } from './chunk-L2V5PUFN.js';
5
5
  import { resolveAnalyticsTarget } from './chunk-43OCZ3JA.js';
6
- import { sonorFetch, sonorBeacon } from './chunk-EGOD74PP.js';
6
+ import { sonorFetch, sonorBeacon } from './chunk-U35H2JIQ.js';
7
7
  import { createContext, useRef, useEffect, useState, useMemo, useCallback, useContext } from 'react';
8
8
  import { usePathname } from 'next/navigation';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -4,7 +4,9 @@ var DEFAULT_FRAME_ANCESTORS = [
4
4
  "https://upforge.io",
5
5
  "https://*.upforge.io",
6
6
  "https://upforgelabs.com",
7
- "https://*.upforgelabs.com"
7
+ "https://*.upforgelabs.com",
8
+ // Sonor's Edit on page frames the live site in the dashboard.
9
+ "https://app.sonor.io"
8
10
  ];
9
11
  function buildSecurityHeaders(config) {
10
12
  if (config === false) return {};
@@ -1,7 +1,8 @@
1
1
  'use client';
2
- import { publishSiteCredential } from './chunk-GYESATRY.js';
3
- import { FleetHeartbeat } from './chunk-CVTVNC2U.js';
4
- import { SignalBridge } from './chunk-QZZIKMAT.js';
2
+ import { SITE_EDIT_PARAM } from './chunk-6G43IRWR.js';
3
+ import { publishSiteCredential } from './chunk-L2DJD5Y4.js';
4
+ import { FleetHeartbeat } from './chunk-XNVSCQ2O.js';
5
+ import { SignalBridge } from './chunk-HVH37YPX.js';
5
6
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
6
7
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
7
8
  import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-24QZEO3Q.js';
@@ -10,20 +11,41 @@ import React, { useState, useRef, useCallback, useEffect, Suspense } from 'react
10
11
  import dynamic from 'next/dynamic';
11
12
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
12
13
 
14
+ // src/shared/edit-bridge.ts
15
+ function startEditBridge() {
16
+ if (typeof window === "undefined" || !isCrossOriginFrame()) return () => {
17
+ };
18
+ if (!new URLSearchParams(window.location.search).has(SITE_EDIT_PARAM)) return () => {
19
+ };
20
+ let stop;
21
+ let cancelled = false;
22
+ const start = () => {
23
+ void import('./overlay-RXV6U6QC.js').then((m) => {
24
+ if (!cancelled) stop = m.startEditOverlay();
25
+ });
26
+ };
27
+ if (document.readyState === "complete") start();
28
+ else window.addEventListener("load", start, { once: true });
29
+ return () => {
30
+ cancelled = true;
31
+ window.removeEventListener("load", start);
32
+ stop?.();
33
+ };
34
+ }
13
35
  var LazyAnalyticsProvider = dynamic(
14
- () => import('./AnalyticsProvider-EMM2TKRE.js').then((m) => ({ default: m.AnalyticsProvider })),
36
+ () => import('./AnalyticsProvider-ZMQUV33M.js').then((m) => ({ default: m.AnalyticsProvider })),
15
37
  { ssr: false }
16
38
  );
17
39
  var LazyEngageWidget = dynamic(
18
- () => import('./EngageWidget-UKFCN33M.js').then((m) => ({ default: m.EngageWidget })),
40
+ () => import('./EngageWidget-PCGLX7SO.js').then((m) => ({ default: m.EngageWidget })),
19
41
  { ssr: false }
20
42
  );
21
43
  var LazySiteDesignReporter = dynamic(
22
- () => import('./SiteDesignReporter-4JOFL4FP.js').then((m) => ({ default: m.SiteDesignReporter })),
44
+ () => import('./SiteDesignReporter-C4LR5X2V.js').then((m) => ({ default: m.SiteDesignReporter })),
23
45
  { ssr: false }
24
46
  );
25
47
  var LazySitemapSync = dynamic(
26
- () => import('./SitemapSync-7WKY4HXI.js').then((m) => ({ default: m.SitemapSync })),
48
+ () => import('./SitemapSync-XVMGKCF3.js').then((m) => ({ default: m.SitemapSync })),
27
49
  { ssr: false }
28
50
  );
29
51
  function SiteKitClientProviders({
@@ -55,6 +77,7 @@ function SiteKitClientProviders({
55
77
  pageMetadataRef.current = metadata;
56
78
  }, []);
57
79
  useEffect(() => announceFrameReady(), []);
80
+ useEffect(() => startEditBridge(), []);
58
81
  const siblings = [];
59
82
  if (signal) {
60
83
  const signalConfig = typeof signal === "object" ? signal : {};
@@ -1,4 +1,4 @@
1
1
  // src/shared/version.ts
2
- var SITE_KIT_VERSION = "7.0.1";
2
+ var SITE_KIT_VERSION = "7.1.0";
3
3
 
4
4
  export { SITE_KIT_VERSION };
@@ -1,4 +1,4 @@
1
- import { getSEOPageData, ensureMetadata, getABTest, recordABImpression, getRedirectData, getRobotsData, getSitemapEntries } from './chunk-N2UVOR3X.js';
1
+ import { getSEOPageData, ensureMetadata, getABTest, recordABImpression, getRedirectData, getRobotsData, getSitemapEntries } from './chunk-662ILEZ6.js';
2
2
  import { titleProblem, descriptionProblem } from './chunk-BQR4IPBW.js';
3
3
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
4
4
 
@@ -219,7 +219,7 @@ async function generateSitemap(options) {
219
219
  }));
220
220
  }
221
221
  async function registerLocalSitemap(options) {
222
- const { registerSitemap } = await import('./server-api-GJJQZVG7.js');
222
+ const { registerSitemap } = await import('./server-api-BVCBLJKL.js');
223
223
  let entries = options.entries || [];
224
224
  if (options.autoDiscover && entries.length === 0) {
225
225
  try {
@@ -1,3 +1,4 @@
1
+ import { SITE_CACHE_TAGS } from './chunk-RYVDGXC2.js';
1
2
  import { withSiteBody } from './chunk-MJP63SSS.js';
2
3
  import { serverApiFetch, requireServerApiConfig } from './chunk-X6F6SO4S.js';
3
4
  import { postRegisterSitemap, resolveSyncSite } from './chunk-DIKNRN34.js';
@@ -71,6 +72,7 @@ function secureApiPost(endpoint, body = {}, revalidate = 86400) {
71
72
  method: "POST",
72
73
  body,
73
74
  revalidate,
75
+ tags: [SITE_CACHE_TAGS.seo],
74
76
  requireKey: true,
75
77
  retry: true,
76
78
  logPrefix: SEO_LOG_PREFIX
@@ -0,0 +1,4 @@
1
+ // src/contracts/site-edit-param.ts
2
+ var SITE_EDIT_PARAM = "sonor_edit";
3
+
4
+ export { SITE_EDIT_PARAM };