@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @sonordev/site-kit Changelog
2
2
 
3
+ ## 8.11.0
4
+
5
+ - Add opt-in first-party privacy preferences for sites without an existing consent manager. Visitors can choose measurement and advertising separately, reopen their choices, and withdraw. Preferences bind current native configuration and policy revisions and expire independently of native receipts.
6
+
7
+ ## 8.10.0
8
+
9
+ - Add opt-in Google address suggestions for existing managed text fields. Manual entry stays available, and the same controlled input works in classic, spotlight and stage forms. Suggestions load after interaction, support keyboard and touch selection, and use Sonor's managed browser key.
10
+
3
11
  ## 8.9.0
4
12
 
5
13
  - Keep the CTA bar's actions and page content server-rendered on dynamic routes with Next.js Cache Components. Pathname-dependent CTA behavior and the Resonance runtime wait inside their own Suspense boundaries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@sonordev/site-kit",
4
- "version": "8.9.0",
4
+ "version": "8.11.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": [
@@ -0,0 +1,241 @@
1
+ 'use client';
2
+ import './chunk-PKBMQBKP.js';
3
+ import { useRef, useState, useId, useCallback, useEffect } from 'react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ var MANUAL_ENTRY = "Address suggestions are unavailable. You can enter your address manually.";
7
+ var visuallyHidden = { position: "absolute", width: 1, height: 1, padding: 0, overflow: "hidden", clip: "rect(0,0,0,0)", whiteSpace: "nowrap" };
8
+ var ATTRIBUTION_CSS = ".sk-form__address-attribution{padding:4px 12px 8px;font-family:Roboto,sans-serif;font-size:12px;font-style:normal;font-weight:400;letter-spacing:normal;white-space:nowrap;text-align:right;color:#1f1f1f;background:#fff}";
9
+ function AddressAutocompleteControl({ field, options, value, onChange }) {
10
+ return typeof onChange === "function" && field.field_type === "text" && options?.fields.includes(field.slug) ? /* @__PURE__ */ jsx(AddressAutocomplete, { onChange, value: String(value || ""), includedRegionCodes: options.includedRegionCodes }) : null;
11
+ }
12
+ function AddressAutocomplete({ value, onChange, includedRegionCodes }) {
13
+ const host = useRef(null);
14
+ const input = useRef(null);
15
+ const library = useRef(null);
16
+ const token = useRef(null);
17
+ const generation = useRef(0);
18
+ const timer = useRef(void 0);
19
+ const alive = useRef(false);
20
+ const booting = useRef(false);
21
+ const onChangeRef = useRef(onChange);
22
+ onChangeRef.current = onChange;
23
+ const lastValue = useRef(value);
24
+ const predictionsRef = useRef([]);
25
+ const activeRef = useRef(-1);
26
+ const [predictions, setPredictions] = useState([]);
27
+ const [active, setActive] = useState(-1);
28
+ const [message, setMessage] = useState("");
29
+ const id = useId().replace(/:/g, "");
30
+ const listId = `sk-address-${id}`;
31
+ const statusId = `${listId}-status`;
32
+ const regionsKey = JSON.stringify(includedRegionCodes ?? []);
33
+ const close = useCallback(() => {
34
+ generation.current++;
35
+ clearTimeout(timer.current);
36
+ predictionsRef.current = [];
37
+ activeRef.current = -1;
38
+ setPredictions([]);
39
+ setActive(-1);
40
+ }, []);
41
+ const unavailable = useCallback(() => {
42
+ if (!alive.current) return;
43
+ close();
44
+ token.current = null;
45
+ setMessage(MANUAL_ENTRY);
46
+ }, [close]);
47
+ const search = useCallback((query) => {
48
+ close();
49
+ if (query.trim().length < 3 || !library.current) {
50
+ setMessage("");
51
+ return;
52
+ }
53
+ const codes = JSON.parse(regionsKey);
54
+ if (codes.length > 15 || codes.some((code) => !/^[a-zA-Z]{2}$/.test(code))) {
55
+ unavailable();
56
+ return;
57
+ }
58
+ const stamp = generation.current;
59
+ timer.current = setTimeout(async () => {
60
+ if (!alive.current || stamp !== generation.current || document.activeElement !== input.current) return;
61
+ const sdk = library.current;
62
+ token.current ?? (token.current = new sdk.AutocompleteSessionToken());
63
+ setMessage("Looking for address suggestions\u2026");
64
+ try {
65
+ const result = await sdk.AutocompleteSuggestion.fetchAutocompleteSuggestions({
66
+ input: query,
67
+ sessionToken: token.current,
68
+ ...codes.length ? { includedRegionCodes: codes.map((code) => code.toLowerCase()) } : {}
69
+ });
70
+ if (!alive.current || stamp !== generation.current) return;
71
+ const items = result.suggestions.flatMap((item) => item.placePrediction ? [item.placePrediction] : []).slice(0, 5);
72
+ predictionsRef.current = items;
73
+ setPredictions(items);
74
+ setMessage(items.length ? `${items.length} address suggestions available. Use the arrow keys to choose.` : "No suggestions found. You can enter your address manually.");
75
+ } catch {
76
+ if (alive.current && stamp === generation.current) unavailable();
77
+ }
78
+ }, 250);
79
+ }, [close, regionsKey, unavailable]);
80
+ const ready = useCallback((sdk) => {
81
+ if (!alive.current) return;
82
+ if (!sdk.AutocompleteSuggestion?.fetchAutocompleteSuggestions || !sdk.AutocompleteSessionToken) {
83
+ unavailable();
84
+ return;
85
+ }
86
+ library.current = sdk;
87
+ if (input.current && document.activeElement === input.current) search(input.current.value);
88
+ }, [search, unavailable]);
89
+ const select = useCallback(async (prediction) => {
90
+ close();
91
+ token.current = null;
92
+ const stamp = generation.current;
93
+ setMessage("Using selected address\u2026");
94
+ try {
95
+ const place = prediction.toPlace();
96
+ await place.fetchFields({ fields: ["formattedAddress"] });
97
+ if (!alive.current || stamp !== generation.current) return;
98
+ if (!place.formattedAddress) {
99
+ unavailable();
100
+ return;
101
+ }
102
+ lastValue.current = place.formattedAddress;
103
+ onChangeRef.current(place.formattedAddress);
104
+ setMessage("Address selected. You can edit it manually.");
105
+ } catch {
106
+ if (alive.current && stamp === generation.current) unavailable();
107
+ }
108
+ }, [close, unavailable]);
109
+ useEffect(() => {
110
+ alive.current = true;
111
+ let disposed = false;
112
+ const control = host.current?.parentElement?.querySelector("input");
113
+ if (!control) return () => {
114
+ alive.current = false;
115
+ };
116
+ input.current = control;
117
+ const old = new Map(["role", "aria-autocomplete", "aria-controls", "aria-expanded", "aria-activedescendant"].map((name) => [name, control.getAttribute(name)]));
118
+ control.setAttribute("role", "combobox");
119
+ control.setAttribute("aria-autocomplete", "list");
120
+ control.setAttribute("aria-expanded", "false");
121
+ const boot = async () => {
122
+ if (library.current || booting.current) return;
123
+ booting.current = true;
124
+ try {
125
+ const [{ fetchMapsConfig }, { loadAddressPlaces }] = await Promise.all([import('./api-AHFVE5HN.js'), import('./places-library-RU2YNKFK.js')]);
126
+ const config = await fetchMapsConfig();
127
+ if (disposed || !alive.current) return;
128
+ if (!config?.apiKey) {
129
+ unavailable();
130
+ return;
131
+ }
132
+ const sdk = await loadAddressPlaces(config.apiKey);
133
+ if (!disposed && alive.current) ready(sdk);
134
+ } catch {
135
+ if (!disposed) unavailable();
136
+ }
137
+ };
138
+ const schedule = () => {
139
+ const query = control.value;
140
+ const stamp = ++generation.current;
141
+ clearTimeout(timer.current);
142
+ timer.current = setTimeout(() => {
143
+ if (disposed || !alive.current || generation.current !== stamp) return;
144
+ void boot();
145
+ search(query);
146
+ }, 0);
147
+ };
148
+ const focus = () => {
149
+ schedule();
150
+ };
151
+ const change = () => {
152
+ lastValue.current = control.value;
153
+ schedule();
154
+ };
155
+ const blur = () => {
156
+ close();
157
+ token.current = null;
158
+ setMessage("");
159
+ };
160
+ const keydown = (event) => {
161
+ if (event.isComposing) return;
162
+ const items = predictionsRef.current;
163
+ if (items.length && (event.key === "ArrowDown" || event.key === "ArrowUp")) {
164
+ event.preventDefault();
165
+ event.stopPropagation();
166
+ const next = event.key === "ArrowDown" ? (activeRef.current + 1) % items.length : activeRef.current <= 0 ? items.length - 1 : activeRef.current - 1;
167
+ activeRef.current = next;
168
+ setActive(next);
169
+ } else if (event.key === "Enter" && activeRef.current >= 0 && items[activeRef.current]) {
170
+ event.preventDefault();
171
+ event.stopPropagation();
172
+ void select(items[activeRef.current]);
173
+ } else if (event.key === "Escape") {
174
+ close();
175
+ setMessage("");
176
+ }
177
+ };
178
+ control.addEventListener("focus", focus);
179
+ control.addEventListener("input", change);
180
+ control.addEventListener("blur", blur);
181
+ control.addEventListener("keydown", keydown);
182
+ if (document.activeElement === control) focus();
183
+ return () => {
184
+ disposed = true;
185
+ alive.current = false;
186
+ booting.current = false;
187
+ generation.current++;
188
+ clearTimeout(timer.current);
189
+ control.removeEventListener("focus", focus);
190
+ control.removeEventListener("input", change);
191
+ control.removeEventListener("blur", blur);
192
+ control.removeEventListener("keydown", keydown);
193
+ old.forEach((v, name) => v === null ? control.removeAttribute(name) : control.setAttribute(name, v));
194
+ control.setAttribute("aria-describedby", (control.getAttribute("aria-describedby") ?? "").split(" ").filter((x) => x && x !== statusId).join(" "));
195
+ input.current = null;
196
+ };
197
+ }, [close, listId, search, select, statusId, unavailable, ready]);
198
+ useEffect(() => {
199
+ if (value !== lastValue.current) {
200
+ lastValue.current = value;
201
+ close();
202
+ setMessage("");
203
+ }
204
+ }, [value, close]);
205
+ useEffect(() => {
206
+ const control = input.current;
207
+ if (!control) return;
208
+ control.setAttribute("aria-expanded", String(predictions.length > 0));
209
+ if (predictions.length) control.setAttribute("aria-controls", listId);
210
+ else control.removeAttribute("aria-controls");
211
+ if (active >= 0 && predictions[active]) control.setAttribute("aria-activedescendant", `${listId}-${active}`);
212
+ else control.removeAttribute("aria-activedescendant");
213
+ const descriptions = new Set((control.getAttribute("aria-describedby") ?? "").split(" ").filter(Boolean));
214
+ descriptions.add(statusId);
215
+ control.setAttribute("aria-describedby", [...descriptions].join(" "));
216
+ }, [predictions, active, listId, statusId, value]);
217
+ return /* @__PURE__ */ jsxs("div", { ref: host, "data-sk-address-autocomplete": "", style: { display: "contents" }, children: [
218
+ /* @__PURE__ */ jsx("span", { id: statusId, role: "status", "aria-live": "polite", style: visuallyHidden, children: message }),
219
+ predictions.length > 0 && /* @__PURE__ */ jsxs("div", { style: { position: "relative", marginTop: 4, border: "1px solid var(--sk-input-border, #d1d5db)", borderRadius: "var(--sk-input-radius, 6px)", background: "var(--sk-input-bg, #ffffff)", color: "var(--sk-input-text, var(--sk-text-primary, #111827))" }, children: [
220
+ /* @__PURE__ */ jsx("ul", { id: listId, role: "listbox", "aria-label": "Address suggestions", style: { listStyle: "none", padding: 0, margin: 0 }, children: predictions.map((prediction, index) => /* @__PURE__ */ jsx(
221
+ "li",
222
+ {
223
+ id: `${listId}-${index}`,
224
+ role: "option",
225
+ "aria-selected": index === active,
226
+ onPointerDown: (event) => {
227
+ event.preventDefault();
228
+ void select(prediction);
229
+ },
230
+ style: { padding: "10px 12px", cursor: "pointer", background: index === active ? "var(--sk-surface-hover, rgba(0,0,0,0.06))" : void 0 },
231
+ children: prediction.text.toString()
232
+ },
233
+ prediction.placeId
234
+ )) }),
235
+ /* @__PURE__ */ jsx("style", { href: "sk-address-attribution", precedence: "sk", children: ATTRIBUTION_CSS }),
236
+ /* @__PURE__ */ jsx("div", { translate: "no", className: "sk-form__address-attribution", children: "Google Maps" })
237
+ ] })
238
+ ] });
239
+ }
240
+
241
+ export { AddressAutocomplete, AddressAutocompleteControl };
@@ -1,18 +1,18 @@
1
- export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-SO6RSRUP.js';
1
+ export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-NAO63YOG.js';
2
2
  import './chunk-AG2RDHYZ.js';
3
3
  import './chunk-JT7GHHMV.js';
4
4
  import './chunk-L2V5PUFN.js';
5
- import './chunk-PMXQPO5Q.js';
5
+ import './chunk-UEF4AC76.js';
6
6
  import './chunk-NHDRA4Y5.js';
7
7
  import './chunk-D4M5K6JN.js';
8
8
  import './chunk-GJWI74ZZ.js';
9
9
  import './chunk-NZOJHERI.js';
10
10
  import './chunk-KMNHNCVG.js';
11
11
  import './chunk-5IVD6G77.js';
12
- import './chunk-DXE6SXWW.js';
12
+ import './chunk-CNQMSQYQ.js';
13
13
  import './chunk-7643MCD2.js';
14
14
  import './chunk-64XODP7M.js';
15
- import './chunk-VXCUXHZO.js';
15
+ import './chunk-7OTHRX45.js';
16
16
  import './chunk-W7OPEMGJ.js';
17
17
  import './chunk-A4CC4ZG3.js';
18
18
  import './chunk-FRY6PBT6.js';
@@ -16,7 +16,7 @@ import './chunk-JT7GHHMV.js';
16
16
  import './chunk-D4M5K6JN.js';
17
17
  import './chunk-GJWI74ZZ.js';
18
18
  import './chunk-5IVD6G77.js';
19
- import { sonorFetch } from './chunk-VXCUXHZO.js';
19
+ import { sonorFetch } from './chunk-7OTHRX45.js';
20
20
  import { readPublishedApiConfig, readPublishedSite } from './chunk-W7OPEMGJ.js';
21
21
  import './chunk-A4CC4ZG3.js';
22
22
  import './chunk-FRY6PBT6.js';
@@ -1,13 +1,13 @@
1
1
  'use client';
2
- import { getSiteDesignTokens } from './chunk-6EDE7BOE.js';
2
+ import { getSiteDesignTokens } from './chunk-OPJZSLGK.js';
3
3
  import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-52KO4LKD.js';
4
4
  import './chunk-XLAHRN4B.js';
5
5
  import { normalizePopupBlocks, toHexColor, readableOn } from './chunk-XHYE24HU.js';
6
6
  import './chunk-S22FSH7C.js';
7
- import './chunk-DXE6SXWW.js';
7
+ import './chunk-CNQMSQYQ.js';
8
8
  import './chunk-7643MCD2.js';
9
9
  import './chunk-64XODP7M.js';
10
- import './chunk-VXCUXHZO.js';
10
+ import './chunk-7OTHRX45.js';
11
11
  import './chunk-W7OPEMGJ.js';
12
12
  import './chunk-PKBMQBKP.js';
13
13
  import { useState } from 'react';
@@ -1,8 +1,8 @@
1
- export { ChatWidget, EchoChat, isChatEnabled } from './chunk-CJ43K7RA.js';
1
+ export { ChatWidget, EchoChat, isChatEnabled } from './chunk-JXH56PY3.js';
2
2
  import './chunk-6T6CQVNL.js';
3
3
  import './chunk-JE4A5S4F.js';
4
4
  import './chunk-27FISYK4.js';
5
- import './chunk-UG53ZW7S.js';
5
+ import './chunk-DHMBDPGA.js';
6
6
  import './chunk-Q6E4OPGG.js';
7
7
  import './chunk-MDBXGN6W.js';
8
8
  import './chunk-PVY7X5UR.js';
@@ -12,17 +12,17 @@ import './chunk-HW7B43E5.js';
12
12
  import './chunk-NJCTQH2P.js';
13
13
  import './chunk-S22FSH7C.js';
14
14
  import './chunk-L2V5PUFN.js';
15
- import './chunk-PMXQPO5Q.js';
15
+ import './chunk-UEF4AC76.js';
16
16
  import './chunk-NHDRA4Y5.js';
17
17
  import './chunk-D4M5K6JN.js';
18
18
  import './chunk-GJWI74ZZ.js';
19
19
  import './chunk-NZOJHERI.js';
20
20
  import './chunk-KMNHNCVG.js';
21
21
  import './chunk-5IVD6G77.js';
22
- import './chunk-DXE6SXWW.js';
22
+ import './chunk-CNQMSQYQ.js';
23
23
  import './chunk-7643MCD2.js';
24
24
  import './chunk-64XODP7M.js';
25
- import './chunk-VXCUXHZO.js';
25
+ import './chunk-7OTHRX45.js';
26
26
  import './chunk-W7OPEMGJ.js';
27
27
  import './chunk-A4CC4ZG3.js';
28
28
  import './chunk-MOACHHOJ.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-VXCUXHZO.js';
2
+ import { sonorFetch } from './chunk-7OTHRX45.js';
3
3
  import { getClientApiConfig } from './chunk-W7OPEMGJ.js';
4
4
  import './chunk-PKBMQBKP.js';
5
5
  import React2, { useState, useRef } from 'react';
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-3YKQLC7J.js';
3
- import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-OUD4RTBD.js';
3
+ import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-DHGOFK5P.js';
4
4
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
5
5
  import { isEmptyValue, unseenControlValues, isDisplayOnly } from './chunk-C2FZBUSS.js';
6
- import { FormField } from './chunk-CVADNHJ4.js';
6
+ import { FormField } from './chunk-3WMNHFZH.js';
7
7
  import './chunk-HW7B43E5.js';
8
8
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
9
9
  import './chunk-PKBMQBKP.js';
@@ -254,9 +254,10 @@ function FormSpotlight({
254
254
  trackStepChange,
255
255
  trackFieldFocus,
256
256
  trackFieldBlur,
257
- honeypot
257
+ honeypot,
258
+ addressAutocomplete
258
259
  }) {
259
- const fieldControls = useFieldControls(config.fields);
260
+ const fieldControls = useFieldControls(config.fields, addressAutocomplete);
260
261
  const views = useMemo(() => {
261
262
  return stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
262
263
  }, [config, isFieldVisible]);
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-3YKQLC7J.js';
3
- import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-OUD4RTBD.js';
3
+ import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-DHGOFK5P.js';
4
4
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
5
5
  import { isEmptyValue, unseenControlValues } from './chunk-C2FZBUSS.js';
6
- import { FormField } from './chunk-CVADNHJ4.js';
6
+ import { FormField } from './chunk-3WMNHFZH.js';
7
7
  import './chunk-HW7B43E5.js';
8
8
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
9
9
  import './chunk-PKBMQBKP.js';
@@ -29,9 +29,10 @@ function FormStage({
29
29
  trackStepChange,
30
30
  trackFieldFocus,
31
31
  trackFieldBlur,
32
- honeypot
32
+ honeypot,
33
+ addressAutocomplete
33
34
  }) {
34
- const fieldControls = useFieldControls(config.fields);
35
+ const fieldControls = useFieldControls(config.fields, addressAutocomplete);
35
36
  const [activeIndex, setActiveIndex] = useState(0);
36
37
  const [visited, setVisited] = useState({});
37
38
  const [shakeCount, setShakeCount] = useState(0);
@@ -1,27 +1,27 @@
1
- export { ManagedForm } from './chunk-S33CUULL.js';
2
- import './chunk-OUD4RTBD.js';
3
- import './chunk-UG53ZW7S.js';
1
+ export { ManagedForm } from './chunk-GZYIJ3JI.js';
2
+ import './chunk-DHGOFK5P.js';
3
+ import './chunk-DHMBDPGA.js';
4
4
  import './chunk-Q6E4OPGG.js';
5
5
  import './chunk-MDBXGN6W.js';
6
6
  import './chunk-PVY7X5UR.js';
7
7
  import './chunk-C2FZBUSS.js';
8
8
  import './chunk-DXO6SBMD.js';
9
- import './chunk-CVADNHJ4.js';
9
+ import './chunk-3WMNHFZH.js';
10
10
  import './chunk-TYSIAWC3.js';
11
11
  import './chunk-HW7B43E5.js';
12
12
  import './chunk-NJCTQH2P.js';
13
13
  import './chunk-L2V5PUFN.js';
14
- import './chunk-PMXQPO5Q.js';
14
+ import './chunk-UEF4AC76.js';
15
15
  import './chunk-NHDRA4Y5.js';
16
16
  import './chunk-D4M5K6JN.js';
17
17
  import './chunk-GJWI74ZZ.js';
18
18
  import './chunk-NZOJHERI.js';
19
19
  import './chunk-KMNHNCVG.js';
20
20
  import './chunk-5IVD6G77.js';
21
- import './chunk-DXE6SXWW.js';
21
+ import './chunk-CNQMSQYQ.js';
22
22
  import './chunk-7643MCD2.js';
23
23
  import './chunk-64XODP7M.js';
24
- import './chunk-VXCUXHZO.js';
24
+ import './chunk-7OTHRX45.js';
25
25
  import './chunk-W7OPEMGJ.js';
26
26
  import './chunk-A4CC4ZG3.js';
27
27
  import './chunk-MOACHHOJ.js';
@@ -1,34 +1,34 @@
1
- import './chunk-6NLVHTYY.js';
2
- import './chunk-SOD2F6C2.js';
1
+ import './chunk-BHJTT63Y.js';
3
2
  import './chunk-YGGDU6C3.js';
4
- import './chunk-S33CUULL.js';
5
- import './chunk-OUD4RTBD.js';
6
- import { useForm } from './chunk-UG53ZW7S.js';
3
+ import './chunk-GZYIJ3JI.js';
4
+ import './chunk-DHGOFK5P.js';
5
+ import './chunk-SOD2F6C2.js';
6
+ import { useForm } from './chunk-DHMBDPGA.js';
7
7
  import './chunk-Q6E4OPGG.js';
8
8
  import './chunk-MDBXGN6W.js';
9
9
  import './chunk-PVY7X5UR.js';
10
- import './chunk-J4LJE4NB.js';
10
+ import './chunk-IDLJEFVB.js';
11
11
  import './chunk-C2FZBUSS.js';
12
12
  import './chunk-YC7ELZS3.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';
18
18
  import { NewsletterShell } from './chunk-JHTPHA2D.js';
19
19
  import './chunk-DJAYFHVF.js';
20
20
  import './chunk-L2V5PUFN.js';
21
- import './chunk-PMXQPO5Q.js';
21
+ import './chunk-UEF4AC76.js';
22
22
  import './chunk-NHDRA4Y5.js';
23
23
  import './chunk-D4M5K6JN.js';
24
24
  import './chunk-GJWI74ZZ.js';
25
25
  import './chunk-NZOJHERI.js';
26
26
  import './chunk-KMNHNCVG.js';
27
27
  import './chunk-5IVD6G77.js';
28
- import './chunk-DXE6SXWW.js';
28
+ import './chunk-CNQMSQYQ.js';
29
29
  import './chunk-7643MCD2.js';
30
30
  import './chunk-64XODP7M.js';
31
- import './chunk-VXCUXHZO.js';
31
+ import './chunk-7OTHRX45.js';
32
32
  import './chunk-W7OPEMGJ.js';
33
33
  import './chunk-A4CC4ZG3.js';
34
34
  import './chunk-MOACHHOJ.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { getFreshCredential } from './chunk-FAY6MOLL.js';
2
+ import { getFreshCredential } from './chunk-3LGE3LRC.js';
3
3
  import { isSiteToken } from './chunk-TPHOIE4I.js';
4
4
  import { getOrCreateSessionId, getOrCreateVisitorId } from './chunk-JT7GHHMV.js';
5
5
  import { onPageLeave } from './chunk-L2V5PUFN.js';
@@ -8,10 +8,10 @@ import './chunk-D4M5K6JN.js';
8
8
  import './chunk-GJWI74ZZ.js';
9
9
  import { experimentMeasurementPermitted, currentSubjectProof } from './chunk-KMNHNCVG.js';
10
10
  import './chunk-5IVD6G77.js';
11
- import './chunk-DXE6SXWW.js';
11
+ import './chunk-CNQMSQYQ.js';
12
12
  import { resolveAnalyticsTarget } from './chunk-7643MCD2.js';
13
13
  import './chunk-64XODP7M.js';
14
- import { sonorFetch } from './chunk-VXCUXHZO.js';
14
+ import { sonorFetch } from './chunk-7OTHRX45.js';
15
15
  import { getClientApiConfig, readPublishedSite } from './chunk-W7OPEMGJ.js';
16
16
  import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot, analyticsPurposePermitted } from './chunk-FRY6PBT6.js';
17
17
  import './chunk-PKBMQBKP.js';
@@ -1,4 +1,4 @@
1
- export { SiteChat } from './chunk-WHFWDK2H.js';
1
+ export { SiteChat } from './chunk-ZWTDI2JU.js';
2
2
  import './chunk-27FISYK4.js';
3
3
  import './chunk-7643MCD2.js';
4
4
  import './chunk-64XODP7M.js';
@@ -1,12 +1,12 @@
1
- export { SiteDesignReporter } from './chunk-IO6BWRZ5.js';
2
- import './chunk-6EDE7BOE.js';
1
+ export { SiteDesignReporter } from './chunk-2URLL3Z2.js';
2
+ import './chunk-OPJZSLGK.js';
3
3
  import './chunk-XLAHRN4B.js';
4
4
  import './chunk-XHYE24HU.js';
5
5
  import './chunk-YC7ELZS3.js';
6
6
  import './chunk-S22FSH7C.js';
7
- import './chunk-DXE6SXWW.js';
7
+ import './chunk-CNQMSQYQ.js';
8
8
  import './chunk-7643MCD2.js';
9
9
  import './chunk-64XODP7M.js';
10
- import './chunk-VXCUXHZO.js';
10
+ import './chunk-7OTHRX45.js';
11
11
  import './chunk-W7OPEMGJ.js';
12
12
  import './chunk-PKBMQBKP.js';
@@ -1,18 +1,18 @@
1
- export { SitePopups } from './chunk-EBEM5BI5.js';
1
+ export { SitePopups } from './chunk-CCZHAC4K.js';
2
2
  import './chunk-27FISYK4.js';
3
3
  import './chunk-PVY7X5UR.js';
4
4
  import './chunk-JT7GHHMV.js';
5
- import './chunk-PMXQPO5Q.js';
5
+ import './chunk-UEF4AC76.js';
6
6
  import './chunk-NHDRA4Y5.js';
7
7
  import './chunk-D4M5K6JN.js';
8
8
  import './chunk-GJWI74ZZ.js';
9
9
  import './chunk-NZOJHERI.js';
10
10
  import './chunk-KMNHNCVG.js';
11
11
  import './chunk-5IVD6G77.js';
12
- import './chunk-DXE6SXWW.js';
12
+ import './chunk-CNQMSQYQ.js';
13
13
  import './chunk-7643MCD2.js';
14
14
  import './chunk-64XODP7M.js';
15
- import './chunk-VXCUXHZO.js';
15
+ import './chunk-7OTHRX45.js';
16
16
  import './chunk-W7OPEMGJ.js';
17
17
  import './chunk-A4CC4ZG3.js';
18
18
  import './chunk-FRY6PBT6.js';
@@ -1,7 +1,7 @@
1
- export { SitemapSync } from './chunk-ADQ3VCKK.js';
1
+ export { SitemapSync } from './chunk-JYRBGL33.js';
2
2
  import './chunk-YVKRYQRG.js';
3
3
  import './chunk-7643MCD2.js';
4
4
  import './chunk-64XODP7M.js';
5
- import './chunk-VXCUXHZO.js';
5
+ import './chunk-7OTHRX45.js';
6
6
  import './chunk-W7OPEMGJ.js';
7
7
  import './chunk-PKBMQBKP.js';
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- export { BookingWidget, BookingWidget_default as default } from '../chunk-MP35JETP.js';
3
- import '../chunk-ZRSXCT4O.js';
2
+ export { BookingWidget, BookingWidget_default as default } from '../chunk-3VKJJNQU.js';
3
+ import '../chunk-LY3Q6RU5.js';
4
4
  import '../chunk-PVY7X5UR.js';
5
5
  import '../chunk-5IVD6G77.js';
6
- import '../chunk-VXCUXHZO.js';
6
+ import '../chunk-7OTHRX45.js';
7
7
  import '../chunk-W7OPEMGJ.js';
8
8
  import '../chunk-FRY6PBT6.js';
9
9
  import '../chunk-PKBMQBKP.js';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { experimentMeasurementPermitted } from '../chunk-KMNHNCVG.js';
3
- import { useSignalExperiment, useSignal } from '../chunk-HJD6KXKH.js';
3
+ import { useSignalExperiment, useSignal } from '../chunk-R53G2IKP.js';
4
4
  import { releaseRenderedResonanceExposure, recordRenderedResonanceExposure } from '../chunk-MOACHHOJ.js';
5
5
  import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot, analyticsPurposePermitted } from '../chunk-FRY6PBT6.js';
6
6
  import '../chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-VXCUXHZO.js';
2
+ import { sonorFetch } from '../chunk-7OTHRX45.js';
3
3
  import { getClientApiConfig } from '../chunk-W7OPEMGJ.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
5
  import { useState, useEffect } from 'react';
@@ -1,20 +1,20 @@
1
1
  'use client';
2
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-SO6RSRUP.js';
2
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-NAO63YOG.js';
3
3
  import { trackConversion } from '../chunk-AG2RDHYZ.js';
4
4
  export { trackConversion, trackEvent } from '../chunk-AG2RDHYZ.js';
5
5
  import '../chunk-JT7GHHMV.js';
6
6
  import '../chunk-L2V5PUFN.js';
7
- import '../chunk-PMXQPO5Q.js';
7
+ import '../chunk-UEF4AC76.js';
8
8
  import '../chunk-NHDRA4Y5.js';
9
9
  import '../chunk-D4M5K6JN.js';
10
10
  import '../chunk-GJWI74ZZ.js';
11
11
  import '../chunk-NZOJHERI.js';
12
12
  import '../chunk-KMNHNCVG.js';
13
13
  import '../chunk-5IVD6G77.js';
14
- import '../chunk-DXE6SXWW.js';
14
+ import '../chunk-CNQMSQYQ.js';
15
15
  export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-7643MCD2.js';
16
16
  import '../chunk-64XODP7M.js';
17
- import '../chunk-VXCUXHZO.js';
17
+ import '../chunk-7OTHRX45.js';
18
18
  import '../chunk-W7OPEMGJ.js';
19
19
  import '../chunk-A4CC4ZG3.js';
20
20
  import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot, analyticsPurposePermitted } from '../chunk-FRY6PBT6.js';
@@ -0,0 +1,5 @@
1
+ export { fetchMapsConfig, fetchNearbyPlaces } from './chunk-FW63D6W3.js';
2
+ import './chunk-MH2DSGC6.js';
3
+ import './chunk-7OTHRX45.js';
4
+ import './chunk-W7OPEMGJ.js';
5
+ import './chunk-PKBMQBKP.js';
@@ -21,7 +21,7 @@ import '../chunk-PKBMQBKP.js';
21
21
  import React, { useState, Suspense, useEffect } from 'react';
22
22
  import { jsx, jsxs } from 'react/jsx-runtime';
23
23
 
24
- var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-VVXZSEAL.js'));
24
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-GJU5KCGA.js'));
25
25
  function NewsletterWidget({
26
26
  title = "Subscribe to Our Newsletter",
27
27
  description = "Get the latest posts delivered straight to your inbox.",