@sonordev/site-kit 7.1.2 → 7.3.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 (176) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +60 -0
  3. package/README.md +9 -8
  4. package/agent-manifest.json +17 -7
  5. package/dist/{AnalyticsProvider-ZB33W6MC.js → AnalyticsProvider-DJQA66AG.js} +4 -4
  6. package/dist/{ArticleViewTracker-GMHYLLLZ.js → ArticleViewTracker-GFOAXFV7.js} +3 -3
  7. package/dist/{BlocksPopup-EA6LYL25.js → BlocksPopup-AHDU34TL.js} +5 -5
  8. package/dist/ChatWidget-FHBAHFZX.js +17 -0
  9. package/dist/{FileField-QKA3JB2Q.js → FileField-J5W5MIAZ.js} +3 -3
  10. package/dist/{FormSpotlight-AQTIA5TP.js → FormSpotlight-PE5YZBFZ.js} +20 -6
  11. package/dist/{FormStage-FDTLTP3B.js → FormStage-OOPQC27J.js} +27 -7
  12. package/dist/ManagedForm-JRZAJ7SZ.js +16 -0
  13. package/dist/{ManagedNewsletterForm-J6QSAGGP.js → ManagedNewsletterForm-TC5542ZG.js} +7 -5
  14. package/dist/{SignalCore-JZNXOLNT.js → SignalCore-2YP5FCAS.js} +3 -3
  15. package/dist/SiteChat-EGEZJJVV.js +5 -0
  16. package/dist/{SiteDesignReporter-W4EJUSTE.js → SiteDesignReporter-YEEWJKWN.js} +5 -5
  17. package/dist/SitePopups-LQBIXIFV.js +10 -0
  18. package/dist/SitemapSync-LSZ2EYOF.js +8 -0
  19. package/dist/_client/booking-widget.js +5 -5
  20. package/dist/affiliates/index.js +3 -3
  21. package/dist/analytics/index.js +4 -4
  22. package/dist/analytics/send-gate.d.ts +1 -1
  23. package/dist/articles/index.js +2 -2
  24. package/dist/articles/server-ui.js +3 -2
  25. package/dist/articles/server.js +2 -1
  26. package/dist/{engage → chat}/ChatWidget.d.ts +7 -6
  27. package/dist/{engage → chat}/EchoUiActions.d.ts +1 -1
  28. package/dist/chat/SiteChat.d.ts +25 -0
  29. package/dist/{engage → chat}/brand-color.d.ts +1 -1
  30. package/dist/{engage → chat}/chat-messages.d.ts +1 -1
  31. package/dist/{engage → chat}/echo-config.d.ts +1 -1
  32. package/dist/chat/index.d.ts +10 -6
  33. package/dist/chat/index.js +14 -8
  34. package/dist/{engage → chat}/launcher-placement.d.ts +1 -7
  35. package/dist/{engage → chat}/socket-loader.d.ts +2 -2
  36. package/dist/chat/types.d.ts +136 -0
  37. package/dist/chunk-27FISYK4.js +4 -0
  38. package/dist/{chunk-HF57LG73.js → chunk-2AD3CDRR.js} +43 -29
  39. package/dist/{chunk-M3YEPKP7.js → chunk-2ECWEUHP.js} +1 -1
  40. package/dist/{chunk-LUXVWITO.js → chunk-4NTBQNHA.js} +247 -78
  41. package/dist/{chunk-AH5Q262S.js → chunk-56KNHB4U.js} +1 -1
  42. package/dist/{chunk-GLHQ3LRO.js → chunk-6U3VLV2C.js} +1 -1
  43. package/dist/{chunk-3SDOQUUF.js → chunk-BEBR4OJD.js} +2 -2
  44. package/dist/{chunk-JSZN6LDZ.js → chunk-BF7TZYC3.js} +38 -31
  45. package/dist/{chunk-AQSNPZY4.js → chunk-C2FZBUSS.js} +80 -1
  46. package/dist/{chunk-PHYMNUJU.js → chunk-CYUFBKJQ.js} +1 -1
  47. package/dist/{chunk-6WIQCXOO.js → chunk-DNPNYWVL.js} +1 -1
  48. package/dist/{chunk-V6FDQLR7.js → chunk-EPT6FJUY.js} +53 -21
  49. package/dist/chunk-HODO5BX5.js +28 -0
  50. package/dist/chunk-HW7B43E5.js +14 -0
  51. package/dist/{chunk-PGMVL4AB.js → chunk-I2YX3HVD.js} +2 -2
  52. package/dist/{chunk-JTU2GOM4.js → chunk-L7U23XI2.js} +18 -6
  53. package/dist/{chunk-YEMPUQVU.js → chunk-MKMD2HJW.js} +2 -2
  54. package/dist/{chunk-Q4W23JYM.js → chunk-MRQ2U4LZ.js} +1 -1
  55. package/dist/chunk-MVR4FY5R.js +187 -0
  56. package/dist/{chunk-VGH4MDTU.js → chunk-NI2XNEMR.js} +1 -1
  57. package/dist/{chunk-4Y5FWDPM.js → chunk-NZ4RXN3G.js} +55 -7
  58. package/dist/{chunk-RHNWA34F.js → chunk-O5RGXTWU.js} +41 -7
  59. package/dist/{chunk-TXBAOEKG.js → chunk-PKGN32AU.js} +5 -4
  60. package/dist/chunk-Q6E4OPGG.js +40 -0
  61. package/dist/chunk-RDPW4D33.js +45 -0
  62. package/dist/{chunk-UXOGCKL6.js → chunk-T4DLETKR.js} +1 -1
  63. package/dist/{chunk-NK4CSJNP.js → chunk-UPRSH6Q4.js} +2 -2
  64. package/dist/{chunk-ERXXITG4.js → chunk-VF4F5WXZ.js} +1 -1
  65. package/dist/chunk-VWWITFWM.js +300 -0
  66. package/dist/{chunk-WWSHFRDL.js → chunk-WDQB4OXY.js} +7 -3
  67. package/dist/{chunk-VDF5DFWT.js → chunk-WGG6GTKW.js} +1 -1
  68. package/dist/{chunk-CSTQDNGK.js → chunk-WGIDC6QP.js} +43 -24
  69. package/dist/{chunk-V3PUVBME.js → chunk-XLSQTTUE.js} +2 -4
  70. package/dist/{chunk-JBE46QJZ.js → chunk-Y6LP36UW.js} +1 -1
  71. package/dist/chunk-YJLS6JBI.js +370 -0
  72. package/dist/{chunk-QEDHRBAT.js → chunk-Z65DHMTW.js} +26 -9
  73. package/dist/{chunk-ILU5I6RW.js → chunk-ZHS2XFLV.js} +1 -1
  74. package/dist/{chunk-D5EC5KVO.js → chunk-ZKHI4E2B.js} +2 -2
  75. package/dist/{chunk-CIG5UL2S.js → chunk-ZTLMPUO6.js} +3 -2
  76. package/dist/client/index.js +3 -3
  77. package/dist/commerce/index.js +4 -4
  78. package/dist/contracts/color.d.ts +1 -1
  79. package/dist/contracts/entries.d.ts +1 -1
  80. package/dist/contracts/error-page.d.ts +183 -0
  81. package/dist/contracts/llms.d.ts +1 -0
  82. package/dist/contracts/proposal-sitemap.d.ts +130 -0
  83. package/dist/contracts/schema-placeholders.d.ts +87 -0
  84. package/dist/engage/EngageWidget.d.ts +13 -12
  85. package/dist/engage/index.d.ts +10 -9
  86. package/dist/engage/index.js +31 -35
  87. package/dist/engage/types.d.ts +19 -244
  88. package/dist/fleet/FleetHeartbeat.d.ts +1 -1
  89. package/dist/fleet/index.js +4 -4
  90. package/dist/forms/FormEnhancer.d.ts +25 -12
  91. package/dist/forms/ServerForm.d.ts +11 -10
  92. package/dist/forms/StaticForm.d.ts +3 -1
  93. package/dist/forms/field-autocomplete.d.ts +28 -0
  94. package/dist/forms/form-dom-values.d.ts +42 -0
  95. package/dist/forms/index.js +11 -9
  96. package/dist/forms/server.js +6 -4
  97. package/dist/forms/static.js +3 -2
  98. package/dist/forms/submitForm.d.ts +8 -1
  99. package/dist/forms/types.d.ts +41 -2
  100. package/dist/forms/useForm.d.ts +21 -4
  101. package/dist/forms/webmcp.d.ts +38 -0
  102. package/dist/images/index.js +4 -4
  103. package/dist/index.d.ts +4 -1
  104. package/dist/index.js +1 -1
  105. package/dist/layout/SiteKitClientProviders.d.ts +3 -3
  106. package/dist/layout/SiteKitLayout.d.ts +4 -4
  107. package/dist/layout/client.d.ts +3 -3
  108. package/dist/layout/client.js +7 -7
  109. package/dist/layout/index.js +8 -8
  110. package/dist/layout/types.d.ts +5 -4
  111. package/dist/llms/agent-access.d.ts +4 -0
  112. package/dist/llms/contract.js +1 -1
  113. package/dist/llms/index.js +6 -6
  114. package/dist/maps/index.js +3 -3
  115. package/dist/mcp/WebMcpTools.d.ts +5 -4
  116. package/dist/mcp/client.js +14 -7
  117. package/dist/mcp/discovery.d.ts +48 -0
  118. package/dist/mcp/handlers.d.ts +13 -7
  119. package/dist/mcp/index.d.ts +5 -3
  120. package/dist/mcp/index.js +62 -30
  121. package/dist/mcp/serverCard.d.ts +6 -7
  122. package/dist/mcp/sonor.js +14 -11
  123. package/dist/revalidate/index.js +2 -2
  124. package/dist/seo/client.js +4 -4
  125. package/dist/seo/index.js +15 -8
  126. package/dist/seo/llms/contract.js +1 -1
  127. package/dist/seo/llms.js +6 -6
  128. package/dist/seo/register-sitemap-cli.js +1 -1
  129. package/dist/seo/sitemap.js +4 -4
  130. package/dist/server/index.js +2 -2
  131. package/dist/shared/dialog.d.ts +27 -0
  132. package/dist/shared/identity.d.ts +1 -1
  133. package/dist/shared/layers.d.ts +7 -0
  134. package/dist/shared/mid-form.d.ts +53 -0
  135. package/dist/shared/reporting-gate.d.ts +1 -1
  136. package/dist/shared/version.d.ts +1 -1
  137. package/dist/shared/visual-viewport-gap.d.ts +1 -1
  138. package/dist/signal/index.js +2 -2
  139. package/dist/signal/types.d.ts +1 -1
  140. package/dist/sitemap/index.js +4 -4
  141. package/dist/{socket-loader-R24ZSRSQ.js → socket-loader-CGIPEG74.js} +1 -1
  142. package/dist/sync/index.js +5 -5
  143. package/dist/types.d.ts +3 -1
  144. package/dist/{web-vitals.attribution-GD6LGLVF.js → web-vitals.attribution-N2PCCF4Q.js} +1 -1
  145. package/dist/website/BlocksPopup.d.ts +1 -1
  146. package/dist/website/PopupBlocks.d.ts +5 -2
  147. package/dist/website/SitePopups.d.ts +25 -0
  148. package/dist/website/images.js +4 -4
  149. package/dist/website/index.js +6 -6
  150. package/dist/website/popup-rules.d.ts +46 -0
  151. package/dist/website/popup-types.d.ts +113 -0
  152. package/dist/website/popups.d.ts +2 -6
  153. package/dist/website/popups.js +6 -14
  154. package/dist/{writeLLMsTxt-G3JBNBC5.js → writeLLMsTxt-2NQVDGYI.js} +3 -3
  155. package/docs/MIGRATING-TO-7.md +41 -9
  156. package/docs.json +2 -1
  157. package/package.json +2 -2
  158. package/src/analytics/README.md +2 -2
  159. package/src/articles/README.md +4 -1
  160. package/src/{engage → chat}/README.md +63 -62
  161. package/src/forms/README.md +49 -3
  162. package/src/layout/README.md +8 -5
  163. package/src/llms/README.md +69 -0
  164. package/src/mcp/README.md +50 -16
  165. package/src/seo/README.md +3 -1
  166. package/src/sync/README.md +10 -0
  167. package/src/website/README.md +133 -0
  168. package/dist/ChatWidget-UCDWMWCW.js +0 -15
  169. package/dist/EngageWidget-7ZYSK4GE.js +0 -11
  170. package/dist/ManagedForm-H7BVAH2W.js +0 -14
  171. package/dist/SitemapSync-XBANGKHZ.js +0 -8
  172. package/dist/chunk-NDF4A5JM.js +0 -37
  173. package/dist/chunk-VLARKWZU.js +0 -100
  174. package/dist/chunk-YCJT4JJG.js +0 -837
  175. package/dist/engage/DesignRenderer.d.ts +0 -57
  176. package/dist/engage/element-rules.d.ts +0 -38
package/dist/mcp/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { MCP_SUPPORTED_PROTOCOL_VERSIONS, dispatch, errorOutcome, JSONRPC_INVALID_REQUEST, META_CLIENT_INFO, JSONRPC_PARSE_ERROR, MCP_PROTOCOL_VERSION_MODERN } from '../chunk-FYAB6CXS.js';
2
2
  export { JSONRPC_METHOD_NOT_FOUND, MCP_ERROR_HEADER_MISMATCH, MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION, MCP_PROTOCOL_VERSIONS_LEGACY, MCP_PROTOCOL_VERSION_MODERN, MCP_SUPPORTED_PROTOCOL_VERSIONS, META_CLIENT_INFO, META_PROTOCOL_VERSION, META_SERVER_INFO, dispatch, isSupportedVersion, toToolDescriptor, toToolResult, toolErrorResult, validateArgs } from '../chunk-FYAB6CXS.js';
3
+ export { declarativeToolField, declarativeToolForm } from '../chunk-HW7B43E5.js';
3
4
  import '../chunk-PKBMQBKP.js';
5
+ import { createHash } from 'crypto';
4
6
 
5
7
  // src/mcp/types.ts
6
8
  function defineMcpTool(tool) {
@@ -9,6 +11,7 @@ function defineMcpTool(tool) {
9
11
 
10
12
  // src/mcp/serverCard.ts
11
13
  var MCP_SERVER_CARD_SCHEMA = "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json";
14
+ var MCP_SERVER_CARD_MEDIA_TYPE = "application/mcp-server-card+json";
12
15
  var MCP_SERVER_CARD_PATH = "/.well-known/mcp-server-card";
13
16
  var MCP_SERVER_CARD_LEGACY_PATH = "/.well-known/mcp.json";
14
17
  var SITE_KIT_CARD_META_KEY = "io.sonor.site-kit/tools";
@@ -69,6 +72,60 @@ function validateMcpServerCard(card) {
69
72
  }
70
73
  return problems;
71
74
  }
75
+ var MCP_AI_CATALOG_PATH = "/.well-known/ai-catalog.json";
76
+ var MCP_AI_CATALOG_MEDIA_TYPE = "application/ai-catalog+json";
77
+ function buildMcpAiCatalog(options) {
78
+ const base = new URL(options.baseUrl);
79
+ if (!["http:", "https:"].includes(base.protocol) || base.username || base.password || base.search || base.hash || base.pathname !== "/") {
80
+ throw new Error("baseUrl must be an explicit HTTP(S) origin without credentials, query or fragment");
81
+ }
82
+ const name = /^[^/\s]+\/([^/\s]+)$/.exec(options.info.name)?.[1];
83
+ if (!name) {
84
+ throw new Error('info.name must have a namespace and server name, e.g. "io.example/weather"');
85
+ }
86
+ const path = options.serverCardPath;
87
+ if (!path || path.startsWith("//") || path.includes("\\") || /^[a-z][a-z\d+.-]*:/i.test(path)) {
88
+ throw new Error("serverCardPath must be an origin-relative path");
89
+ }
90
+ const cardUrl = new URL(path.startsWith("/") ? path : `/${path}`, base);
91
+ if (cardUrl.hash) throw new Error("serverCardPath must not include a fragment");
92
+ return {
93
+ specVersion: "1.0",
94
+ entries: [{
95
+ identifier: `urn:air:${base.hostname}:mcp:${encodeURIComponent(name)}`,
96
+ type: MCP_SERVER_CARD_MEDIA_TYPE,
97
+ url: cardUrl.href
98
+ }]
99
+ };
100
+ }
101
+ function createMcpAiCatalogHandler(options) {
102
+ return createMcpDiscoveryHandlers(buildMcpAiCatalog(options), {
103
+ mediaType: MCP_AI_CATALOG_MEDIA_TYPE,
104
+ maxAge: options.maxAge
105
+ });
106
+ }
107
+ function createMcpDiscoveryHandlers(document, options) {
108
+ const body = `${JSON.stringify(document, null, 2)}
109
+ `;
110
+ const etag = `W/"${createHash("sha256").update(body).digest("base64url")}"`;
111
+ const maxAge = options.maxAge ?? 3600;
112
+ if (!Number.isSafeInteger(maxAge) || maxAge < 0) {
113
+ throw new Error("maxAge must be a non-negative integer");
114
+ }
115
+ const headers = {
116
+ "Content-Type": options.mediaType,
117
+ "Cache-Control": `public, max-age=${maxAge}`,
118
+ ETag: etag,
119
+ "Access-Control-Allow-Origin": "*",
120
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
121
+ "Access-Control-Allow-Headers": "Accept, Content-Type, If-None-Match",
122
+ "Access-Control-Expose-Headers": "ETag"
123
+ };
124
+ return {
125
+ GET: async () => new Response(body, { status: 200, headers }),
126
+ OPTIONS: async () => new Response(null, { status: 204, headers })
127
+ };
128
+ }
72
129
 
73
130
  // src/mcp/handlers.ts
74
131
  var MCP_REQUEST_HEADERS = [
@@ -255,35 +312,10 @@ function createMcpHandler(options) {
255
312
  return { POST, GET: methodNotAllowed, DELETE: methodNotAllowed, OPTIONS };
256
313
  }
257
314
  function createMcpServerCardHandler(options) {
258
- const card = buildMcpServerCard(options);
259
- const body = `${JSON.stringify(card, null, 2)}
260
- `;
261
- const maxAge = options.maxAge ?? 3600;
262
- const headers = {
263
- "Content-Type": "application/json",
264
- "Cache-Control": `public, max-age=${maxAge}`,
265
- // The card is a discovery document — it is meant to be fetched by anyone.
266
- "Access-Control-Allow-Origin": "*",
267
- "Access-Control-Allow-Methods": "GET, OPTIONS",
268
- "Access-Control-Allow-Headers": "Content-Type"
269
- };
270
- return {
271
- GET: async () => new Response(body, { status: 200, headers }),
272
- OPTIONS: async () => new Response(null, { status: 204, headers })
273
- };
274
- }
275
-
276
- // src/mcp/declarative.ts
277
- function declarativeToolForm(options) {
278
- const attributes = {
279
- toolname: options.name,
280
- tooldescription: options.description
281
- };
282
- if (options.autoSubmit) attributes.toolautosubmit = "";
283
- return attributes;
284
- }
285
- function declarativeToolField(description) {
286
- return { toolparamdescription: description };
315
+ return createMcpDiscoveryHandlers(buildMcpServerCard(options), {
316
+ mediaType: options.contentType ?? "application/json",
317
+ maxAge: options.maxAge
318
+ });
287
319
  }
288
320
 
289
- export { MCP_SERVER_CARD_LEGACY_PATH, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_SCHEMA, SITE_KIT_CARD_META_KEY, WEBMCP_SURFACE_HEADER, buildMcpServerCard, createMcpHandler, createMcpServerCardHandler, declarativeToolField, declarativeToolForm, decodeHeaderValue, defineMcpTool, toolCallRecord, validateMcpServerCard };
321
+ export { MCP_AI_CATALOG_MEDIA_TYPE, MCP_AI_CATALOG_PATH, MCP_SERVER_CARD_LEGACY_PATH, MCP_SERVER_CARD_MEDIA_TYPE, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_SCHEMA, SITE_KIT_CARD_META_KEY, WEBMCP_SURFACE_HEADER, buildMcpAiCatalog, buildMcpServerCard, createMcpAiCatalogHandler, createMcpHandler, createMcpServerCardHandler, decodeHeaderValue, defineMcpTool, toolCallRecord, validateMcpServerCard };
@@ -11,16 +11,15 @@
11
11
  * with enough identity attached that a human reviewing the connection knows
12
12
  * what they're approving.
13
13
  *
14
- * ── The two paths ─────────────────────────────────────────────────────────
15
- * SEP-1649 originally proposed `/.well-known/mcp.json`. The ratified SEP-2127
16
- * moved to `/.well-known/mcp-server-card`. Plenty of deployed crawlers and
17
- * validators still probe the old path, and serving one JSON document from two
18
- * URLs costs nothing, so `createMcpServerCardHandler` is mounted at both.
19
- * `mcp-server-card` is the canonical one; `mcp.json` is compatibility.
14
+ * The existing well-known paths stay available for compatibility. The newer
15
+ * experimental discovery draft uses a domain AI Catalog pointing to a card
16
+ * URL, with `<streamable-http-url>/server-card` as its recommended location.
17
+ * Hosts can mount the same card handler there without changing the old URLs.
20
18
  */
21
19
  import type { McpServerIcon, McpServerInfo, SiteKitMcpTool } from './types';
22
20
  export declare const MCP_SERVER_CARD_SCHEMA = "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json";
23
- /** Canonical well-known path (SEP-2127). */
21
+ export declare const MCP_SERVER_CARD_MEDIA_TYPE = "application/mcp-server-card+json";
22
+ /** Existing site-kit well-known path; retained for backward compatibility. */
24
23
  export declare const MCP_SERVER_CARD_PATH = "/.well-known/mcp-server-card";
25
24
  /** Superseded SEP-1649 path, still widely probed. */
26
25
  export declare const MCP_SERVER_CARD_LEGACY_PATH = "/.well-known/mcp.json";
package/dist/mcp/sonor.js CHANGED
@@ -1,30 +1,33 @@
1
1
  import { toolErrorResult } from '../chunk-FYAB6CXS.js';
2
2
  import { fetchReviews, fetchReviewStats } from '../chunk-EDYHROQ7.js';
3
3
  import { getOfferings } from '../chunk-G3NHWMP5.js';
4
- import { fetchBookingTypes, fetchAvailability } from '../chunk-M3YEPKP7.js';
5
- import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-GLHQ3LRO.js';
6
- import { getFormConfig } from '../chunk-V3PUVBME.js';
7
- import '../chunk-VLARKWZU.js';
4
+ import { fetchBookingTypes, fetchAvailability } from '../chunk-2ECWEUHP.js';
5
+ import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-6U3VLV2C.js';
6
+ import { getFormConfig } from '../chunk-XLSQTTUE.js';
7
+ import '../chunk-MVR4FY5R.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
- import '../chunk-CIG5UL2S.js';
9
+ import '../chunk-ZTLMPUO6.js';
10
10
  import '../chunk-DXO6SBMD.js';
11
- import '../chunk-LUXVWITO.js';
12
- import { getAllArticles, getArticle } from '../chunk-TXBAOEKG.js';
11
+ import '../chunk-4NTBQNHA.js';
12
+ import { getAllArticles, getArticle } from '../chunk-PKGN32AU.js';
13
13
  import '../chunk-Y3INC4QJ.js';
14
14
  import '../chunk-QXMIKDOL.js';
15
15
  import '../chunk-WMVK77ND.js';
16
16
  import { resolveFetch } from '../chunk-VX5CMNMM.js';
17
- import '../chunk-4Y5FWDPM.js';
17
+ import '../chunk-NZ4RXN3G.js';
18
+ import '../chunk-VWWITFWM.js';
18
19
  import '../chunk-MJP63SSS.js';
19
20
  import { resolveServerApiConfig } from '../chunk-X6F6SO4S.js';
20
21
  import '../chunk-MH2DSGC6.js';
21
22
  import { resolveSiteHost } from '../chunk-FESKKJAS.js';
22
23
  import '../chunk-A4CC4ZG3.js';
24
+ import '../chunk-C2FZBUSS.js';
23
25
  import '../chunk-5SQK3D53.js';
26
+ import '../chunk-HW7B43E5.js';
24
27
  import '../chunk-NJCTQH2P.js';
25
- import '../chunk-3SDOQUUF.js';
26
- import '../chunk-VDF5DFWT.js';
27
- import { SITE_KIT_VERSION } from '../chunk-AH5Q262S.js';
28
+ import '../chunk-BEBR4OJD.js';
29
+ import '../chunk-WGG6GTKW.js';
30
+ import { SITE_KIT_VERSION } from '../chunk-56KNHB4U.js';
28
31
  import '../chunk-PKBMQBKP.js';
29
32
  import 'server-only';
30
33
  import { after } from 'next/server.js';
@@ -1,7 +1,7 @@
1
- import { createSeoRevalidationHandler } from '../chunk-VGH4MDTU.js';
1
+ import { createSeoRevalidationHandler } from '../chunk-NI2XNEMR.js';
2
2
  import '../chunk-XTRZGXB2.js';
3
3
  export { SITE_CACHE_TAGS, SITE_REVALIDATE_PATH, isSiteRevalidatePong } from '../chunk-RYVDGXC2.js';
4
- import '../chunk-AH5Q262S.js';
4
+ import '../chunk-56KNHB4U.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
 
7
7
  // src/revalidate/index.ts
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-UXOGCKL6.js';
2
+ export { SitemapSync } from '../chunk-T4DLETKR.js';
3
3
  import '../chunk-YVKRYQRG.js';
4
4
  import '../chunk-43OCZ3JA.js';
5
5
  import '../chunk-EKBEOXTH.js';
6
- import '../chunk-3SDOQUUF.js';
7
- import '../chunk-VDF5DFWT.js';
8
- import '../chunk-AH5Q262S.js';
6
+ import '../chunk-BEBR4OJD.js';
7
+ import '../chunk-WGG6GTKW.js';
8
+ import '../chunk-56KNHB4U.js';
9
9
  import '../chunk-PKBMQBKP.js';
package/dist/seo/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  export { ManagedNoScripts, ManagedScripts } from '../chunk-MVLMXC44.js';
2
- import { pickManagedLlmSchemaForJsonLd } from '../chunk-4Y5FWDPM.js';
2
+ import { pickManagedLlmSchemaForJsonLd } from '../chunk-NZ4RXN3G.js';
3
3
  import { safeJsonLd } from '../chunk-4KZ6W3ZH.js';
4
- export { SitemapSync } from '../chunk-UXOGCKL6.js';
4
+ import { withoutSchemaPlaceholders } from '../chunk-VWWITFWM.js';
5
+ export { SitemapSync } from '../chunk-T4DLETKR.js';
5
6
  import { getManagedMetadata } from '../chunk-4YTYGG2C.js';
6
7
  export { generateSitemap, getABVariant, getManagedMetadata, getManagedMetadataWithAB, getRedirect, getRobotsDirective, isIndexable } from '../chunk-4YTYGG2C.js';
7
8
  import { getContentBlock, getSchemaMarkups, getSEOPageData, getEntityEnhancedSchema, getFAQData, getInternalLinks, getEntities, pruneSchemaTypes } from '../chunk-662ILEZ6.js';
@@ -17,9 +18,9 @@ import '../chunk-FESKKJAS.js';
17
18
  import '../chunk-A4CC4ZG3.js';
18
19
  import '../chunk-43OCZ3JA.js';
19
20
  import '../chunk-EKBEOXTH.js';
20
- import '../chunk-3SDOQUUF.js';
21
- import '../chunk-VDF5DFWT.js';
22
- import '../chunk-AH5Q262S.js';
21
+ import '../chunk-BEBR4OJD.js';
22
+ import '../chunk-WGG6GTKW.js';
23
+ import '../chunk-56KNHB4U.js';
23
24
  import '../chunk-PKBMQBKP.js';
24
25
  import { Suspense } from 'react';
25
26
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -73,10 +74,10 @@ async function ManagedSchemaAsync({
73
74
  const page = pageData?.page;
74
75
  const siteUrl = pageData?.project?.site_url || "";
75
76
  const deny = new Set(excludeTypes ?? []);
76
- const fromSonor = (values) => values.map((v) => pruneSchemaTypes(v, deny)).filter((v) => v !== null);
77
+ const fromSonor = (values) => values.map((v) => withoutPlaceholders(pruneSchemaTypes(v, deny))).filter(isSchemaObject);
77
78
  const allSchemas = [
78
79
  ...fromSonor(entitySchemas),
79
- ...schemas.map((s) => s.schema_json),
80
+ ...schemas.map((s) => withoutPlaceholders(s.schema_json)).filter(isSchemaObject),
80
81
  // Include auto-generated schema from Signal meta optimization
81
82
  ...fromSonor(page?.managed_schema ? [page.managed_schema] : []),
82
83
  ...additionalSchemas
@@ -127,7 +128,7 @@ async function LLMSchemaAsync({
127
128
  }) {
128
129
  const { page: pageData, project } = await getSEOPageData(path);
129
130
  const raw = pageData?.managed_llm_schema;
130
- const picked = pickManagedLlmSchemaForJsonLd(raw);
131
+ const picked = withoutPlaceholders(pickManagedLlmSchemaForJsonLd(raw));
131
132
  if (!picked) {
132
133
  return null;
133
134
  }
@@ -183,6 +184,12 @@ function createSpeakableWebPageSchema(type, name, url, speakable) {
183
184
  speakable: speakableSpec
184
185
  };
185
186
  }
187
+ function withoutPlaceholders(value) {
188
+ return withoutSchemaPlaceholders(value).value;
189
+ }
190
+ function isSchemaObject(value) {
191
+ return value !== null && typeof value === "object";
192
+ }
186
193
  function schemaNodeHasType(node, type) {
187
194
  if (!node || typeof node !== "object") return false;
188
195
  const t = node["@type"];
@@ -1,2 +1,2 @@
1
- export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, isEmittableReviewNode, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../../chunk-4Y5FWDPM.js';
1
+ export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, clipAtWordBoundary, isEmittableReviewNode, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../../chunk-NZ4RXN3G.js';
2
2
  import '../../chunk-PKBMQBKP.js';
package/dist/seo/llms.js CHANGED
@@ -1,19 +1,19 @@
1
- export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-WWSHFRDL.js';
1
+ export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-WDQB4OXY.js';
2
2
  export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-PO2TRJPY.js';
3
3
  export { AI_RETRIEVAL_CRAWLERS, AI_TRAINING_CRAWLERS, buildAiCrawlerRules, createRobotsTxtHandler } from '../chunk-QLTDFUJ7.js';
4
- export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-VGH4MDTU.js';
4
+ export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-NI2XNEMR.js';
5
5
  import '../chunk-XTRZGXB2.js';
6
6
  export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-PSAG45YF.js';
7
- export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-QEDHRBAT.js';
8
- export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-GLHQ3LRO.js';
7
+ export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-Z65DHMTW.js';
8
+ export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-6U3VLV2C.js';
9
9
  import '../chunk-L5UOHS6E.js';
10
10
  import '../chunk-WMVK77ND.js';
11
11
  import '../chunk-VX5CMNMM.js';
12
- export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../chunk-4Y5FWDPM.js';
12
+ export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../chunk-NZ4RXN3G.js';
13
13
  import '../chunk-4KZ6W3ZH.js';
14
14
  import '../chunk-MJP63SSS.js';
15
15
  import '../chunk-YVKRYQRG.js';
16
16
  import '../chunk-FESKKJAS.js';
17
17
  import '../chunk-A4CC4ZG3.js';
18
- import '../chunk-AH5Q262S.js';
18
+ import '../chunk-56KNHB4U.js';
19
19
  import '../chunk-PKBMQBKP.js';
@@ -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-G3JBNBC5.js');
461
+ const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-2NQVDGYI.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,11 +1,11 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-JBE46QJZ.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-Y6LP36UW.js';
2
2
  import '../chunk-Z22QVHT4.js';
3
- import '../chunk-QEDHRBAT.js';
4
- import '../chunk-GLHQ3LRO.js';
3
+ import '../chunk-Z65DHMTW.js';
4
+ import '../chunk-6U3VLV2C.js';
5
5
  import '../chunk-L5UOHS6E.js';
6
6
  import '../chunk-WMVK77ND.js';
7
7
  import '../chunk-VX5CMNMM.js';
8
- import '../chunk-4Y5FWDPM.js';
8
+ import '../chunk-NZ4RXN3G.js';
9
9
  import '../chunk-MJP63SSS.js';
10
10
  import '../chunk-ZEGVKVD5.js';
11
11
  import '../chunk-YVKRYQRG.js';
@@ -1,6 +1,6 @@
1
- export { resolveClientCredential } from '../chunk-6WIQCXOO.js';
1
+ export { resolveClientCredential } from '../chunk-DNPNYWVL.js';
2
2
  import '../chunk-VX5CMNMM.js';
3
3
  export { requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch } from '../chunk-X6F6SO4S.js';
4
4
  import '../chunk-MH2DSGC6.js';
5
- import '../chunk-AH5Q262S.js';
5
+ import '../chunk-56KNHB4U.js';
6
6
  import '../chunk-PKBMQBKP.js';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @sonordev/site-kit shared: how a popup behaves as a dialog.
3
+ *
4
+ * SINGLE SOURCE OF TRUTH for popup focus and Escape. PopupBlocks (Website →
5
+ * Popups & Banners) calls usePopupDialog. Don't hand-roll another keydown
6
+ * listener or focus trap.
7
+ *
8
+ * - Escape closes, whatever the placement.
9
+ * - A modal popup takes focus when it opens (the dialog element itself, so a
10
+ * screen reader announces its name first; Tab then reaches its controls),
11
+ * keeps Tab inside, and hands focus back to where it was when it closes.
12
+ * - A non-modal one (a bar, a slide-in) leaves focus where it is.
13
+ *
14
+ * React only: no Next imports and no other site-kit imports, because Sonor's
15
+ * popup builder renders PopupBlocks too, from a copy of these files.
16
+ */
17
+ import { type RefObject } from 'react';
18
+ export interface PopupDialogOptions {
19
+ /** False for a render that isn't live on the page (the builder preview). Default true. */
20
+ enabled?: boolean;
21
+ /** Takes focus, keeps Tab inside and returns focus on close. */
22
+ modal: boolean;
23
+ /** Escape calls it. */
24
+ onClose?: () => void;
25
+ }
26
+ /** Dialog behavior for the popup whose panel (the role="dialog" element) is `panelRef`. */
27
+ export declare function usePopupDialog(panelRef: RefObject<HTMLElement | null>, { enabled, modal, onClose }: PopupDialogOptions): void;
@@ -2,7 +2,7 @@
2
2
  * @sonordev/site-kit/shared — Unified Identity Management
3
3
  *
4
4
  * Single source of truth for visitor and session IDs across
5
- * Analytics, Signal, and Engage modules.
5
+ * Analytics, Signal, chat and popups.
6
6
  *
7
7
  * Storage keys:
8
8
  * localStorage: _sk_vid (visitor ID, persists ~forever)
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The layer a site's widgets stack on when the site sets nothing: popups,
3
+ * banners and toasts (SitePopups) and the chat launcher (SiteChat), with the
4
+ * chat window one below. Single source of truth for that default; the
5
+ * layout's `chat.zIndex` (or the deprecated `engage.zIndex`) overrides it.
6
+ */
7
+ export declare const DEFAULT_WIDGET_Z_INDEX = 9999;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @sonordev/site-kit shared: is the visitor in the middle of a form?
3
+ *
4
+ * SINGLE SOURCE OF TRUTH for whether something may open over the page right
5
+ * now. SitePopups asks before any popup or toast opens on its own (whatever
6
+ * the trigger: immediate, delay, scroll or exit intent) and waits while the
7
+ * answer is yes.
8
+ * Don't write a second check; extend this one.
9
+ *
10
+ * Why it matters: a modal popup takes focus and hides the rest of the page
11
+ * from assistive technology while it's open. Opening one mid-form throws a
12
+ * person out of the field they're typing in, and an agent browser filling the
13
+ * form for someone (they act on the accessibility tree) loses every field it
14
+ * was about to fill.
15
+ *
16
+ * Mid-form means any of:
17
+ * - focus is on a field (input, textarea, select) that belongs to a form, or
18
+ * inside a frame in a form (a payment provider's card field);
19
+ * - a form has a field the visitor filled: a value that isn't empty and isn't
20
+ * the one the page rendered with, or one they typed into (watchFormInput);
21
+ * - a site-kit form is carrying what the visitor typed into its server-rendered
22
+ * shell before it upgraded (FormEnhancer marks its wrapper
23
+ * `data-sk-carried`; the upgraded fields are new elements nobody typed into
24
+ * yet, and React keeps their default equal to their value);
25
+ * - a site-kit form is sending (`data-sk-state="submitting"`).
26
+ *
27
+ * Fields a visitor doesn't fill don't count: hidden inputs, buttons, fields
28
+ * nobody can see or reach (inert or aria-hidden), and site-kit's trap field.
29
+ */
30
+ /**
31
+ * Remember which fields the visitor types into from here on. React keeps a
32
+ * controlled field's default value equal to its current value, so comparing
33
+ * the two can't see what someone typed into one; the input event can.
34
+ * Idempotent: one pair of capture listeners per document, kept for the page's
35
+ * life. SitePopups starts it when it mounts.
36
+ */
37
+ export declare function watchFormInput(doc?: Document): void;
38
+ /** Whether the visitor is in the middle of a form (see the module comment for what counts). */
39
+ export declare function isVisitorMidForm(doc?: Document): boolean;
40
+ export interface MidFormWaitOptions {
41
+ doc?: Document;
42
+ /** How long after focus leaves a field to look again. Default 1500ms. */
43
+ settleMs?: number;
44
+ /** How often to look again while waiting. Default 5000ms. */
45
+ pollMs?: number;
46
+ }
47
+ /**
48
+ * Run `open` now if the visitor isn't mid-form, otherwise as soon as they
49
+ * aren't: a moment after focus leaves a field, or on the next poll (a form
50
+ * that sent and cleared, or went away). Never gives up on its own; the
51
+ * returned function cancels the wait. `open` runs at most once.
52
+ */
53
+ export declare function whenNotMidForm(open: () => void, options?: MidFormWaitOptions): () => void;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Single source of truth for client reporting eligibility and credentials.
3
- * Analytics, fleet, SitemapSync and Engage all resolve through this gate.
3
+ * Analytics, fleet, SitemapSync, chat and popups all resolve through this gate.
4
4
  * Kept separate from transport wrappers so non-analytics modules stay lean.
5
5
  */
6
6
  /** Resolved destination for an analytics send. */
@@ -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 = "7.1.2";
10
+ export declare const SITE_KIT_VERSION = "7.3.0";
@@ -15,7 +15,7 @@
15
15
  * bottom: calc(24px + env(safe-area-inset-bottom, 0px) + var(--sk-vv-layout-gap, 0px));
16
16
  *
17
17
  * The Echo launcher and chat popup already include it (see
18
- * engage/launcher-placement.ts), so mounting the tracker is all a site needs
18
+ * chat/launcher-placement.ts), so mounting the tracker is all a site needs
19
19
  * for those; the property is also there for the site's own fixed UI.
20
20
  *
21
21
  * Opt-in on purpose. The gap also grows to the keyboard's height while a
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useSignalExperiment, useSignalEvent } from '../chunk-PHYMNUJU.js';
3
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-PHYMNUJU.js';
2
+ import { useSignalExperiment, useSignalEvent } from '../chunk-CYUFBKJQ.js';
3
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-CYUFBKJQ.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
5
  import React, { useEffect } from 'react';
6
6
  import { jsx, Fragment } from 'react/jsx-runtime';
@@ -8,7 +8,7 @@ export interface SignalConfig {
8
8
  version: string;
9
9
  /** Whether Signal is enabled for this project */
10
10
  enabled: boolean;
11
- /** Engage element overrides */
11
+ /** Popup overrides (the key keeps the retired Engage module's name) */
12
12
  engage?: {
13
13
  popups?: Record<string, EngageOverride>;
14
14
  nudges?: Record<string, EngageOverride>;
@@ -1,11 +1,11 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-JBE46QJZ.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-Y6LP36UW.js';
2
2
  import '../chunk-Z22QVHT4.js';
3
- import '../chunk-QEDHRBAT.js';
4
- import '../chunk-GLHQ3LRO.js';
3
+ import '../chunk-Z65DHMTW.js';
4
+ import '../chunk-6U3VLV2C.js';
5
5
  import '../chunk-L5UOHS6E.js';
6
6
  import '../chunk-WMVK77ND.js';
7
7
  import '../chunk-VX5CMNMM.js';
8
- import '../chunk-4Y5FWDPM.js';
8
+ import '../chunk-NZ4RXN3G.js';
9
9
  import '../chunk-MJP63SSS.js';
10
10
  import '../chunk-ZEGVKVD5.js';
11
11
  import '../chunk-YVKRYQRG.js';
@@ -1,6 +1,6 @@
1
1
  import './chunk-PKBMQBKP.js';
2
2
 
3
- // src/engage/socket-loader.ts
3
+ // src/chat/socket-loader.ts
4
4
  async function createSocket(url, opts) {
5
5
  const { io } = await import(
6
6
  /* webpackChunkName: "socket-io" */
@@ -1,6 +1,6 @@
1
- export { BookingWidget } from '../chunk-JTU2GOM4.js';
2
- export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-M3YEPKP7.js';
3
- import '../chunk-3SDOQUUF.js';
4
- import '../chunk-VDF5DFWT.js';
5
- import '../chunk-AH5Q262S.js';
1
+ export { BookingWidget } from '../chunk-L7U23XI2.js';
2
+ export { createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold } from '../chunk-2ECWEUHP.js';
3
+ import '../chunk-BEBR4OJD.js';
4
+ import '../chunk-WGG6GTKW.js';
5
+ import '../chunk-56KNHB4U.js';
6
6
  import '../chunk-PKBMQBKP.js';
package/dist/types.d.ts CHANGED
@@ -14,6 +14,8 @@ export interface ProjectScoped {
14
14
  }
15
15
  export * from './seo/types';
16
16
  export * from './analytics/types';
17
- export * from './engage/types';
17
+ export * from './chat/types';
18
+ export * from './website/popup-types';
19
+ export type { EngageAnalytics, EngageConfig, EngageElement, TargetingRules, TriggerConfig, WidgetConfig, WidgetType } from './engage/types';
18
20
  export * from './forms/types';
19
21
  export * from './articles/types';
@@ -1,6 +1,6 @@
1
1
  import { __publicField } from './chunk-PKBMQBKP.js';
2
2
 
3
- // ../../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/web-vitals@6.1.0/node_modules/web-vitals/dist/web-vitals.attribution.js
3
+ // node_modules/.pnpm/web-vitals@6.1.0/node_modules/web-vitals/dist/web-vitals.attribution.js
4
4
  var t = class {
5
5
  constructor() {
6
6
  __publicField(this, "t");
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * The site side of a blocks popup: re-checks the blocks, measures the site's
5
5
  * design once when the popup opens, and hands both to PopupBlocks.
6
- * EngageWidget loads this with a dynamic import, so the renderer, the
6
+ * SitePopups loads this with a dynamic import, so the renderer, the
7
7
  * contract and the design measurement download only when a blocks popup is
8
8
  * actually about to show (most page loads have none).
9
9
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Draws a popup from its blocks (heading, formatted text, image, button,
5
5
  * divider) in the site's own design. SINGLE renderer for both places a popup
6
- * appears: on the site (EngageWidget, fed the measured tokens) and in Sonor's
6
+ * appears: on the site (SitePopups, fed the measured tokens) and in Sonor's
7
7
  * builder preview (fed the tokens the site reported). React only, no Next
8
8
  * imports, so the dashboard can import it as-is.
9
9
  *
@@ -18,7 +18,10 @@
18
18
  * Accessibility: a centred popup is a modal dialog (labelled by its heading,
19
19
  * focus moves in and is kept there, Escape and the overlay close it, focus
20
20
  * goes back where it was). A bar is a labelled region, a slide-in a
21
- * non-modal dialog; both close on Escape. Text HTML is re-sanitized on render.
21
+ * non-modal dialog; both close on Escape. The focus and Escape behavior is
22
+ * usePopupDialog (../shared/dialog), so the builder's copy needs that file
23
+ * beside it. Text HTML is re-sanitized on
24
+ * render.
22
25
  */
23
26
  import React from 'react';
24
27
  import { type PopupBlock, type SiteDesignTokens } from './contract';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @sonordev/site-kit/website/popups - SitePopups: the popups, banners and
3
+ * toasts published for this site (Sonor → Website → Popups & Banners).
4
+ *
5
+ * Each shows where and when Sonor says (pages, devices, trigger, frequency,
6
+ * schedule), drawn from its blocks in the site's own design by PopupBlocks.
7
+ * SiteKitLayout mounts it for you (its `popups` prop); mount it yourself only
8
+ * on a site without SiteKitLayout. A project with nothing published costs one
9
+ * request and draws nothing. The renderer downloads when a popup first opens.
10
+ */
11
+ import React from 'react';
12
+ import { type AnalyticsGateOptions } from '../shared/reporting-gate';
13
+ export interface SitePopupsProps extends AnalyticsGateOptions {
14
+ apiUrl?: string;
15
+ apiKey?: string;
16
+ /** The layer popups, banners and toasts stack on. Default: 9999. */
17
+ zIndex?: number;
18
+ debug?: boolean;
19
+ }
20
+ /**
21
+ * Same gate as analytics (frames, localhost, a key to send with): a popup in
22
+ * a case study's device frame is shown to the agency's visitor, not this
23
+ * site's, and its impressions would count against this site.
24
+ */
25
+ export declare function SitePopups(props: SitePopupsProps): React.JSX.Element | null;
@@ -1,6 +1,6 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-ILU5I6RW.js';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-ZHS2XFLV.js';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
3
- import '../chunk-3SDOQUUF.js';
4
- import '../chunk-VDF5DFWT.js';
5
- import '../chunk-AH5Q262S.js';
3
+ import '../chunk-BEBR4OJD.js';
4
+ import '../chunk-WGG6GTKW.js';
5
+ import '../chunk-56KNHB4U.js';
6
6
  import '../chunk-PKBMQBKP.js';