@sonordev/site-kit 7.0.2 → 7.1.1

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 (126) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/agent-manifest.json +11 -5
  3. package/dist/{AnalyticsProvider-XXWTFKJH.js → AnalyticsProvider-3MI5RCTL.js} +4 -4
  4. package/dist/{ArticleViewTracker-V4KZB6QN.js → ArticleViewTracker-CMBSJR3N.js} +3 -3
  5. package/dist/{BlocksPopup-JHGHB6XW.js → BlocksPopup-X3OAAK2L.js} +4 -4
  6. package/dist/{ChatWidget-CG32POI3.js → ChatWidget-JMFBXJ75.js} +5 -5
  7. package/dist/{EngageWidget-LQMR4LEX.js → EngageWidget-A3QKZ3SU.js} +4 -4
  8. package/dist/{FileField-KUG3CKXG.js → FileField-QRSEGO6D.js} +3 -3
  9. package/dist/{FormSpotlight-FVNPOCU3.js → FormSpotlight-XKV7VTN4.js} +1 -1
  10. package/dist/{FormStage-C7VKRURJ.js → FormStage-C3YGYAUZ.js} +1 -1
  11. package/dist/{ManagedForm-VLNJKV65.js → ManagedForm-2GSSDJPP.js} +6 -6
  12. package/dist/{ManagedNewsletterForm-KJEU23BV.js → ManagedNewsletterForm-LPIKGJF4.js} +4 -4
  13. package/dist/{SignalCore-K2O46QG7.js → SignalCore-ICXXZBYI.js} +3 -3
  14. package/dist/{SiteDesignReporter-D7MD66GI.js → SiteDesignReporter-A7MS2CIP.js} +5 -5
  15. package/dist/SitemapSync-4U654SEA.js +8 -0
  16. package/dist/_client/booking-widget.js +5 -5
  17. package/dist/affiliates/index.js +3 -3
  18. package/dist/analytics/index.js +4 -4
  19. package/dist/articles/index.js +1 -1
  20. package/dist/articles/server-ui.js +1 -1
  21. package/dist/chat/index.js +5 -5
  22. package/dist/{chunk-KXPBMCFL.js → chunk-3QI26673.js} +3 -1
  23. package/dist/{chunk-6HDT4G4A.js → chunk-4YTYGG2C.js} +2 -2
  24. package/dist/{chunk-O52CH273.js → chunk-542MIHNP.js} +1 -1
  25. package/dist/{chunk-N2UVOR3X.js → chunk-662ILEZ6.js} +2 -0
  26. package/dist/chunk-6G43IRWR.js +4 -0
  27. package/dist/{chunk-B6RZ2NRH.js → chunk-6OL23QYD.js} +1 -1
  28. package/dist/{chunk-GGD4P7UW.js → chunk-7FWA3I6A.js} +1 -1
  29. package/dist/{chunk-T4SY3FMN.js → chunk-B73QPZPH.js} +3 -3
  30. package/dist/{chunk-KPAZG65P.js → chunk-CGWUXUYZ.js} +138 -46
  31. package/dist/{chunk-56JNI463.js → chunk-DUQMSNF2.js} +1 -1
  32. package/dist/{chunk-5FBY2ZIH.js → chunk-EFPS56JA.js} +1 -1
  33. package/dist/{chunk-P72ZJRSX.js → chunk-EQBZ24VH.js} +3 -3
  34. package/dist/{chunk-K5WZX776.js → chunk-H42PZKVC.js} +2 -2
  35. package/dist/{chunk-TT63HHIT.js → chunk-HAG4YIZY.js} +1 -1
  36. package/dist/{chunk-ZRE4ZYEG.js → chunk-ICFRH2ED.js} +1 -1
  37. package/dist/{chunk-7JIKGKWD.js → chunk-ILAW3XKD.js} +30 -7
  38. package/dist/{chunk-SSUQKA7L.js → chunk-J4D6ZXRW.js} +1 -1
  39. package/dist/{chunk-SWP36NCB.js → chunk-JC7KXNNM.js} +1 -1
  40. package/dist/{chunk-LVESVYCE.js → chunk-JIL5VY2R.js} +11 -117
  41. package/dist/{chunk-BS7FWUOY.js → chunk-KOPVJQ2P.js} +1 -1
  42. package/dist/chunk-LPH5FANE.js +169 -0
  43. package/dist/{chunk-ZSLRAMCK.js → chunk-NEKEH4CK.js} +1 -1
  44. package/dist/{chunk-DKTSGYLM.js → chunk-ODADQM6Z.js} +2 -2
  45. package/dist/{chunk-OIETJKIL.js → chunk-OUNRFXDC.js} +1 -1
  46. package/dist/{chunk-RU2RMTGT.js → chunk-PXZ7LAOY.js} +2 -2
  47. package/dist/{chunk-SAUTJMK6.js → chunk-Q3S26EQA.js} +1 -1
  48. package/dist/{chunk-BEL7YFMC.js → chunk-R3VKF43H.js} +1 -1
  49. package/dist/{chunk-P2GIIQH5.js → chunk-RK7GF7PQ.js} +1 -1
  50. package/dist/{chunk-42OXY4JV.js → chunk-RTMMHTEQ.js} +1 -1
  51. package/dist/chunk-RYVDGXC2.js +19 -0
  52. package/dist/{chunk-LJZ3SUET.js → chunk-V4HUSHZO.js} +2 -2
  53. package/dist/chunk-VCJYLYJV.js +49 -0
  54. package/dist/{chunk-GYY6ETGB.js → chunk-ZAWANWUS.js} +9 -5
  55. package/dist/chunk-ZETJTCMV.js +118 -0
  56. package/dist/client/index.js +3 -3
  57. package/dist/cms/CmsPage.d.ts +1 -0
  58. package/dist/cms/CmsPreview.d.ts +1 -0
  59. package/dist/cms/CmsSection.d.ts +1 -0
  60. package/dist/cms/index.d.ts +6 -0
  61. package/dist/cms/server-api.d.ts +3 -0
  62. package/dist/commerce/index.js +4 -4
  63. package/dist/config/index.js +1 -1
  64. package/dist/contracts/entries.d.ts +1 -1
  65. package/dist/contracts/site-cache.d.ts +55 -0
  66. package/dist/contracts/site-edit-param.d.ts +7 -0
  67. package/dist/contracts/site-edit.d.ts +77 -0
  68. package/dist/contracts/slot-content.d.ts +111 -0
  69. package/dist/contracts/slots.d.ts +39 -25
  70. package/dist/engage/index.js +6 -6
  71. package/dist/fleet/index.js +4 -4
  72. package/dist/forms/index.js +8 -8
  73. package/dist/forms/server.js +2 -2
  74. package/dist/images/index.js +4 -4
  75. package/dist/index.js +1 -1
  76. package/dist/layout/client.js +8 -7
  77. package/dist/layout/index.js +9 -8
  78. package/dist/llms/index.js +4 -2
  79. package/dist/llms/seo-revalidate.d.ts +8 -1
  80. package/dist/maps/index.js +3 -3
  81. package/dist/mcp/sonor.js +6 -6
  82. package/dist/overlay-RXV6U6QC.js +353 -0
  83. package/dist/proxy/index.js +2 -2
  84. package/dist/proxy/securityHeaders.d.ts +4 -0
  85. package/dist/revalidate/index.d.ts +44 -0
  86. package/dist/revalidate/index.js +27 -0
  87. package/dist/seo/ManagedContent.d.ts +2 -0
  88. package/dist/seo/client.js +4 -4
  89. package/dist/seo/index.js +9 -8
  90. package/dist/seo/llms.js +4 -2
  91. package/dist/seo/register-sitemap-cli.js +1 -1
  92. package/dist/seo/server.js +3 -2
  93. package/dist/seo/sitemap.js +2 -2
  94. package/dist/server/index.js +2 -2
  95. package/dist/{server-api-GJJQZVG7.js → server-api-BVCBLJKL.js} +2 -1
  96. package/dist/shared/build-entries.d.ts +1 -0
  97. package/dist/shared/edit-bridge.d.ts +8 -0
  98. package/dist/shared/version.d.ts +1 -1
  99. package/dist/signal/index.js +2 -2
  100. package/dist/sitemap/index.js +2 -2
  101. package/dist/slots/ManagedLink.d.ts +31 -0
  102. package/dist/slots/ManagedList.d.ts +30 -0
  103. package/dist/slots/ManagedRichText.d.ts +31 -0
  104. package/dist/slots/contract.js +2 -1
  105. package/dist/slots/edit/locate.d.ts +30 -0
  106. package/dist/slots/edit/overlay.d.ts +18 -0
  107. package/dist/slots/index.d.ts +12 -4
  108. package/dist/slots/index.js +4 -2
  109. package/dist/slots/revalidate.d.ts +8 -3
  110. package/dist/slots/rich.d.ts +7 -0
  111. package/dist/slots/server-api.d.ts +6 -2
  112. package/dist/sync/index.js +5 -5
  113. package/dist/website/images.js +4 -4
  114. package/dist/website/index.js +5 -5
  115. package/dist/website/popups.js +4 -4
  116. package/dist/website/slots/contract.js +2 -1
  117. package/dist/website/slots.js +4 -2
  118. package/dist/{writeLLMsTxt-UMHKGNRR.js → writeLLMsTxt-QR23OQUE.js} +1 -1
  119. package/docs.json +2 -0
  120. package/package.json +6 -1
  121. package/src/revalidate/README.md +82 -0
  122. package/src/seo/README.md +4 -17
  123. package/src/slots/README.md +168 -0
  124. package/src/sync/README.md +1 -1
  125. package/dist/SitemapSync-NMXGMPCQ.js +0 -8
  126. package/dist/chunk-SS636UDN.js +0 -35
package/CHANGELOG.md CHANGED
@@ -1,5 +1,76 @@
1
1
  # @sonordev/site-kit Changelog
2
2
 
3
+ ## 7.1.1
4
+
5
+ - BookingWidget now asks every guest for a phone number before confirming a meeting, and sends it with the booking for CRM and Google Contacts use.
6
+
7
+ ## 7.1.0
8
+
9
+ ### Live updates (new)
10
+
11
+ - **`@sonordev/site-kit/revalidate`**: the route Sonor calls when content
12
+ changes, as a one-line file. Pages stay cached, and an edit in Sonor
13
+ (managed copy, metadata, an article, a portfolio item) regenerates only the
14
+ pages and cache tags it touched, within seconds:
15
+
16
+ ```ts
17
+ // app/api/seo-revalidate/route.ts
18
+ export { POST } from '@sonordev/site-kit/revalidate'
19
+ ```
20
+
21
+ `createRevalidateRoute({ publicationBasePath })` for a site with articles.
22
+ It reads `SONOR_API_KEY` on every call, so there's no new secret. See
23
+ [Live updates](src/revalidate/README.md).
24
+ - **Ping**: `{ "ping": true }` on its own regenerates nothing and answers
25
+ `{ ok, ping, version }`, so Sonor can confirm the route is installed before
26
+ it promises an edit will go live in seconds. `createSeoRevalidationHandler`
27
+ answers it too, so existing routes built on it need no change.
28
+ - SEO fetches carry the `seo` cache tag and slot fetches take theirs from the
29
+ shared list (`SITE_CACHE_TAGS`, `@sonordev/contracts/site-cache`), the
30
+ names Sonor sends.
31
+ - The Managed copy docs pointed at a separate slots route with its own
32
+ secret, which Sonor never called. They point at the one route now.
33
+
34
+ ### Edit on page (new)
35
+
36
+ - Sonor's dashboard can open the live site with its managed copy outlined:
37
+ click any of it to edit it, and see text, rich-text and link changes on the
38
+ page before publishing. Nothing to install beyond 7.1: no login, no secret,
39
+ no route. The overlay loads only when Sonor frames the page with
40
+ `?sonor_edit`; every other visitor gets an unchanged page and about 40
41
+ bytes of extra JavaScript. It finds copy by its visible text, so markup and
42
+ CSS stay exactly as written, and it never writes anything itself.
43
+ - `DEFAULT_FRAME_ANCESTORS` adds `https://app.sonor.io`, so the dashboard
44
+ can frame the site. A site that sets its own `frame-ancestors` should use
45
+ the default list.
46
+
47
+ ### Managed copy: rich text, links and lists
48
+
49
+ - **`<ManagedRichText>`**: paragraphs, bold, italic, links and lists, edited
50
+ in Sonor and rendered as elements (never HTML). A string child is the
51
+ fallback.
52
+ - **`<ManagedLink>`**: a label and a destination editable together; renders
53
+ a plain `<a>`, or pass a render function for your own button.
54
+ - **`<ManagedList>`**: repeatable items (title, body, link, image) with your
55
+ markup, e.g. a services grid or an FAQ.
56
+ - `getSlot(id, { type, fallbackValue })` resolves any of them without a
57
+ component. A value is only used when its kind matches what the code
58
+ renders, so changing a slot's kind in code falls back rather than breaking.
59
+ - Slots contract v2: the signature covers the structured value. Sonor still
60
+ serves text to older site-kit releases.
61
+ - New docs page: [Managed copy](src/slots/README.md).
62
+ - List items take photos: Sonor uploads them with the project's files and
63
+ records their size, so a gallery is a `<ManagedList>` (see "Lists with
64
+ photos" in the Managed copy docs).
65
+
66
+ ### Deprecated (removed in 8.0)
67
+
68
+ - **`./cms`, `./cms/server`, `./website/cms`, `./website/cms/server`**: the
69
+ Sanity CMS is retired. No project had CMS pages and Sonor no longer serves
70
+ them, so these render nothing. Use managed copy.
71
+ - **`<ManagedContent>` / `getManagedContentData`** (`./seo`): content blocks
72
+ are retired for the same reason. Use `<ManagedRichText>`.
73
+
3
74
  ## 7.0.2
4
75
 
5
76
  - The docs ship in the package: every module README, the migration guide and
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@sonordev/site-kit",
4
- "version": "7.0.2",
4
+ "version": "7.1.1",
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-GGD4P7UW.js';
1
+ export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-7FWA3I6A.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-RU2RMTGT.js';
9
- import './chunk-OIETJKIL.js';
10
- import './chunk-B6RZ2NRH.js';
8
+ import './chunk-PXZ7LAOY.js';
9
+ import './chunk-OUNRFXDC.js';
10
+ import './chunk-6OL23QYD.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-RU2RMTGT.js';
7
- import './chunk-OIETJKIL.js';
8
- import './chunk-B6RZ2NRH.js';
6
+ import { sonorFetch } from './chunk-PXZ7LAOY.js';
7
+ import './chunk-OUNRFXDC.js';
8
+ import './chunk-6OL23QYD.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-DKTSGYLM.js';
2
+ import { getSiteDesignTokens } from './chunk-ODADQM6Z.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-RU2RMTGT.js';
9
- import './chunk-OIETJKIL.js';
10
- import './chunk-B6RZ2NRH.js';
8
+ import './chunk-PXZ7LAOY.js';
9
+ import './chunk-OUNRFXDC.js';
10
+ import './chunk-6OL23QYD.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-LJZ3SUET.js';
1
+ export { ChatWidget, EchoChat, isChatEnabled } from './chunk-V4HUSHZO.js';
2
2
  import './chunk-JE4A5S4F.js';
3
3
  import './chunk-NDF4A5JM.js';
4
4
  import './chunk-6T6CQVNL.js';
5
- import './chunk-ZSLRAMCK.js';
5
+ import './chunk-NEKEH4CK.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-RU2RMTGT.js';
13
- import './chunk-OIETJKIL.js';
14
- import './chunk-B6RZ2NRH.js';
12
+ import './chunk-PXZ7LAOY.js';
13
+ import './chunk-OUNRFXDC.js';
14
+ import './chunk-6OL23QYD.js';
15
15
  import './chunk-PKBMQBKP.js';
@@ -1,11 +1,11 @@
1
- export { EngageWidget } from './chunk-T4SY3FMN.js';
1
+ export { EngageWidget } from './chunk-B73QPZPH.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-RU2RMTGT.js';
9
- import './chunk-OIETJKIL.js';
10
- import './chunk-B6RZ2NRH.js';
8
+ import './chunk-PXZ7LAOY.js';
9
+ import './chunk-OUNRFXDC.js';
10
+ import './chunk-6OL23QYD.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-RU2RMTGT.js';
3
- import './chunk-OIETJKIL.js';
4
- import './chunk-B6RZ2NRH.js';
2
+ import { sonorFetch } from './chunk-PXZ7LAOY.js';
3
+ import './chunk-OUNRFXDC.js';
4
+ import './chunk-6OL23QYD.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-SWP36NCB.js';
3
+ import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-JC7KXNNM.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-SWP36NCB.js';
3
+ import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-JC7KXNNM.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-P72ZJRSX.js';
2
- import './chunk-SWP36NCB.js';
1
+ export { ManagedForm } from './chunk-EQBZ24VH.js';
2
+ import './chunk-JC7KXNNM.js';
3
3
  import './chunk-DXO6SBMD.js';
4
4
  import './chunk-QPEEKFCA.js';
5
- import './chunk-ZSLRAMCK.js';
5
+ import './chunk-NEKEH4CK.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-RU2RMTGT.js';
12
- import './chunk-OIETJKIL.js';
13
- import './chunk-B6RZ2NRH.js';
11
+ import './chunk-PXZ7LAOY.js';
12
+ import './chunk-OUNRFXDC.js';
13
+ import './chunk-6OL23QYD.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-ZSLRAMCK.js';
3
+ import { useForm } from './chunk-NEKEH4CK.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-RU2RMTGT.js';
10
- import './chunk-OIETJKIL.js';
11
- import './chunk-B6RZ2NRH.js';
9
+ import './chunk-PXZ7LAOY.js';
10
+ import './chunk-OUNRFXDC.js';
11
+ import './chunk-6OL23QYD.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-RU2RMTGT.js';
6
- import { getFreshCredential, isSiteToken } from './chunk-OIETJKIL.js';
7
- import './chunk-B6RZ2NRH.js';
5
+ import { sonorFetch } from './chunk-PXZ7LAOY.js';
6
+ import { getFreshCredential, isSiteToken } from './chunk-OUNRFXDC.js';
7
+ import './chunk-6OL23QYD.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-ZRE4ZYEG.js';
2
- import './chunk-DKTSGYLM.js';
1
+ export { SiteDesignReporter } from './chunk-ICFRH2ED.js';
2
+ import './chunk-ODADQM6Z.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-RU2RMTGT.js';
9
- import './chunk-OIETJKIL.js';
10
- import './chunk-B6RZ2NRH.js';
8
+ import './chunk-PXZ7LAOY.js';
9
+ import './chunk-OUNRFXDC.js';
10
+ import './chunk-6OL23QYD.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -0,0 +1,8 @@
1
+ export { SitemapSync } from './chunk-KOPVJQ2P.js';
2
+ import './chunk-YVKRYQRG.js';
3
+ import './chunk-43OCZ3JA.js';
4
+ import './chunk-EKBEOXTH.js';
5
+ import './chunk-PXZ7LAOY.js';
6
+ import './chunk-OUNRFXDC.js';
7
+ import './chunk-6OL23QYD.js';
8
+ import './chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- export { BookingWidget, BookingWidget_default as default } from '../chunk-GYY6ETGB.js';
3
- import '../chunk-5FBY2ZIH.js';
4
- import '../chunk-RU2RMTGT.js';
5
- import '../chunk-OIETJKIL.js';
6
- import '../chunk-B6RZ2NRH.js';
2
+ export { BookingWidget, BookingWidget_default as default } from '../chunk-ZAWANWUS.js';
3
+ import '../chunk-EFPS56JA.js';
4
+ import '../chunk-PXZ7LAOY.js';
5
+ import '../chunk-OUNRFXDC.js';
6
+ import '../chunk-6OL23QYD.js';
7
7
  import '../chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-RU2RMTGT.js';
3
- import '../chunk-OIETJKIL.js';
4
- import '../chunk-B6RZ2NRH.js';
2
+ import { sonorFetch } from '../chunk-PXZ7LAOY.js';
3
+ import '../chunk-OUNRFXDC.js';
4
+ import '../chunk-6OL23QYD.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-GGD4P7UW.js';
3
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-7FWA3I6A.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-RU2RMTGT.js';
11
- import '../chunk-OIETJKIL.js';
12
- import '../chunk-B6RZ2NRH.js';
10
+ import '../chunk-PXZ7LAOY.js';
11
+ import '../chunk-OUNRFXDC.js';
12
+ import '../chunk-6OL23QYD.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-KJEU23BV.js'));
18
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-LPIKGJF4.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-V4KZB6QN.js');
135
+ const { ArticleViewTracker } = await import('../ArticleViewTracker-CMBSJR3N.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-LJZ3SUET.js';
2
+ export { ChatWidget, EchoChat, isChatEnabled } from '../chunk-V4HUSHZO.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-ZSLRAMCK.js';
6
+ import '../chunk-NEKEH4CK.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-RU2RMTGT.js';
14
- import '../chunk-OIETJKIL.js';
15
- import '../chunk-B6RZ2NRH.js';
13
+ import '../chunk-PXZ7LAOY.js';
14
+ import '../chunk-OUNRFXDC.js';
15
+ import '../chunk-6OL23QYD.js';
16
16
  import '../chunk-PKBMQBKP.js';
@@ -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,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,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-RU2RMTGT.js';
2
+ import { sonorFetch } from './chunk-PXZ7LAOY.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
5
5
 
@@ -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 };
@@ -1,4 +1,4 @@
1
1
  // src/shared/version.ts
2
- var SITE_KIT_VERSION = "7.0.2";
2
+ var SITE_KIT_VERSION = "7.1.1";
3
3
 
4
4
  export { SITE_KIT_VERSION };
@@ -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-RU2RMTGT.js';
6
+ import { sonorFetch, sonorBeacon } from './chunk-PXZ7LAOY.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';
@@ -2,7 +2,7 @@
2
2
  import { DEFAULT_ENGAGE_Z_INDEX } from './chunk-NDF4A5JM.js';
3
3
  import { getOrCreateVisitorId } from './chunk-24QZEO3Q.js';
4
4
  import { resolveAnalyticsTarget } from './chunk-43OCZ3JA.js';
5
- import { sonorFetch } from './chunk-RU2RMTGT.js';
5
+ import { sonorFetch } from './chunk-PXZ7LAOY.js';
6
6
  import React, { useState, useEffect, useCallback, useRef, createElement } from 'react';
7
7
  import ReactDOM from 'react-dom';
8
8
  import dynamic from 'next/dynamic';
@@ -339,11 +339,11 @@ function DesignRenderer({
339
339
  )) });
340
340
  }
341
341
  var LazyBlocksPopup = dynamic(
342
- () => import('./BlocksPopup-JHGHB6XW.js').then((m) => ({ default: m.BlocksPopup })),
342
+ () => import('./BlocksPopup-X3OAAK2L.js').then((m) => ({ default: m.BlocksPopup })),
343
343
  { ssr: false }
344
344
  );
345
345
  var LazyChatWidget = dynamic(
346
- () => import('./ChatWidget-CG32POI3.js').then((m) => ({ default: m.ChatWidget })),
346
+ () => import('./ChatWidget-JMFBXJ75.js').then((m) => ({ default: m.ChatWidget })),
347
347
  { ssr: false }
348
348
  );
349
349
  function EngageWidget(props) {