@sonordev/site-kit 8.9.0 → 8.10.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.
- package/CHANGELOG.md +4 -0
- package/agent-manifest.json +1 -1
- package/dist/AddressAutocomplete-LQS6GQ4R.js +241 -0
- package/dist/{AnalyticsProvider-X7JJN3QL.js → AnalyticsProvider-JWS7BLFY.js} +4 -4
- package/dist/{ArticleViewTracker-7Q6AMCKX.js → ArticleViewTracker-CDPVMUAO.js} +1 -1
- package/dist/{BlocksPopup-U5VIYEBA.js → BlocksPopup-C5PNJ7U6.js} +3 -3
- package/dist/{ChatWidget-EAATOFCT.js → ChatWidget-HEPOE3YC.js} +5 -5
- package/dist/{FileField-YWMSK7RF.js → FileField-6R5LS5NU.js} +1 -1
- package/dist/{FormSpotlight-MAXDW3TK.js → FormSpotlight-2BSE7PD2.js} +5 -4
- package/dist/{FormStage-VAHRVOIZ.js → FormStage-3G46OPPO.js} +5 -4
- package/dist/{ManagedForm-7IZT7ZII.js → ManagedForm-LTXEU25N.js} +7 -7
- package/dist/{ManagedNewsletterForm-VVXZSEAL.js → ManagedNewsletterForm-WE6P5DMV.js} +10 -10
- package/dist/{SignalCore-HAN4O7QG.js → SignalCore-IP7FE6SN.js} +3 -3
- package/dist/{SiteChat-3JLCEL2N.js → SiteChat-3FQYMHCP.js} +1 -1
- package/dist/{SiteDesignReporter-6CCO645E.js → SiteDesignReporter-HGTX4FX2.js} +4 -4
- package/dist/{SitePopups-ZGHQNGGH.js → SitePopups-V7MCNSGE.js} +4 -4
- package/dist/{SitemapSync-5LSYCBKS.js → SitemapSync-OAJ7SIET.js} +2 -2
- package/dist/_client/booking-widget.js +3 -3
- package/dist/_client/reviewed-signal-experiment.js +1 -1
- package/dist/affiliates/index.js +1 -1
- package/dist/analytics/index.js +4 -4
- package/dist/api-X6N6V2H3.js +5 -0
- package/dist/articles/index.js +1 -1
- package/dist/articles/server-ui.js +3 -3
- package/dist/articles/server.js +2 -2
- package/dist/chat/index.js +6 -6
- package/dist/{chunk-AWLPFFPO.js → chunk-3RBOES2C.js} +1 -1
- package/dist/{chunk-CVADNHJ4.js → chunk-3WMNHFZH.js} +9 -0
- package/dist/{chunk-HJD6KXKH.js → chunk-533ZSRJF.js} +1 -1
- package/dist/chunk-6CIO4X6P.js +77 -0
- package/dist/{chunk-S33CUULL.js → chunk-727353NY.js} +11 -7
- package/dist/{chunk-ZRSXCT4O.js → chunk-75N2WALV.js} +1 -1
- package/dist/{chunk-SO6RSRUP.js → chunk-7PWXPN53.js} +1 -1
- package/dist/{chunk-YVEYO3OD.js → chunk-A66TIJWU.js} +1 -1
- package/dist/{chunk-PMXQPO5Q.js → chunk-ACZ5JNSL.js} +2 -2
- package/dist/{chunk-DXE6SXWW.js → chunk-D4R3FQED.js} +1 -1
- package/dist/{chunk-6EDE7BOE.js → chunk-DW5X4BC7.js} +2 -2
- package/dist/{chunk-VPZJ7ZTL.js → chunk-HHEDRZOJ.js} +1 -1
- package/dist/{chunk-QXAJPB6O.js → chunk-HLN7A4GL.js} +1 -1
- package/dist/{chunk-6NLVHTYY.js → chunk-HNVLINPI.js} +1 -1
- package/dist/{chunk-KGIQYVQ2.js → chunk-J4R7MHV2.js} +8 -8
- package/dist/{chunk-UG53ZW7S.js → chunk-MIKVCYGX.js} +2 -2
- package/dist/{chunk-OUD4RTBD.js → chunk-MKU5ZORB.js} +2 -31
- package/dist/{chunk-L3S5WH4C.js → chunk-NBNDH2J6.js} +1 -1
- package/dist/{chunk-S63QY5XW.js → chunk-NH7K252M.js} +5 -3
- package/dist/{chunk-J4LJE4NB.js → chunk-NWEIHCSE.js} +3 -1
- package/dist/{chunk-F3RKFGRW.js → chunk-OCNODBH4.js} +1 -1
- package/dist/{chunk-CJ43K7RA.js → chunk-OEHIXCYS.js} +2 -2
- package/dist/{chunk-T4A5J6SJ.js → chunk-P7S45DD7.js} +1 -1
- package/dist/{chunk-XDH5B3PR.js → chunk-Q2OE32TH.js} +2 -2
- package/dist/{chunk-FAY6MOLL.js → chunk-RMPXSEEU.js} +1 -1
- package/dist/{chunk-ISMHDUBW.js → chunk-RUV6DCKL.js} +1 -1
- package/dist/{chunk-IO6BWRZ5.js → chunk-TLKLHSRJ.js} +1 -1
- package/dist/{chunk-WHFWDK2H.js → chunk-UMF5OILQ.js} +1 -1
- package/dist/{chunk-ADQ3VCKK.js → chunk-XAPSYDVT.js} +1 -1
- package/dist/{chunk-EBEM5BI5.js → chunk-Y7DZ2ND2.js} +3 -3
- package/dist/{chunk-NZHECYLF.js → chunk-YJ6PRJ7Y.js} +2 -2
- package/dist/{chunk-VXCUXHZO.js → chunk-Z4XJOVQX.js} +1 -1
- package/dist/{chunk-MP35JETP.js → chunk-Z62W7Q3T.js} +1 -1
- package/dist/controls-KLG6VQLO.js +14 -0
- package/dist/fleet/index.js +3 -3
- package/dist/forms/AddressAutocomplete.d.ts +20 -0
- package/dist/forms/FormClient.d.ts +2 -1
- package/dist/forms/FormEnhancer.d.ts +2 -1
- package/dist/forms/FormField.d.ts +2 -0
- package/dist/forms/FormSpotlight.d.ts +1 -1
- package/dist/forms/FormStage.d.ts +1 -1
- package/dist/forms/ManagedForm.d.ts +1 -1
- package/dist/forms/ServerForm.d.ts +2 -1
- package/dist/forms/controls.d.ts +5 -0
- package/dist/forms/field-controls.d.ts +4 -2
- package/dist/forms/index.d.ts +1 -1
- package/dist/forms/index.js +10 -10
- package/dist/forms/server.js +4 -4
- package/dist/forms/static.js +2 -2
- package/dist/forms/types.d.ts +9 -0
- package/dist/images/index.js +2 -2
- package/dist/index.js +1 -1
- package/dist/landing/server.js +7 -7
- package/dist/layout/client.js +6 -6
- package/dist/layout/index.js +7 -7
- package/dist/llms/index.js +4 -4
- package/dist/maps/index.js +8 -78
- package/dist/maps/places-library.d.ts +34 -0
- package/dist/mcp/sonor.js +7 -7
- package/dist/places-library-RU2YNKFK.js +54 -0
- package/dist/resonance/index.js +1 -1
- package/dist/revalidate/index.js +2 -2
- package/dist/runtime/index.js +1 -1
- package/dist/{runtime-core-WT7KKLWQ.js → runtime-core-EU2RZMOL.js} +1 -1
- package/dist/seo/client.js +2 -2
- package/dist/seo/index.js +2 -2
- package/dist/seo/llms.js +4 -4
- package/dist/seo/register-sitemap-cli.js +1 -1
- package/dist/seo/sitemap.js +2 -2
- package/dist/server/index.js +2 -2
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/{sonor-fetch-runtime-3PFGUXMF.js → sonor-fetch-runtime-SLPBNZY4.js} +2 -2
- package/dist/sync/index.js +3 -3
- package/dist/website/images.js +2 -2
- package/dist/website/index.js +4 -4
- package/dist/website/landing/server.js +7 -7
- package/dist/website/popups.js +4 -4
- package/dist/{writeLLMsTxt-JUACXQKP.js → writeLLMsTxt-2CBYGKZO.js} +1 -1
- package/package.json +1 -1
- package/src/forms/README.md +47 -0
- /package/dist/{chunk-QLJ2SC3T.js → chunk-ORSQKTMN.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @sonordev/site-kit Changelog
|
|
2
2
|
|
|
3
|
+
## 8.10.0
|
|
4
|
+
|
|
5
|
+
- 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.
|
|
6
|
+
|
|
3
7
|
## 8.9.0
|
|
4
8
|
|
|
5
9
|
- 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.
|
package/agent-manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": "@sonordev/site-kit",
|
|
4
|
-
"version": "8.
|
|
4
|
+
"version": "8.10.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-X6N6V2H3.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-
|
|
1
|
+
export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-7PWXPN53.js';
|
|
2
2
|
import './chunk-AG2RDHYZ.js';
|
|
3
3
|
import './chunk-JT7GHHMV.js';
|
|
4
4
|
import './chunk-L2V5PUFN.js';
|
|
5
|
-
import './chunk-
|
|
5
|
+
import './chunk-ACZ5JNSL.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-
|
|
12
|
+
import './chunk-D4R3FQED.js';
|
|
13
13
|
import './chunk-7643MCD2.js';
|
|
14
14
|
import './chunk-64XODP7M.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-Z4XJOVQX.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-
|
|
19
|
+
import { sonorFetch } from './chunk-Z4XJOVQX.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-
|
|
2
|
+
import { getSiteDesignTokens } from './chunk-DW5X4BC7.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-
|
|
7
|
+
import './chunk-D4R3FQED.js';
|
|
8
8
|
import './chunk-7643MCD2.js';
|
|
9
9
|
import './chunk-64XODP7M.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-Z4XJOVQX.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-
|
|
1
|
+
export { ChatWidget, EchoChat, isChatEnabled } from './chunk-OEHIXCYS.js';
|
|
2
2
|
import './chunk-6T6CQVNL.js';
|
|
3
3
|
import './chunk-JE4A5S4F.js';
|
|
4
4
|
import './chunk-27FISYK4.js';
|
|
5
|
-
import './chunk-
|
|
5
|
+
import './chunk-MIKVCYGX.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-
|
|
15
|
+
import './chunk-ACZ5JNSL.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-
|
|
22
|
+
import './chunk-D4R3FQED.js';
|
|
23
23
|
import './chunk-7643MCD2.js';
|
|
24
24
|
import './chunk-64XODP7M.js';
|
|
25
|
-
import './chunk-
|
|
25
|
+
import './chunk-Z4XJOVQX.js';
|
|
26
26
|
import './chunk-W7OPEMGJ.js';
|
|
27
27
|
import './chunk-A4CC4ZG3.js';
|
|
28
28
|
import './chunk-MOACHHOJ.js';
|
|
@@ -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-
|
|
3
|
+
import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-MKU5ZORB.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-
|
|
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-
|
|
3
|
+
import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-MKU5ZORB.js';
|
|
4
4
|
import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
|
|
5
5
|
import { isEmptyValue, unseenControlValues } from './chunk-C2FZBUSS.js';
|
|
6
|
-
import { FormField } from './chunk-
|
|
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-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { ManagedForm } from './chunk-727353NY.js';
|
|
2
|
+
import './chunk-MKU5ZORB.js';
|
|
3
|
+
import './chunk-MIKVCYGX.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-
|
|
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-
|
|
14
|
+
import './chunk-ACZ5JNSL.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-
|
|
21
|
+
import './chunk-D4R3FQED.js';
|
|
22
22
|
import './chunk-7643MCD2.js';
|
|
23
23
|
import './chunk-64XODP7M.js';
|
|
24
|
-
import './chunk-
|
|
24
|
+
import './chunk-Z4XJOVQX.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-
|
|
2
|
-
import './chunk-SOD2F6C2.js';
|
|
1
|
+
import './chunk-HNVLINPI.js';
|
|
3
2
|
import './chunk-YGGDU6C3.js';
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import
|
|
3
|
+
import './chunk-727353NY.js';
|
|
4
|
+
import './chunk-MKU5ZORB.js';
|
|
5
|
+
import './chunk-SOD2F6C2.js';
|
|
6
|
+
import { useForm } from './chunk-MIKVCYGX.js';
|
|
7
7
|
import './chunk-Q6E4OPGG.js';
|
|
8
8
|
import './chunk-MDBXGN6W.js';
|
|
9
9
|
import './chunk-PVY7X5UR.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-NWEIHCSE.js';
|
|
11
11
|
import './chunk-C2FZBUSS.js';
|
|
12
12
|
import './chunk-YC7ELZS3.js';
|
|
13
13
|
import './chunk-DXO6SBMD.js';
|
|
14
|
-
import './chunk-
|
|
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-
|
|
21
|
+
import './chunk-ACZ5JNSL.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-
|
|
28
|
+
import './chunk-D4R3FQED.js';
|
|
29
29
|
import './chunk-7643MCD2.js';
|
|
30
30
|
import './chunk-64XODP7M.js';
|
|
31
|
-
import './chunk-
|
|
31
|
+
import './chunk-Z4XJOVQX.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-
|
|
2
|
+
import { getFreshCredential } from './chunk-RMPXSEEU.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-
|
|
11
|
+
import './chunk-D4R3FQED.js';
|
|
12
12
|
import { resolveAnalyticsTarget } from './chunk-7643MCD2.js';
|
|
13
13
|
import './chunk-64XODP7M.js';
|
|
14
|
-
import { sonorFetch } from './chunk-
|
|
14
|
+
import { sonorFetch } from './chunk-Z4XJOVQX.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,12 +1,12 @@
|
|
|
1
|
-
export { SiteDesignReporter } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { SiteDesignReporter } from './chunk-TLKLHSRJ.js';
|
|
2
|
+
import './chunk-DW5X4BC7.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-
|
|
7
|
+
import './chunk-D4R3FQED.js';
|
|
8
8
|
import './chunk-7643MCD2.js';
|
|
9
9
|
import './chunk-64XODP7M.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-Z4XJOVQX.js';
|
|
11
11
|
import './chunk-W7OPEMGJ.js';
|
|
12
12
|
import './chunk-PKBMQBKP.js';
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export { SitePopups } from './chunk-
|
|
1
|
+
export { SitePopups } from './chunk-Y7DZ2ND2.js';
|
|
2
2
|
import './chunk-27FISYK4.js';
|
|
3
3
|
import './chunk-PVY7X5UR.js';
|
|
4
4
|
import './chunk-JT7GHHMV.js';
|
|
5
|
-
import './chunk-
|
|
5
|
+
import './chunk-ACZ5JNSL.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-
|
|
12
|
+
import './chunk-D4R3FQED.js';
|
|
13
13
|
import './chunk-7643MCD2.js';
|
|
14
14
|
import './chunk-64XODP7M.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-Z4XJOVQX.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-
|
|
1
|
+
export { SitemapSync } from './chunk-XAPSYDVT.js';
|
|
2
2
|
import './chunk-YVKRYQRG.js';
|
|
3
3
|
import './chunk-7643MCD2.js';
|
|
4
4
|
import './chunk-64XODP7M.js';
|
|
5
|
-
import './chunk-
|
|
5
|
+
import './chunk-Z4XJOVQX.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-
|
|
3
|
-
import '../chunk-
|
|
2
|
+
export { BookingWidget, BookingWidget_default as default } from '../chunk-Z62W7Q3T.js';
|
|
3
|
+
import '../chunk-75N2WALV.js';
|
|
4
4
|
import '../chunk-PVY7X5UR.js';
|
|
5
5
|
import '../chunk-5IVD6G77.js';
|
|
6
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-Z4XJOVQX.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-
|
|
3
|
+
import { useSignalExperiment, useSignal } from '../chunk-533ZSRJF.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';
|
package/dist/affiliates/index.js
CHANGED
package/dist/analytics/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-
|
|
2
|
+
export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-7PWXPN53.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-
|
|
7
|
+
import '../chunk-ACZ5JNSL.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-
|
|
14
|
+
import '../chunk-D4R3FQED.js';
|
|
15
15
|
export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-7643MCD2.js';
|
|
16
16
|
import '../chunk-64XODP7M.js';
|
|
17
|
-
import '../chunk-
|
|
17
|
+
import '../chunk-Z4XJOVQX.js';
|
|
18
18
|
import '../chunk-W7OPEMGJ.js';
|
|
19
19
|
import '../chunk-A4CC4ZG3.js';
|
|
20
20
|
import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot, analyticsPurposePermitted } from '../chunk-FRY6PBT6.js';
|
package/dist/articles/index.js
CHANGED
|
@@ -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-
|
|
24
|
+
var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-WE6P5DMV.js'));
|
|
25
25
|
function NewsletterWidget({
|
|
26
26
|
title = "Subscribe to Our Newsletter",
|
|
27
27
|
description = "Get the latest posts delivered straight to your inbox.",
|