@sonordev/site-kit 8.9.0 → 8.11.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 (120) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/agent-manifest.json +1 -1
  3. package/dist/AddressAutocomplete-SQDJJOEF.js +241 -0
  4. package/dist/{AnalyticsProvider-X7JJN3QL.js → AnalyticsProvider-JDVLH5OV.js} +4 -4
  5. package/dist/{ArticleViewTracker-7Q6AMCKX.js → ArticleViewTracker-L6TFJ35X.js} +1 -1
  6. package/dist/{BlocksPopup-U5VIYEBA.js → BlocksPopup-5Q47LRN2.js} +3 -3
  7. package/dist/{ChatWidget-EAATOFCT.js → ChatWidget-4ILVGTK6.js} +5 -5
  8. package/dist/{FileField-YWMSK7RF.js → FileField-TLS53TPW.js} +1 -1
  9. package/dist/{FormSpotlight-MAXDW3TK.js → FormSpotlight-JPLIRN3H.js} +5 -4
  10. package/dist/{FormStage-VAHRVOIZ.js → FormStage-UBP57NY7.js} +5 -4
  11. package/dist/{ManagedForm-7IZT7ZII.js → ManagedForm-PFGM5X5H.js} +7 -7
  12. package/dist/{ManagedNewsletterForm-VVXZSEAL.js → ManagedNewsletterForm-GJU5KCGA.js} +10 -10
  13. package/dist/{SignalCore-HAN4O7QG.js → SignalCore-DGKCVQ74.js} +3 -3
  14. package/dist/{SiteChat-3JLCEL2N.js → SiteChat-EP25SEMP.js} +1 -1
  15. package/dist/{SiteDesignReporter-6CCO645E.js → SiteDesignReporter-NE6BQSVZ.js} +4 -4
  16. package/dist/{SitePopups-ZGHQNGGH.js → SitePopups-XJLZPV4L.js} +4 -4
  17. package/dist/{SitemapSync-5LSYCBKS.js → SitemapSync-35EAR2YA.js} +2 -2
  18. package/dist/_client/booking-widget.js +3 -3
  19. package/dist/_client/reviewed-signal-experiment.js +1 -1
  20. package/dist/affiliates/index.js +1 -1
  21. package/dist/analytics/index.js +4 -4
  22. package/dist/api-AHFVE5HN.js +5 -0
  23. package/dist/articles/index.js +1 -1
  24. package/dist/articles/server-ui.js +3 -3
  25. package/dist/articles/server.js +2 -2
  26. package/dist/chat/index.js +6 -6
  27. package/dist/{chunk-IO6BWRZ5.js → chunk-2URLL3Z2.js} +1 -1
  28. package/dist/{chunk-FAY6MOLL.js → chunk-3LGE3LRC.js} +1 -1
  29. package/dist/{chunk-MP35JETP.js → chunk-3VKJJNQU.js} +1 -1
  30. package/dist/{chunk-CVADNHJ4.js → chunk-3WMNHFZH.js} +9 -0
  31. package/dist/{chunk-T4A5J6SJ.js → chunk-52MFDOBB.js} +1 -1
  32. package/dist/{chunk-ISMHDUBW.js → chunk-5LCY7QKK.js} +1 -1
  33. package/dist/{chunk-VXCUXHZO.js → chunk-7OTHRX45.js} +1 -1
  34. package/dist/{chunk-6NLVHTYY.js → chunk-BHJTT63Y.js} +1 -1
  35. package/dist/{chunk-EBEM5BI5.js → chunk-CCZHAC4K.js} +3 -3
  36. package/dist/{chunk-QXAJPB6O.js → chunk-CIZ7Z3NU.js} +1 -1
  37. package/dist/{chunk-DXE6SXWW.js → chunk-CNQMSQYQ.js} +1 -1
  38. package/dist/{chunk-OUD4RTBD.js → chunk-DHGOFK5P.js} +2 -31
  39. package/dist/{chunk-UG53ZW7S.js → chunk-DHMBDPGA.js} +2 -2
  40. package/dist/chunk-FW63D6W3.js +77 -0
  41. package/dist/{chunk-S33CUULL.js → chunk-GZYIJ3JI.js} +11 -7
  42. package/dist/{chunk-VPZJ7ZTL.js → chunk-HHEDRZOJ.js} +1 -1
  43. package/dist/{chunk-YVEYO3OD.js → chunk-HWYJ3O7D.js} +1 -1
  44. package/dist/{chunk-KGIQYVQ2.js → chunk-I5S2XA7H.js} +8 -8
  45. package/dist/{chunk-J4LJE4NB.js → chunk-IDLJEFVB.js} +3 -1
  46. package/dist/{chunk-CJ43K7RA.js → chunk-JXH56PY3.js} +2 -2
  47. package/dist/{chunk-ADQ3VCKK.js → chunk-JYRBGL33.js} +1 -1
  48. package/dist/{chunk-F3RKFGRW.js → chunk-KWHR7PNA.js} +1 -1
  49. package/dist/{chunk-ZRSXCT4O.js → chunk-LY3Q6RU5.js} +1 -1
  50. package/dist/{chunk-NZHECYLF.js → chunk-N26GRGIP.js} +2 -2
  51. package/dist/{chunk-SO6RSRUP.js → chunk-NAO63YOG.js} +1 -1
  52. package/dist/{chunk-6EDE7BOE.js → chunk-OPJZSLGK.js} +2 -2
  53. package/dist/{chunk-HJD6KXKH.js → chunk-R53G2IKP.js} +1 -1
  54. package/dist/{chunk-PMXQPO5Q.js → chunk-UEF4AC76.js} +2 -2
  55. package/dist/{chunk-L3S5WH4C.js → chunk-UK4ANQUS.js} +1 -1
  56. package/dist/{chunk-AWLPFFPO.js → chunk-VA5NLFSL.js} +1 -1
  57. package/dist/{chunk-S63QY5XW.js → chunk-XHEUPCCU.js} +5 -3
  58. package/dist/{chunk-XDH5B3PR.js → chunk-XVB5V7D3.js} +2 -2
  59. package/dist/{chunk-WHFWDK2H.js → chunk-ZWTDI2JU.js} +1 -1
  60. package/dist/contracts/entries.d.ts +1 -1
  61. package/dist/contracts/property-interest.d.ts +100 -0
  62. package/dist/contracts/resonance.d.ts +1705 -358
  63. package/dist/contracts/sales-call-prep.d.ts +666 -0
  64. package/dist/contracts/signal-experiments.d.ts +0 -1
  65. package/dist/contracts/wire-uuid.d.ts +5 -0
  66. package/dist/controls-YQ3MGZJG.js +14 -0
  67. package/dist/fleet/index.js +3 -3
  68. package/dist/forms/AddressAutocomplete.d.ts +20 -0
  69. package/dist/forms/FormClient.d.ts +2 -1
  70. package/dist/forms/FormEnhancer.d.ts +2 -1
  71. package/dist/forms/FormField.d.ts +2 -0
  72. package/dist/forms/FormSpotlight.d.ts +1 -1
  73. package/dist/forms/FormStage.d.ts +1 -1
  74. package/dist/forms/ManagedForm.d.ts +1 -1
  75. package/dist/forms/ServerForm.d.ts +2 -1
  76. package/dist/forms/controls.d.ts +5 -0
  77. package/dist/forms/field-controls.d.ts +4 -2
  78. package/dist/forms/index.d.ts +1 -1
  79. package/dist/forms/index.js +10 -10
  80. package/dist/forms/server.js +4 -4
  81. package/dist/forms/static.js +2 -2
  82. package/dist/forms/types.d.ts +9 -0
  83. package/dist/images/index.js +2 -2
  84. package/dist/index.js +1 -1
  85. package/dist/landing/server.js +7 -7
  86. package/dist/layout/client.js +6 -6
  87. package/dist/layout/index.js +7 -7
  88. package/dist/llms/index.js +4 -4
  89. package/dist/maps/index.js +8 -78
  90. package/dist/maps/places-library.d.ts +34 -0
  91. package/dist/mcp/sonor.js +7 -7
  92. package/dist/places-library-RU2YNKFK.js +54 -0
  93. package/dist/resonance/ConsentPreferences.d.ts +8 -0
  94. package/dist/resonance/consent-adapter.d.ts +3 -0
  95. package/dist/resonance/first-party-consent.d.ts +22 -0
  96. package/dist/resonance/index.d.ts +1 -0
  97. package/dist/resonance/index.js +272 -2
  98. package/dist/revalidate/index.js +2 -2
  99. package/dist/runtime/index.js +1 -1
  100. package/dist/{runtime-core-WT7KKLWQ.js → runtime-core-WSKES5UP.js} +523 -7
  101. package/dist/seo/client.js +2 -2
  102. package/dist/seo/index.js +2 -2
  103. package/dist/seo/llms.js +4 -4
  104. package/dist/seo/register-sitemap-cli.js +1 -1
  105. package/dist/seo/sitemap.js +2 -2
  106. package/dist/server/index.js +2 -2
  107. package/dist/shared/version.d.ts +1 -1
  108. package/dist/signal/index.js +2 -2
  109. package/dist/sitemap/index.js +2 -2
  110. package/dist/{sonor-fetch-runtime-3PFGUXMF.js → sonor-fetch-runtime-JDVDCTKI.js} +2 -2
  111. package/dist/sync/index.js +3 -3
  112. package/dist/website/images.js +2 -2
  113. package/dist/website/index.js +4 -4
  114. package/dist/website/landing/server.js +7 -7
  115. package/dist/website/popups.js +4 -4
  116. package/dist/{writeLLMsTxt-JUACXQKP.js → writeLLMsTxt-SYLPYWUX.js} +1 -1
  117. package/package.json +1 -1
  118. package/src/forms/README.md +47 -0
  119. package/src/resonance/README.md +16 -0
  120. /package/dist/{chunk-QLJ2SC3T.js → chunk-ES52W5EE.js} +0 -0
@@ -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-JUACXQKP.js');
461
+ const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-SYLPYWUX.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-YVEYO3OD.js';
2
- import '../chunk-QLJ2SC3T.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-HWYJ3O7D.js';
2
+ import '../chunk-ES52W5EE.js';
3
3
  import '../chunk-EK7P62DT.js';
4
4
  import '../chunk-Z22QVHT4.js';
5
5
  import '../chunk-7DYMM6SS.js';
@@ -1,8 +1,8 @@
1
1
  import '../chunk-34ZYJTQR.js';
2
- export { resolveClientCredential } from '../chunk-L3S5WH4C.js';
2
+ export { resolveClientCredential } from '../chunk-UK4ANQUS.js';
3
3
  import '../chunk-UAYAJPEP.js';
4
4
  export { SITE_CACHE_TAGS } from '../chunk-HY7ZEU2C.js';
5
5
  export { isNextControlFlow, requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch } from '../chunk-7VMA3KCN.js';
6
6
  import '../chunk-MH2DSGC6.js';
7
- import '../chunk-DXE6SXWW.js';
7
+ import '../chunk-CNQMSQYQ.js';
8
8
  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.9.0";
10
+ export declare const SITE_KIT_VERSION = "8.11.0";
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { ExperimentConversion, SignalExperiment, useExperimentVariant } from '../chunk-F3RKFGRW.js';
3
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-HJD6KXKH.js';
2
+ export { ExperimentConversion, SignalExperiment, useExperimentVariant } from '../chunk-KWHR7PNA.js';
3
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-R53G2IKP.js';
4
4
  import '../chunk-MOACHHOJ.js';
5
5
  import '../chunk-FRY6PBT6.js';
6
6
  import '../chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-YVEYO3OD.js';
2
- import '../chunk-QLJ2SC3T.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-HWYJ3O7D.js';
2
+ import '../chunk-ES52W5EE.js';
3
3
  import '../chunk-EK7P62DT.js';
4
4
  import '../chunk-Z22QVHT4.js';
5
5
  import '../chunk-7DYMM6SS.js';
@@ -1,7 +1,7 @@
1
- import { getFreshCredential, refreshSiteToken } from './chunk-FAY6MOLL.js';
1
+ import { getFreshCredential, refreshSiteToken } from './chunk-3LGE3LRC.js';
2
2
  import { isSiteToken, credentialBreakerId } from './chunk-TPHOIE4I.js';
3
3
  import { isTokenMode } from './chunk-D4M5K6JN.js';
4
- import { SITE_KIT_VERSION } from './chunk-DXE6SXWW.js';
4
+ import { SITE_KIT_VERSION } from './chunk-CNQMSQYQ.js';
5
5
  import './chunk-PKBMQBKP.js';
6
6
 
7
7
  // src/shared/fetchWithRetry.ts
@@ -1,8 +1,8 @@
1
- export { BookingWidget } from '../chunk-MP35JETP.js';
2
- export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-ZRSXCT4O.js';
1
+ export { BookingWidget } from '../chunk-3VKJJNQU.js';
2
+ export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-LY3Q6RU5.js';
3
3
  import '../chunk-PVY7X5UR.js';
4
4
  import '../chunk-5IVD6G77.js';
5
- import '../chunk-VXCUXHZO.js';
5
+ import '../chunk-7OTHRX45.js';
6
6
  import '../chunk-W7OPEMGJ.js';
7
7
  import '../chunk-FRY6PBT6.js';
8
8
  import '../chunk-PKBMQBKP.js';
@@ -1,4 +1,4 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-T4A5J6SJ.js';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-52MFDOBB.js';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
3
- import '../chunk-VXCUXHZO.js';
3
+ import '../chunk-7OTHRX45.js';
4
4
  import '../chunk-PKBMQBKP.js';
@@ -1,14 +1,14 @@
1
1
  'use client';
2
- export { SiteDesignReporter } from '../chunk-IO6BWRZ5.js';
3
- export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-6EDE7BOE.js';
2
+ export { SiteDesignReporter } from '../chunk-2URLL3Z2.js';
3
+ export { SITE_DESIGN_PATH, cleanFontStack, colorToHex, getSiteDesignTokens, measureSiteDesign, readDeclaredDesign, sendSiteDesign } from '../chunk-OPJZSLGK.js';
4
4
  export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-52KO4LKD.js';
5
5
  import '../chunk-XLAHRN4B.js';
6
6
  import '../chunk-XHYE24HU.js';
7
7
  import '../chunk-YC7ELZS3.js';
8
8
  import '../chunk-S22FSH7C.js';
9
- import '../chunk-DXE6SXWW.js';
9
+ import '../chunk-CNQMSQYQ.js';
10
10
  import '../chunk-7643MCD2.js';
11
11
  import '../chunk-64XODP7M.js';
12
- import '../chunk-VXCUXHZO.js';
12
+ import '../chunk-7OTHRX45.js';
13
13
  import '../chunk-W7OPEMGJ.js';
14
14
  import '../chunk-PKBMQBKP.js';
@@ -1,17 +1,17 @@
1
- export { FunnelPageContent, ManagedFunnelPage, getPublishedFunnelPage, managedFunnelMetadata } from '../../chunk-NZHECYLF.js';
1
+ export { FunnelPageContent, ManagedFunnelPage, getPublishedFunnelPage, managedFunnelMetadata } from '../../chunk-N26GRGIP.js';
2
2
  import '../../chunk-XS2ORMUG.js';
3
3
  import '../../chunk-XJZLXUTG.js';
4
4
  import '../../chunk-7IZUUXXO.js';
5
5
  export { normalizeCampaignSlug } from '../../chunk-2QPVU63T.js';
6
6
  export { landingPageMetadata } from '../../chunk-JESLPEST.js';
7
7
  import '../../chunk-XHYE24HU.js';
8
- import '../../chunk-S63QY5XW.js';
9
- import '../../chunk-J4LJE4NB.js';
8
+ import '../../chunk-XHEUPCCU.js';
9
+ import '../../chunk-IDLJEFVB.js';
10
10
  import '../../chunk-C2FZBUSS.js';
11
11
  import '../../chunk-YC7ELZS3.js';
12
- import '../../chunk-VPZJ7ZTL.js';
12
+ import '../../chunk-HHEDRZOJ.js';
13
13
  import '../../chunk-DXO6SBMD.js';
14
- import '../../chunk-CVADNHJ4.js';
14
+ import '../../chunk-3WMNHFZH.js';
15
15
  import '../../chunk-TYSIAWC3.js';
16
16
  import '../../chunk-HW7B43E5.js';
17
17
  import '../../chunk-NJCTQH2P.js';
@@ -19,8 +19,8 @@ import '../../chunk-7VMA3KCN.js';
19
19
  import '../../chunk-MH2DSGC6.js';
20
20
  import '../../chunk-S22FSH7C.js';
21
21
  import '../../chunk-A4CC4ZG3.js';
22
- import '../../chunk-F3RKFGRW.js';
23
- import '../../chunk-HJD6KXKH.js';
22
+ import '../../chunk-KWHR7PNA.js';
23
+ import '../../chunk-R53G2IKP.js';
24
24
  import '../../chunk-MOACHHOJ.js';
25
25
  import '../../chunk-FRY6PBT6.js';
26
26
  import '../../chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { SitePopups } from '../chunk-EBEM5BI5.js';
2
+ export { SitePopups } from '../chunk-CCZHAC4K.js';
3
3
  import '../chunk-27FISYK4.js';
4
4
  export { DEFAULT_POPUP_TOKENS, PopupBlocks } from '../chunk-52KO4LKD.js';
5
5
  import '../chunk-XLAHRN4B.js';
@@ -7,17 +7,17 @@ import '../chunk-XHYE24HU.js';
7
7
  import '../chunk-PVY7X5UR.js';
8
8
  import '../chunk-S22FSH7C.js';
9
9
  import '../chunk-JT7GHHMV.js';
10
- import '../chunk-PMXQPO5Q.js';
10
+ import '../chunk-UEF4AC76.js';
11
11
  import '../chunk-NHDRA4Y5.js';
12
12
  import '../chunk-D4M5K6JN.js';
13
13
  import '../chunk-GJWI74ZZ.js';
14
14
  import '../chunk-NZOJHERI.js';
15
15
  import '../chunk-KMNHNCVG.js';
16
16
  import '../chunk-5IVD6G77.js';
17
- import '../chunk-DXE6SXWW.js';
17
+ import '../chunk-CNQMSQYQ.js';
18
18
  import '../chunk-7643MCD2.js';
19
19
  import '../chunk-64XODP7M.js';
20
- import '../chunk-VXCUXHZO.js';
20
+ import '../chunk-7OTHRX45.js';
21
21
  import '../chunk-W7OPEMGJ.js';
22
22
  import '../chunk-A4CC4ZG3.js';
23
23
  import '../chunk-FRY6PBT6.js';
@@ -1,4 +1,4 @@
1
- export { writeLLMsTxtToPublic } from './chunk-QLJ2SC3T.js';
1
+ export { writeLLMsTxtToPublic } from './chunk-ES52W5EE.js';
2
2
  import './chunk-EK7P62DT.js';
3
3
  import './chunk-7DYMM6SS.js';
4
4
  import './chunk-IBHBEUZV.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonordev/site-kit",
3
- "version": "8.9.0",
3
+ "version": "8.11.0",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@11.5.3",
6
6
  "description": "Sonor's Next.js foundation: SEO, analytics, forms, chat, booking, AI visibility and agent tools. Add @sonordev/press-kit for publications or @sonordev/commerce-kit for selling. Legacy article imports remain compatible in 8.x.",
@@ -101,6 +101,53 @@ export function ContactForm() {
101
101
  }
102
102
  ```
103
103
 
104
+ #### Google address suggestions
105
+
106
+ Unreleased: this option is prepared for the next Site Kit release.
107
+
108
+ Opt specific managed text fields into Google address suggestions with their
109
+ exact Sonor slugs. The field must already exist in the form configuration:
110
+
111
+ ```tsx
112
+ <ManagedForm
113
+ formId="inquiry"
114
+ addressAutocomplete={{ fields: ['street_address'], includedRegionCodes: ['us'] }}
115
+ />
116
+ ```
117
+
118
+ `addressAutocomplete` is also available on `ServerForm` and `FormEnhancer`.
119
+ It works in the classic, spotlight and stage experiences. `fields` accepts
120
+ one or more text-field slugs; other field types and unlisted fields keep
121
+ their existing behavior. `includedRegionCodes` optionally restricts
122
+ suggestions to up to 15 two-letter country codes. Omit it for unrestricted
123
+ suggestions. The exported type is `AddressAutocompleteOptions`.
124
+
125
+ The field keeps its label, controlled value, validation and managed
126
+ submission. Choosing a suggestion fills that field with the formatted
127
+ address; it doesn't fill separate city, state or postal-code fields.
128
+ Visitors can keep typing or edit the selected address. Use the arrow keys
129
+ and Enter to choose a suggestion, Escape to dismiss, or touch a result.
130
+ Enter without an active suggestion keeps its normal form behavior.
131
+
132
+ Google code and Sonor's browser-key lookup start after field interaction;
133
+ predictions start at three characters and are debounced. Each field owns
134
+ its search session, and selection requests only the formatted address.
135
+ Missing keys, failed loads, unsupported existing Google scripts and request
136
+ errors leave manual entry available. Suggestions use Google Maps
137
+ attribution and aren't stored in browser persistence. The selected address
138
+ is submitted through the normal managed-form path.
139
+
140
+ Your Sonor installation needs a dedicated Google browser key with the
141
+ site's HTTP referrer allowed and Maps JavaScript API and Places API (New)
142
+ enabled. Sites still use their existing `SONOR_API_KEY`; they don't need
143
+ Sonor's Google server key. Keep your privacy notice consistent with address
144
+ queries being sent to Google. See Google's [Autocomplete data guide](https://developers.google.com/maps/documentation/javascript/place-autocomplete-data).
145
+
146
+ This option enhances the built-in field renderers. A `children` render
147
+ function or a headless `useForm` layout owns its controls, so it doesn't
148
+ automatically receive a suggestion UI. Browser autofill tokens below stay
149
+ available for those controls.
150
+
104
151
  #### Autocomplete on your own controls
105
152
 
106
153
  `ManagedForm` puts the right `autocomplete` token on each field that has one, so
@@ -11,6 +11,22 @@ On dynamic routes with Next.js Cache Components, the layout gives the
11
11
  pathname-dependent runtime its own Suspense boundary. Measurement stays
12
12
  blocked while it's unresolved, and page content renders independently.
13
13
 
14
+ ## First-party privacy preferences
15
+
16
+ For a site without a consent manager, mount `ResonanceConsentPreferences` once alongside `SiteKitLayout`.
17
+
18
+ ```tsx
19
+ import { ResonanceConsentPreferences } from '@sonordev/site-kit/resonance'
20
+
21
+ <ResonanceConsentPreferences privacyUrl="/privacy" />
22
+ ```
23
+
24
+ Visitors can choose visit measurement and advertising separately, decline optional purposes, and reopen Privacy choices to withdraw. Both optional choices start off. The component uses the existing adapter registration and keeps an already registered consent manager in charge.
25
+
26
+ A choice needs a fresh, enabled native configuration. The component waits while settings are unavailable. Stored preferences belong to the exact site, project, configuration and policy revisions. They expire after 180 days by default, with `maxAgeDays` configurable from 1 to 180. Native proof expiry is checked independently. If browser storage is unavailable, the choice lasts for the current tab. Withdrawal and cross-tab changes notify the existing runtime.
27
+
28
+ This component records preferences through the native consent owner. Configure the real page rules, destinations and approved visit feed before verifying advertising delivery.
29
+
14
30
  ## Connect your consent manager
15
31
 
16
32
  Register one adapter for the consent manager your site already uses. The
File without changes