@sonordev/site-kit 1.2.7

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 (300) hide show
  1. package/README.md +376 -0
  2. package/dist/SetupWizard-Cki06kB0.d.mts +12 -0
  3. package/dist/SetupWizard-Cki06kB0.d.ts +12 -0
  4. package/dist/analytics/index.d.mts +93 -0
  5. package/dist/analytics/index.d.ts +93 -0
  6. package/dist/analytics/index.js +89 -0
  7. package/dist/analytics/index.js.map +1 -0
  8. package/dist/analytics/index.mjs +71 -0
  9. package/dist/analytics/index.mjs.map +1 -0
  10. package/dist/api-CWtoFJCO.d.mts +137 -0
  11. package/dist/api-CWtoFJCO.d.ts +137 -0
  12. package/dist/blog/index.d.mts +305 -0
  13. package/dist/blog/index.d.ts +305 -0
  14. package/dist/blog/index.js +1578 -0
  15. package/dist/blog/index.js.map +1 -0
  16. package/dist/blog/index.mjs +1562 -0
  17. package/dist/blog/index.mjs.map +1 -0
  18. package/dist/blog/server.d.mts +229 -0
  19. package/dist/blog/server.d.ts +229 -0
  20. package/dist/blog/server.js +692 -0
  21. package/dist/blog/server.js.map +1 -0
  22. package/dist/blog/server.mjs +666 -0
  23. package/dist/blog/server.mjs.map +1 -0
  24. package/dist/chunk-24277A3Q.mjs +968 -0
  25. package/dist/chunk-24277A3Q.mjs.map +1 -0
  26. package/dist/chunk-373TK6TZ.js +321 -0
  27. package/dist/chunk-373TK6TZ.js.map +1 -0
  28. package/dist/chunk-3MYZS6PD.js +30 -0
  29. package/dist/chunk-3MYZS6PD.js.map +1 -0
  30. package/dist/chunk-43GBM4SX.js +283 -0
  31. package/dist/chunk-43GBM4SX.js.map +1 -0
  32. package/dist/chunk-4XPGGLVP.mjs +53 -0
  33. package/dist/chunk-4XPGGLVP.mjs.map +1 -0
  34. package/dist/chunk-622GAQP5.js +2008 -0
  35. package/dist/chunk-622GAQP5.js.map +1 -0
  36. package/dist/chunk-6BIPAKL4.mjs +28 -0
  37. package/dist/chunk-6BIPAKL4.mjs.map +1 -0
  38. package/dist/chunk-6ZCISNAB.mjs +343 -0
  39. package/dist/chunk-6ZCISNAB.mjs.map +1 -0
  40. package/dist/chunk-72MQFHYJ.js +1429 -0
  41. package/dist/chunk-72MQFHYJ.js.map +1 -0
  42. package/dist/chunk-7557OTHW.js +62 -0
  43. package/dist/chunk-7557OTHW.js.map +1 -0
  44. package/dist/chunk-7FUV73JZ.js +981 -0
  45. package/dist/chunk-7FUV73JZ.js.map +1 -0
  46. package/dist/chunk-7RF6PVHA.mjs +324 -0
  47. package/dist/chunk-7RF6PVHA.mjs.map +1 -0
  48. package/dist/chunk-7RYCHO6D.mjs +134 -0
  49. package/dist/chunk-7RYCHO6D.mjs.map +1 -0
  50. package/dist/chunk-7UKPRW25.mjs +1999 -0
  51. package/dist/chunk-7UKPRW25.mjs.map +1 -0
  52. package/dist/chunk-7URAOG2M.js +14864 -0
  53. package/dist/chunk-7URAOG2M.js.map +1 -0
  54. package/dist/chunk-AFAO3TGS.mjs +810 -0
  55. package/dist/chunk-AFAO3TGS.mjs.map +1 -0
  56. package/dist/chunk-BYLIU6XG.js +343 -0
  57. package/dist/chunk-BYLIU6XG.js.map +1 -0
  58. package/dist/chunk-D63MUKZ6.mjs +4423 -0
  59. package/dist/chunk-D63MUKZ6.mjs.map +1 -0
  60. package/dist/chunk-DDKW2FNA.js +390 -0
  61. package/dist/chunk-DDKW2FNA.js.map +1 -0
  62. package/dist/chunk-DQYMKR27.mjs +341 -0
  63. package/dist/chunk-DQYMKR27.mjs.map +1 -0
  64. package/dist/chunk-DW5UJKHH.js +221 -0
  65. package/dist/chunk-DW5UJKHH.js.map +1 -0
  66. package/dist/chunk-EEZCR6E6.js +50 -0
  67. package/dist/chunk-EEZCR6E6.js.map +1 -0
  68. package/dist/chunk-GCJXQ4AG.mjs +59 -0
  69. package/dist/chunk-GCJXQ4AG.mjs.map +1 -0
  70. package/dist/chunk-JGNQK2G6.mjs +14845 -0
  71. package/dist/chunk-JGNQK2G6.mjs.map +1 -0
  72. package/dist/chunk-JTLOJLWQ.mjs +563 -0
  73. package/dist/chunk-JTLOJLWQ.mjs.map +1 -0
  74. package/dist/chunk-K23A4G76.mjs +202 -0
  75. package/dist/chunk-K23A4G76.mjs.map +1 -0
  76. package/dist/chunk-KKU3K7RG.js +336 -0
  77. package/dist/chunk-KKU3K7RG.js.map +1 -0
  78. package/dist/chunk-KUGMH4ZF.js +571 -0
  79. package/dist/chunk-KUGMH4ZF.js.map +1 -0
  80. package/dist/chunk-LBVWVP72.js +110 -0
  81. package/dist/chunk-LBVWVP72.js.map +1 -0
  82. package/dist/chunk-LIVWLY2P.js +138 -0
  83. package/dist/chunk-LIVWLY2P.js.map +1 -0
  84. package/dist/chunk-M2T6R7BA.mjs +1003 -0
  85. package/dist/chunk-M2T6R7BA.mjs.map +1 -0
  86. package/dist/chunk-MV3QN7PW.mjs +47 -0
  87. package/dist/chunk-MV3QN7PW.mjs.map +1 -0
  88. package/dist/chunk-OB7E654K.js +72 -0
  89. package/dist/chunk-OB7E654K.js.map +1 -0
  90. package/dist/chunk-OIIKTGRL.mjs +380 -0
  91. package/dist/chunk-OIIKTGRL.mjs.map +1 -0
  92. package/dist/chunk-P3UWIUJS.mjs +1427 -0
  93. package/dist/chunk-P3UWIUJS.mjs.map +1 -0
  94. package/dist/chunk-PKN27UMH.mjs +136 -0
  95. package/dist/chunk-PKN27UMH.mjs.map +1 -0
  96. package/dist/chunk-QXV4667R.mjs +105 -0
  97. package/dist/chunk-QXV4667R.mjs.map +1 -0
  98. package/dist/chunk-S7FRYNSU.mjs +315 -0
  99. package/dist/chunk-S7FRYNSU.mjs.map +1 -0
  100. package/dist/chunk-TFLQX7K7.mjs +68 -0
  101. package/dist/chunk-TFLQX7K7.mjs.map +1 -0
  102. package/dist/chunk-UWE5PCYJ.mjs +279 -0
  103. package/dist/chunk-UWE5PCYJ.mjs.map +1 -0
  104. package/dist/chunk-UYFDNX2F.js +4469 -0
  105. package/dist/chunk-UYFDNX2F.js.map +1 -0
  106. package/dist/chunk-W4PALSGM.js +350 -0
  107. package/dist/chunk-W4PALSGM.js.map +1 -0
  108. package/dist/chunk-WECQ6KOB.js +1008 -0
  109. package/dist/chunk-WECQ6KOB.js.map +1 -0
  110. package/dist/chunk-XQQWI6WB.js +814 -0
  111. package/dist/chunk-XQQWI6WB.js.map +1 -0
  112. package/dist/chunk-XZJOZJB6.js +140 -0
  113. package/dist/chunk-XZJOZJB6.js.map +1 -0
  114. package/dist/chunk-ZSMWDLMK.js +63 -0
  115. package/dist/chunk-ZSMWDLMK.js.map +1 -0
  116. package/dist/cli/index.js +37243 -0
  117. package/dist/cli/index.js.map +1 -0
  118. package/dist/cli/index.mjs +37209 -0
  119. package/dist/cli/index.mjs.map +1 -0
  120. package/dist/commerce/index.d.mts +170 -0
  121. package/dist/commerce/index.d.ts +170 -0
  122. package/dist/commerce/index.js +174 -0
  123. package/dist/commerce/index.js.map +1 -0
  124. package/dist/commerce/index.mjs +5 -0
  125. package/dist/commerce/index.mjs.map +1 -0
  126. package/dist/commerce/server.d.mts +107 -0
  127. package/dist/commerce/server.d.ts +107 -0
  128. package/dist/commerce/server.js +187 -0
  129. package/dist/commerce/server.js.map +1 -0
  130. package/dist/commerce/server.mjs +177 -0
  131. package/dist/commerce/server.mjs.map +1 -0
  132. package/dist/config/index.d.mts +43 -0
  133. package/dist/config/index.d.ts +43 -0
  134. package/dist/config/index.js +66 -0
  135. package/dist/config/index.js.map +1 -0
  136. package/dist/config/index.mjs +64 -0
  137. package/dist/config/index.mjs.map +1 -0
  138. package/dist/engage/index.d.mts +33 -0
  139. package/dist/engage/index.d.ts +33 -0
  140. package/dist/engage/index.js +22 -0
  141. package/dist/engage/index.js.map +1 -0
  142. package/dist/engage/index.mjs +5 -0
  143. package/dist/engage/index.mjs.map +1 -0
  144. package/dist/forms/index.d.mts +437 -0
  145. package/dist/forms/index.d.ts +437 -0
  146. package/dist/forms/index.js +1168 -0
  147. package/dist/forms/index.js.map +1 -0
  148. package/dist/forms/index.mjs +1142 -0
  149. package/dist/forms/index.mjs.map +1 -0
  150. package/dist/generators-2XKQMPKH.mjs +4 -0
  151. package/dist/generators-2XKQMPKH.mjs.map +1 -0
  152. package/dist/generators-DTMO36DV.js +33 -0
  153. package/dist/generators-DTMO36DV.js.map +1 -0
  154. package/dist/images/index.d.mts +4 -0
  155. package/dist/images/index.d.ts +4 -0
  156. package/dist/images/index.js +46 -0
  157. package/dist/images/index.js.map +1 -0
  158. package/dist/images/index.mjs +5 -0
  159. package/dist/images/index.mjs.map +1 -0
  160. package/dist/images/server.d.mts +69 -0
  161. package/dist/images/server.d.ts +69 -0
  162. package/dist/images/server.js +21 -0
  163. package/dist/images/server.js.map +1 -0
  164. package/dist/images/server.mjs +4 -0
  165. package/dist/images/server.mjs.map +1 -0
  166. package/dist/index.d.mts +846 -0
  167. package/dist/index.d.ts +846 -0
  168. package/dist/index.js +2623 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/index.mjs +2416 -0
  171. package/dist/index.mjs.map +1 -0
  172. package/dist/layout/index.d.mts +53 -0
  173. package/dist/layout/index.d.ts +53 -0
  174. package/dist/layout/index.js +187 -0
  175. package/dist/layout/index.js.map +1 -0
  176. package/dist/layout/index.mjs +185 -0
  177. package/dist/layout/index.mjs.map +1 -0
  178. package/dist/llms/index.d.mts +448 -0
  179. package/dist/llms/index.d.ts +448 -0
  180. package/dist/llms/index.js +581 -0
  181. package/dist/llms/index.js.map +1 -0
  182. package/dist/llms/index.mjs +529 -0
  183. package/dist/llms/index.mjs.map +1 -0
  184. package/dist/manifest/index.d.mts +62 -0
  185. package/dist/manifest/index.d.ts +62 -0
  186. package/dist/manifest/index.js +85 -0
  187. package/dist/manifest/index.js.map +1 -0
  188. package/dist/manifest/index.mjs +83 -0
  189. package/dist/manifest/index.mjs.map +1 -0
  190. package/dist/middleware/index.d.mts +63 -0
  191. package/dist/middleware/index.d.ts +63 -0
  192. package/dist/middleware/index.js +54 -0
  193. package/dist/middleware/index.js.map +1 -0
  194. package/dist/middleware/index.mjs +51 -0
  195. package/dist/middleware/index.mjs.map +1 -0
  196. package/dist/migrator-2MQHOFDQ.mjs +4 -0
  197. package/dist/migrator-2MQHOFDQ.mjs.map +1 -0
  198. package/dist/migrator-THJCF6MZ.js +37 -0
  199. package/dist/migrator-THJCF6MZ.js.map +1 -0
  200. package/dist/redirects/index.d.mts +78 -0
  201. package/dist/redirects/index.d.ts +78 -0
  202. package/dist/redirects/index.js +26 -0
  203. package/dist/redirects/index.js.map +1 -0
  204. package/dist/redirects/index.mjs +5 -0
  205. package/dist/redirects/index.mjs.map +1 -0
  206. package/dist/reputation/index.d.mts +57 -0
  207. package/dist/reputation/index.d.ts +57 -0
  208. package/dist/reputation/index.js +21 -0
  209. package/dist/reputation/index.js.map +1 -0
  210. package/dist/reputation/index.mjs +4 -0
  211. package/dist/reputation/index.mjs.map +1 -0
  212. package/dist/robots/index.d.mts +38 -0
  213. package/dist/robots/index.d.ts +38 -0
  214. package/dist/robots/index.js +52 -0
  215. package/dist/robots/index.js.map +1 -0
  216. package/dist/robots/index.mjs +50 -0
  217. package/dist/robots/index.mjs.map +1 -0
  218. package/dist/routing-B5XS-6_W.d.mts +118 -0
  219. package/dist/routing-DZYzyDHw.d.ts +118 -0
  220. package/dist/scanner-GAF5PO5F.js +53 -0
  221. package/dist/scanner-GAF5PO5F.js.map +1 -0
  222. package/dist/scanner-LKJKW7IT.mjs +4 -0
  223. package/dist/scanner-LKJKW7IT.mjs.map +1 -0
  224. package/dist/securityHeaders-nwZ6nP4g.d.mts +24 -0
  225. package/dist/securityHeaders-nwZ6nP4g.d.ts +24 -0
  226. package/dist/seo/index.d.mts +600 -0
  227. package/dist/seo/index.d.ts +600 -0
  228. package/dist/seo/index.js +883 -0
  229. package/dist/seo/index.js.map +1 -0
  230. package/dist/seo/index.mjs +773 -0
  231. package/dist/seo/index.mjs.map +1 -0
  232. package/dist/seo/register-sitemap-cli.js +151 -0
  233. package/dist/seo/register-sitemap-cli.js.map +1 -0
  234. package/dist/seo/register-sitemap-cli.mjs +144 -0
  235. package/dist/seo/register-sitemap-cli.mjs.map +1 -0
  236. package/dist/seo/server.d.mts +107 -0
  237. package/dist/seo/server.d.ts +107 -0
  238. package/dist/seo/server.js +207 -0
  239. package/dist/seo/server.js.map +1 -0
  240. package/dist/seo/server.mjs +186 -0
  241. package/dist/seo/server.mjs.map +1 -0
  242. package/dist/server-api-EWXKOQZA.mjs +4 -0
  243. package/dist/server-api-EWXKOQZA.mjs.map +1 -0
  244. package/dist/server-api-GJPNRYUP.js +81 -0
  245. package/dist/server-api-GJPNRYUP.js.map +1 -0
  246. package/dist/setup/client.d.mts +60 -0
  247. package/dist/setup/client.d.ts +60 -0
  248. package/dist/setup/client.js +31 -0
  249. package/dist/setup/client.js.map +1 -0
  250. package/dist/setup/client.mjs +6 -0
  251. package/dist/setup/client.mjs.map +1 -0
  252. package/dist/setup/index.d.mts +5 -0
  253. package/dist/setup/index.d.ts +5 -0
  254. package/dist/setup/index.js +35 -0
  255. package/dist/setup/index.js.map +1 -0
  256. package/dist/setup/index.mjs +6 -0
  257. package/dist/setup/index.mjs.map +1 -0
  258. package/dist/setup/server.d.mts +14 -0
  259. package/dist/setup/server.d.ts +14 -0
  260. package/dist/setup/server.js +13 -0
  261. package/dist/setup/server.js.map +1 -0
  262. package/dist/setup/server.mjs +4 -0
  263. package/dist/setup/server.mjs.map +1 -0
  264. package/dist/site-config/index.d.mts +24 -0
  265. package/dist/site-config/index.d.ts +24 -0
  266. package/dist/site-config/index.js +17 -0
  267. package/dist/site-config/index.js.map +1 -0
  268. package/dist/site-config/index.mjs +4 -0
  269. package/dist/site-config/index.mjs.map +1 -0
  270. package/dist/sitemap/index.d.mts +96 -0
  271. package/dist/sitemap/index.d.ts +96 -0
  272. package/dist/sitemap/index.js +288 -0
  273. package/dist/sitemap/index.js.map +1 -0
  274. package/dist/sitemap/index.mjs +285 -0
  275. package/dist/sitemap/index.mjs.map +1 -0
  276. package/dist/socket-loader-J26QHHOB.js +16 -0
  277. package/dist/socket-loader-J26QHHOB.js.map +1 -0
  278. package/dist/socket-loader-R7S2YJ2J.mjs +14 -0
  279. package/dist/socket-loader-R7S2YJ2J.mjs.map +1 -0
  280. package/dist/types-0dmq3k20.d.mts +168 -0
  281. package/dist/types-0dmq3k20.d.ts +168 -0
  282. package/dist/types-Blb2QNkV.d.mts +263 -0
  283. package/dist/types-Blb2QNkV.d.ts +263 -0
  284. package/dist/types-BnCwwUX3.d.mts +250 -0
  285. package/dist/types-BnCwwUX3.d.ts +250 -0
  286. package/dist/types-CGlnp43R.d.mts +312 -0
  287. package/dist/types-CGlnp43R.d.ts +312 -0
  288. package/dist/types-D08004rU.d.mts +179 -0
  289. package/dist/types-D08004rU.d.ts +179 -0
  290. package/dist/types-DNSYU7qI.d.mts +127 -0
  291. package/dist/types-DNSYU7qI.d.ts +127 -0
  292. package/dist/types-KZP_VWZp.d.mts +266 -0
  293. package/dist/types-KZP_VWZp.d.ts +266 -0
  294. package/dist/useEventModal-BVTx69XE.d.mts +274 -0
  295. package/dist/useEventModal-Dx1dItTJ.d.ts +274 -0
  296. package/dist/web-vitals-444RLW3B.js +252 -0
  297. package/dist/web-vitals-444RLW3B.js.map +1 -0
  298. package/dist/web-vitals-KPICZIEF.mjs +241 -0
  299. package/dist/web-vitals-KPICZIEF.mjs.map +1 -0
  300. package/package.json +192 -0
@@ -0,0 +1,773 @@
1
+ export { ManagedNoScripts, ManagedScripts } from '../chunk-MV3QN7PW.mjs';
2
+ export { SitemapSync } from '../chunk-PKN27UMH.mjs';
3
+ export { generateSitemap, getRedirect, getRobotsDirective, isIndexable } from '../chunk-7RYCHO6D.mjs';
4
+ import { getSEOPageData, ensureMetadata, getABTest, recordABImpression, getSchemaMarkups, getEntityEnhancedSchema, getFAQData, getInternalLinks, getContentBlock, getEntities } from '../chunk-K23A4G76.mjs';
5
+ export { getABTest, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap } from '../chunk-K23A4G76.mjs';
6
+ import '../chunk-4XPGGLVP.mjs';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+ import { cache } from 'react';
9
+
10
+ // src/seo/getManagedMetadata.ts
11
+ async function getManagedMetadata(options) {
12
+ const { path, fallback = {}, overrides = {}, favicon: faviconMode = "metadata" } = options;
13
+ const omitIcons = faviconMode === "component";
14
+ const result = await getSEOPageData(path);
15
+ const pageData = result?.page;
16
+ const projectData = result?.project;
17
+ if (!pageData) {
18
+ const fallbackMeta = {
19
+ ...fallback,
20
+ ...overrides,
21
+ _managed: false,
22
+ _source: "fallback"
23
+ };
24
+ if (!omitIcons && projectData?.logo_url) {
25
+ fallbackMeta.icons = {
26
+ icon: projectData.logo_url,
27
+ apple: projectData.logo_url
28
+ };
29
+ }
30
+ return fallbackMeta;
31
+ }
32
+ const metadata = {
33
+ _managed: true,
34
+ _source: "database"
35
+ };
36
+ if (!omitIcons && projectData?.logo_url) {
37
+ metadata.icons = {
38
+ icon: projectData.logo_url,
39
+ apple: projectData.logo_url
40
+ };
41
+ }
42
+ let signalData = null;
43
+ if (!pageData.managed_title && !pageData.managed_meta_description && !pageData.managed_description) {
44
+ try {
45
+ signalData = await ensureMetadata(path);
46
+ } catch {
47
+ }
48
+ }
49
+ if (pageData.managed_title) {
50
+ metadata.title = pageData.managed_title;
51
+ } else if (signalData?.managed_title) {
52
+ metadata.title = signalData.managed_title;
53
+ metadata._source = "signal";
54
+ } else if (fallback.title) {
55
+ metadata.title = fallback.title;
56
+ }
57
+ if (pageData.managed_meta_description || pageData.managed_description) {
58
+ metadata.description = pageData.managed_meta_description || pageData.managed_description;
59
+ } else if (signalData?.managed_meta_description) {
60
+ metadata.description = signalData.managed_meta_description;
61
+ metadata._source = "signal";
62
+ } else if (fallback.description) {
63
+ metadata.description = fallback.description;
64
+ }
65
+ if (pageData.managed_keywords?.length) {
66
+ metadata.keywords = pageData.managed_keywords;
67
+ } else if (signalData?.managed_keywords?.length) {
68
+ metadata.keywords = signalData.managed_keywords;
69
+ metadata._source = "signal";
70
+ } else if (fallback.keywords) {
71
+ metadata.keywords = fallback.keywords;
72
+ }
73
+ if (pageData.managed_robots) {
74
+ metadata.robots = pageData.managed_robots;
75
+ }
76
+ if (pageData.managed_canonical) {
77
+ metadata.alternates = {
78
+ ...metadata.alternates,
79
+ canonical: pageData.managed_canonical
80
+ };
81
+ }
82
+ const ogTitle = pageData.managed_og_title || pageData.managed_title;
83
+ const ogDescription = pageData.managed_og_description || pageData.managed_meta_description || pageData.managed_description;
84
+ const ogImage = pageData.managed_og_image;
85
+ if (ogTitle || ogDescription || ogImage) {
86
+ metadata.openGraph = {
87
+ ...ogTitle && { title: ogTitle },
88
+ ...ogDescription && { description: ogDescription },
89
+ ...ogImage && { images: [{ url: ogImage }] }
90
+ };
91
+ }
92
+ if (ogTitle || ogDescription || ogImage) {
93
+ metadata.twitter = {
94
+ card: "summary_large_image",
95
+ ...ogTitle && { title: ogTitle },
96
+ ...ogDescription && { description: ogDescription },
97
+ ...ogImage && { images: [ogImage] }
98
+ };
99
+ }
100
+ return {
101
+ ...metadata,
102
+ ...overrides,
103
+ _managed: true,
104
+ _source: "database"
105
+ };
106
+ }
107
+ async function getABVariant(options) {
108
+ const { path, field, sessionId } = options;
109
+ const test = await getABTest(path, field);
110
+ if (!test) {
111
+ return null;
112
+ }
113
+ let variant;
114
+ if (sessionId) {
115
+ const hash = sessionId.split("").reduce((acc, char) => {
116
+ return (acc << 5) - acc + char.charCodeAt(0);
117
+ }, 0);
118
+ variant = Math.abs(hash) % 100 < test.traffic_split * 100 ? "a" : "b";
119
+ } else {
120
+ variant = Math.random() < test.traffic_split ? "a" : "b";
121
+ }
122
+ recordABImpression(test.id, variant, sessionId).catch(() => {
123
+ });
124
+ return {
125
+ testId: test.id,
126
+ variant,
127
+ value: variant === "a" ? test.variant_a : test.variant_b
128
+ };
129
+ }
130
+ async function getManagedMetadataWithAB(options) {
131
+ const { sessionId, ...metadataOptions } = options;
132
+ const metadata = await getManagedMetadata(metadataOptions);
133
+ const titleTest = await getABVariant({
134
+ path: options.path,
135
+ field: "title",
136
+ sessionId
137
+ });
138
+ if (titleTest) {
139
+ metadata.title = titleTest.value;
140
+ }
141
+ const descTest = await getABVariant({
142
+ path: options.path,
143
+ field: "description",
144
+ sessionId
145
+ });
146
+ if (descTest) {
147
+ metadata.description = descTest.value;
148
+ }
149
+ return metadata;
150
+ }
151
+
152
+ // src/seo/withManagedMetadata.ts
153
+ function withManagedMetadata(path, pageMetadata) {
154
+ return async function generateMetadata(args, parent) {
155
+ const resolvedPath = typeof path === "function" ? await path(args) : path;
156
+ const managed = await getManagedMetadata({ path: resolvedPath });
157
+ if (!pageMetadata) {
158
+ return managed;
159
+ }
160
+ const pageSpecific = await pageMetadata(args, parent);
161
+ return {
162
+ ...managed,
163
+ ...pageSpecific,
164
+ openGraph: {
165
+ ...managed.openGraph,
166
+ ...pageSpecific.openGraph
167
+ },
168
+ twitter: {
169
+ ...managed.twitter,
170
+ ...pageSpecific.twitter
171
+ }
172
+ };
173
+ };
174
+ }
175
+ var DEFAULT_SPEAKABLE_SELECTORS = [
176
+ "h1",
177
+ '[data-speakable="true"]',
178
+ ".page-summary",
179
+ ".key-points",
180
+ '.aeo-block[data-speakable="true"]'
181
+ ];
182
+ async function ManagedSchema({
183
+ path,
184
+ additionalSchemas = [],
185
+ includeTypes,
186
+ excludeTypes,
187
+ speakable,
188
+ pageType = "WebPage",
189
+ pageName,
190
+ pageUrl,
191
+ includeEntityGraph = true
192
+ }) {
193
+ const schemas = await getSchemaMarkups(path, {
194
+ includeTypes,
195
+ excludeTypes
196
+ });
197
+ const pageData = await getSEOPageData(path);
198
+ let entitySchemas = [];
199
+ if (includeEntityGraph) {
200
+ try {
201
+ entitySchemas = await getEntityEnhancedSchema(path);
202
+ } catch {
203
+ }
204
+ }
205
+ const page = pageData?.page;
206
+ const siteUrl = pageData?.project?.site_url || "";
207
+ const allSchemas = [
208
+ ...entitySchemas,
209
+ ...schemas.map((s) => s.schema_json),
210
+ // Include auto-generated schema from Signal meta optimization
211
+ ...page?.managed_schema ? [page.managed_schema] : [],
212
+ ...additionalSchemas
213
+ ];
214
+ const hasBreadcrumb = allSchemas.some(
215
+ (s) => s && typeof s === "object" && s["@type"] === "BreadcrumbList"
216
+ );
217
+ if (!hasBreadcrumb && path !== "/" && siteUrl) {
218
+ allSchemas.push(createBreadcrumbSchema(siteUrl, path));
219
+ }
220
+ if (speakable && pageName && pageUrl) {
221
+ const speakableSchema = createSpeakableWebPageSchema(
222
+ pageType,
223
+ pageName,
224
+ pageUrl,
225
+ typeof speakable === "object" ? speakable : void 0
226
+ );
227
+ allSchemas.push(speakableSchema);
228
+ }
229
+ if (allSchemas.length === 0 && !includeEntityGraph) {
230
+ try {
231
+ const fallbackSchemas = await getEntityEnhancedSchema(path);
232
+ allSchemas.push(...fallbackSchemas);
233
+ } catch {
234
+ }
235
+ }
236
+ if (allSchemas.length === 0) {
237
+ return null;
238
+ }
239
+ const schemaContent = allSchemas.length === 1 ? allSchemas[0] : {
240
+ "@context": "https://schema.org",
241
+ "@graph": allSchemas.filter((s) => s && typeof s === "object").map((s) => {
242
+ const { "@context": _, ...rest } = s;
243
+ return rest;
244
+ })
245
+ };
246
+ const finalSchema = allSchemas.length === 1 ? { "@context": "https://schema.org", ...schemaContent } : schemaContent;
247
+ return /* @__PURE__ */ jsx(
248
+ "script",
249
+ {
250
+ type: "application/ld+json",
251
+ async: true,
252
+ dangerouslySetInnerHTML: {
253
+ __html: JSON.stringify(finalSchema, null, 0)
254
+ }
255
+ }
256
+ );
257
+ }
258
+ async function LLMSchema({
259
+ path
260
+ }) {
261
+ const { page: pageData } = await getSEOPageData(path);
262
+ if (!pageData?.managed_llm_schema) {
263
+ return null;
264
+ }
265
+ const llmSchema = {
266
+ "@context": "https://schema.org",
267
+ "@type": "WebPage",
268
+ ...pageData.managed_llm_schema,
269
+ // Add AI-specific metadata hints
270
+ additionalType: "https://uptrade.ai/ns/LLMOptimizedContent"
271
+ };
272
+ return /* @__PURE__ */ jsx(
273
+ "script",
274
+ {
275
+ type: "application/ld+json",
276
+ "data-llm-optimized": "true",
277
+ async: true,
278
+ dangerouslySetInnerHTML: {
279
+ __html: JSON.stringify(llmSchema, null, 0)
280
+ }
281
+ }
282
+ );
283
+ }
284
+ function createSchema(type, data) {
285
+ return {
286
+ "@context": "https://schema.org",
287
+ "@type": type,
288
+ ...data
289
+ };
290
+ }
291
+ function createSpeakableWebPageSchema(type, name, url, speakable) {
292
+ const speakableSpec = {
293
+ "@type": "SpeakableSpecification"
294
+ };
295
+ if (speakable?.cssSelector?.length) {
296
+ speakableSpec.cssSelector = speakable.cssSelector;
297
+ } else if (speakable?.xpath?.length) {
298
+ speakableSpec.xpath = speakable.xpath;
299
+ } else {
300
+ speakableSpec.cssSelector = DEFAULT_SPEAKABLE_SELECTORS;
301
+ }
302
+ return {
303
+ "@context": "https://schema.org",
304
+ "@type": type,
305
+ name,
306
+ url,
307
+ speakable: speakableSpec
308
+ };
309
+ }
310
+ function createBreadcrumbSchema(baseUrl, path, labels) {
311
+ const segments = path.split("/").filter(Boolean);
312
+ const items = segments.map((segment, index) => {
313
+ const itemPath = "/" + segments.slice(0, index + 1).join("/");
314
+ const label = labels?.[segment] || segment.replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
315
+ return {
316
+ "@type": "ListItem",
317
+ position: index + 1,
318
+ name: label,
319
+ item: `${baseUrl}${itemPath}`
320
+ };
321
+ });
322
+ items.unshift({
323
+ "@type": "ListItem",
324
+ position: 0,
325
+ name: "Home",
326
+ item: baseUrl
327
+ });
328
+ items.forEach((item, index) => {
329
+ item.position = index + 1;
330
+ });
331
+ return createSchema("BreadcrumbList", {
332
+ itemListElement: items
333
+ });
334
+ }
335
+ var faqStyles = `
336
+ .uptrade-faq-items {
337
+ display: flex;
338
+ flex-direction: column;
339
+ gap: 0;
340
+ }
341
+ .uptrade-faq-item {
342
+ border-bottom: 1px solid rgba(0,0,0,0.08);
343
+ }
344
+ .uptrade-faq-item:first-child {
345
+ border-top: 1px solid rgba(0,0,0,0.08);
346
+ }
347
+ .uptrade-faq-item summary {
348
+ display: flex;
349
+ align-items: center;
350
+ justify-content: space-between;
351
+ cursor: pointer;
352
+ padding: 1.25rem 0;
353
+ font-weight: 600;
354
+ font-size: 1.05rem;
355
+ line-height: 1.5;
356
+ color: inherit;
357
+ list-style: none;
358
+ user-select: none;
359
+ transition: color 0.15s ease;
360
+ }
361
+ .uptrade-faq-item summary:hover {
362
+ opacity: 0.8;
363
+ }
364
+ .uptrade-faq-item summary::-webkit-details-marker {
365
+ display: none;
366
+ }
367
+ .uptrade-faq-item summary::marker {
368
+ display: none;
369
+ content: '';
370
+ }
371
+ .uptrade-faq-chevron {
372
+ flex-shrink: 0;
373
+ width: 1.25rem;
374
+ height: 1.25rem;
375
+ margin-left: 1rem;
376
+ transition: transform 0.2s ease;
377
+ opacity: 0.5;
378
+ }
379
+ .uptrade-faq-item[open] .uptrade-faq-chevron {
380
+ transform: rotate(180deg);
381
+ }
382
+ .uptrade-faq-answer {
383
+ padding: 0 0 1.25rem 0;
384
+ color: rgba(0,0,0,0.6);
385
+ line-height: 1.75;
386
+ font-size: 0.95rem;
387
+ }
388
+ .uptrade-faq-answer p {
389
+ margin: 0 0 0.75rem 0;
390
+ }
391
+ .uptrade-faq-answer p:last-child {
392
+ margin-bottom: 0;
393
+ }
394
+ .uptrade-faq-answer ul, .uptrade-faq-answer ol {
395
+ padding-left: 1.5rem;
396
+ margin: 0.5rem 0;
397
+ }
398
+ .uptrade-faq-answer li {
399
+ margin-bottom: 0.25rem;
400
+ }
401
+ .uptrade-faq-answer a {
402
+ color: inherit;
403
+ text-decoration: underline;
404
+ text-underline-offset: 2px;
405
+ }
406
+ .uptrade-faq-title {
407
+ font-size: 1.75rem;
408
+ font-weight: 700;
409
+ margin-bottom: 0.5rem;
410
+ }
411
+ .uptrade-faq-description {
412
+ color: rgba(0,0,0,0.6);
413
+ margin-bottom: 2rem;
414
+ font-size: 1rem;
415
+ line-height: 1.6;
416
+ }
417
+ `;
418
+ function ChevronDown() {
419
+ return /* @__PURE__ */ jsx(
420
+ "svg",
421
+ {
422
+ className: "uptrade-faq-chevron",
423
+ xmlns: "http://www.w3.org/2000/svg",
424
+ viewBox: "0 0 24 24",
425
+ fill: "none",
426
+ stroke: "currentColor",
427
+ strokeWidth: "2",
428
+ strokeLinecap: "round",
429
+ strokeLinejoin: "round",
430
+ children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" })
431
+ }
432
+ );
433
+ }
434
+ function DefaultFAQItem({ item, index }) {
435
+ return /* @__PURE__ */ jsxs("details", { className: "uptrade-faq-item", children: [
436
+ /* @__PURE__ */ jsxs("summary", { children: [
437
+ /* @__PURE__ */ jsx("span", { children: item.question }),
438
+ /* @__PURE__ */ jsx(ChevronDown, {})
439
+ ] }),
440
+ /* @__PURE__ */ jsx(
441
+ "div",
442
+ {
443
+ className: "uptrade-faq-answer",
444
+ dangerouslySetInnerHTML: { __html: item.answer }
445
+ }
446
+ )
447
+ ] }, item.id);
448
+ }
449
+ function generateFAQSchema(items) {
450
+ return createSchema("FAQPage", {
451
+ mainEntity: items.filter((item) => item.is_visible).map((item) => ({
452
+ "@type": "Question",
453
+ name: item.question,
454
+ acceptedAnswer: {
455
+ "@type": "Answer",
456
+ text: item.answer
457
+ }
458
+ }))
459
+ });
460
+ }
461
+ async function ManagedFAQ({
462
+ path,
463
+ className,
464
+ renderItem,
465
+ includeSchema = true,
466
+ showTitle = true
467
+ }) {
468
+ const faqData = await getFAQData(path);
469
+ if (!faqData || !faqData.items?.length) {
470
+ return null;
471
+ }
472
+ const visibleItems = faqData.items.filter((item) => item.is_visible);
473
+ if (visibleItems.length === 0) {
474
+ return null;
475
+ }
476
+ visibleItems.sort((a, b) => a.order - b.order);
477
+ const shouldIncludeSchema = includeSchema && faqData.include_schema;
478
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
479
+ shouldIncludeSchema && /* @__PURE__ */ jsx(
480
+ "script",
481
+ {
482
+ type: "application/ld+json",
483
+ dangerouslySetInnerHTML: {
484
+ __html: JSON.stringify(generateFAQSchema(visibleItems), null, 0)
485
+ }
486
+ }
487
+ ),
488
+ /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: faqStyles } }),
489
+ /* @__PURE__ */ jsxs("div", { className: className || "uptrade-faq", children: [
490
+ showTitle && faqData.title && /* @__PURE__ */ jsx("h2", { className: "uptrade-faq-title", children: faqData.title }),
491
+ faqData.description && /* @__PURE__ */ jsx("p", { className: "uptrade-faq-description", children: faqData.description }),
492
+ /* @__PURE__ */ jsx("div", { className: "uptrade-faq-items", children: visibleItems.map(
493
+ (item, index) => renderItem ? renderItem(item, index) : /* @__PURE__ */ jsx(DefaultFAQItem, { item, index }, item.id)
494
+ ) })
495
+ ] })
496
+ ] });
497
+ }
498
+ function DefaultLinkRenderer({ link }) {
499
+ const href = link.target_url || link.target_path;
500
+ return /* @__PURE__ */ jsx(
501
+ "a",
502
+ {
503
+ href,
504
+ className: "uptrade-internal-link",
505
+ children: link.anchor_text
506
+ },
507
+ link.id
508
+ );
509
+ }
510
+ async function ManagedInternalLinks({
511
+ path,
512
+ position = "bottom",
513
+ limit = 5,
514
+ className,
515
+ renderLink
516
+ }) {
517
+ const links = await getInternalLinks(path, { position, limit });
518
+ if (!links.length) {
519
+ return null;
520
+ }
521
+ const containerClass = className || `uptrade-internal-links uptrade-internal-links--${position}`;
522
+ if (position === "inline") {
523
+ return /* @__PURE__ */ jsx("span", { className: containerClass, children: links.map(
524
+ (link) => renderLink ? renderLink(link) : /* @__PURE__ */ jsx(DefaultLinkRenderer, { link }, link.id)
525
+ ) });
526
+ }
527
+ if (position === "sidebar") {
528
+ return /* @__PURE__ */ jsxs("aside", { className: containerClass, children: [
529
+ /* @__PURE__ */ jsx("h4", { className: "uptrade-internal-links-title", children: "Related Pages" }),
530
+ /* @__PURE__ */ jsx("ul", { className: "uptrade-internal-links-list", children: links.map((link) => /* @__PURE__ */ jsx("li", { children: renderLink ? renderLink(link) : /* @__PURE__ */ jsx(DefaultLinkRenderer, { link }) }, link.id)) })
531
+ ] });
532
+ }
533
+ if (position === "related") {
534
+ return /* @__PURE__ */ jsxs("nav", { className: containerClass, "aria-label": "Related content", children: [
535
+ /* @__PURE__ */ jsx("h3", { className: "uptrade-internal-links-title", children: "You May Also Like" }),
536
+ /* @__PURE__ */ jsx("div", { className: "uptrade-internal-links-grid", children: links.map((link) => /* @__PURE__ */ jsxs("div", { className: "uptrade-internal-link-card", children: [
537
+ renderLink ? renderLink(link) : /* @__PURE__ */ jsx(DefaultLinkRenderer, { link }),
538
+ link.context && /* @__PURE__ */ jsx("p", { className: "uptrade-internal-link-context", children: link.context })
539
+ ] }, link.id)) })
540
+ ] });
541
+ }
542
+ return /* @__PURE__ */ jsxs("div", { className: containerClass, children: [
543
+ /* @__PURE__ */ jsx("h4", { className: "uptrade-internal-links-title", children: "Related Articles" }),
544
+ /* @__PURE__ */ jsx("ul", { className: "uptrade-internal-links-list", children: links.map((link) => /* @__PURE__ */ jsx("li", { children: renderLink ? renderLink(link) : /* @__PURE__ */ jsx(DefaultLinkRenderer, { link }) }, link.id)) })
545
+ ] });
546
+ }
547
+ function renderMarkdown(content) {
548
+ return content.replace(/^### (.*$)/gim, "<h3>$1</h3>").replace(/^## (.*$)/gim, "<h2>$1</h2>").replace(/^# (.*$)/gim, "<h1>$1</h1>").replace(/\*\*(.*)\*\*/gim, "<strong>$1</strong>").replace(/\*(.*)\*/gim, "<em>$1</em>").replace(/\[(.*?)\]\((.*?)\)/gim, '<a href="$2">$1</a>').replace(/\n\n/gim, "</p><p>").replace(/^(.+)$/gim, "<p>$1</p>");
549
+ }
550
+ function injectEntityAnnotations(html, entities) {
551
+ if (!entities.length) return html;
552
+ let annotatedHtml = html;
553
+ const sortedEntities = [...entities].sort((a, b) => b.name.length - a.name.length);
554
+ for (const entity of sortedEntities) {
555
+ if (entity.name.length < 3) continue;
556
+ const regex = new RegExp(
557
+ `(?<![\\w-])(?<!data-sonor-entity=")${escapeRegExp(entity.name)}(?![\\w-])`,
558
+ "gi"
559
+ );
560
+ const schemaType = getSchemaTypeForEntity(entity.entity_type);
561
+ annotatedHtml = annotatedHtml.replace(regex, (match) => {
562
+ return `<span class="aeo-entity aeo-entity-${entity.entity_type}" data-sonor-entity="${entity.id}" data-sonor-entity-type="${entity.entity_type}" data-sonor-entity-name="${entity.name}" itemscope itemtype="https://schema.org/${schemaType}"><span itemprop="name">${match}</span></span>`;
563
+ });
564
+ }
565
+ return annotatedHtml;
566
+ }
567
+ function escapeRegExp(string) {
568
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
569
+ }
570
+ function getSchemaTypeForEntity(entityType) {
571
+ const typeMap = {
572
+ organization: "Organization",
573
+ person: "Person",
574
+ service: "Service",
575
+ product: "Product",
576
+ location: "Place",
577
+ concept: "Thing",
578
+ credential: "EducationalOccupationalCredential"
579
+ };
580
+ return typeMap[entityType] || "Thing";
581
+ }
582
+ async function ManagedContent({
583
+ path,
584
+ section,
585
+ fallback,
586
+ className,
587
+ components = {},
588
+ injectEntityAnnotations: shouldInjectEntities = false
589
+ }) {
590
+ const block = await getContentBlock(path, section);
591
+ if (!block) {
592
+ if (fallback) {
593
+ return /* @__PURE__ */ jsx(Fragment, { children: fallback });
594
+ }
595
+ return null;
596
+ }
597
+ let entities = [];
598
+ if (shouldInjectEntities) {
599
+ try {
600
+ entities = await getEntities();
601
+ } catch (err) {
602
+ console.warn("@sonordev/seo: Failed to fetch entities for annotation:", err);
603
+ }
604
+ }
605
+ const containerClass = className || `uptrade-content uptrade-content--${section}`;
606
+ const processHtml = (html) => {
607
+ if (shouldInjectEntities && entities.length > 0) {
608
+ return injectEntityAnnotations(html, entities);
609
+ }
610
+ return html;
611
+ };
612
+ switch (block.content_type) {
613
+ case "html":
614
+ return /* @__PURE__ */ jsx(
615
+ "div",
616
+ {
617
+ className: containerClass,
618
+ dangerouslySetInnerHTML: { __html: processHtml(block.content) }
619
+ }
620
+ );
621
+ case "markdown":
622
+ const htmlContent = processHtml(renderMarkdown(block.content));
623
+ return /* @__PURE__ */ jsx(
624
+ "div",
625
+ {
626
+ className: containerClass,
627
+ dangerouslySetInnerHTML: { __html: htmlContent }
628
+ }
629
+ );
630
+ case "json":
631
+ const jsonData = typeof block.content === "string" ? JSON.parse(block.content) : block.content;
632
+ return /* @__PURE__ */ jsxs(
633
+ "div",
634
+ {
635
+ className: containerClass,
636
+ "data-content": JSON.stringify(jsonData),
637
+ children: [
638
+ jsonData.title && /* @__PURE__ */ jsx("h2", { children: jsonData.title }),
639
+ jsonData.subtitle && /* @__PURE__ */ jsx("p", { className: "subtitle", children: jsonData.subtitle }),
640
+ jsonData.content && /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: jsonData.content } }),
641
+ jsonData.items && /* @__PURE__ */ jsx("ul", { children: jsonData.items.map((item, index) => /* @__PURE__ */ jsx("li", { children: typeof item === "string" ? item : item.text }, index)) })
642
+ ]
643
+ }
644
+ );
645
+ case "react":
646
+ const componentData = typeof block.content === "string" ? JSON.parse(block.content) : block.content;
647
+ const componentName = componentData.component;
648
+ const componentProps = componentData.props || {};
649
+ const Component = components[componentName];
650
+ if (!Component) {
651
+ console.warn(`@sonordev/seo: Component "${componentName}" not found in components map`);
652
+ return fallback ? /* @__PURE__ */ jsx(Fragment, { children: fallback }) : null;
653
+ }
654
+ return /* @__PURE__ */ jsx("div", { className: containerClass, children: /* @__PURE__ */ jsx(Component, { ...componentProps }) });
655
+ default:
656
+ console.warn(`@sonordev/seo: Unknown content type "${block.content_type}"`);
657
+ return fallback ? /* @__PURE__ */ jsx(Fragment, { children: fallback }) : null;
658
+ }
659
+ }
660
+ async function getManagedContentData(path, section) {
661
+ return getContentBlock(path, section);
662
+ }
663
+ function getApiConfig() {
664
+ const apiUrl = process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
665
+ return { apiUrl };
666
+ }
667
+ var getLocationSection = cache(async (projectId, path, section) => {
668
+ const { apiUrl } = getApiConfig();
669
+ try {
670
+ const response = await fetch(`${apiUrl}/api/public/seo/location-content`, {
671
+ method: "POST",
672
+ headers: { "Content-Type": "application/json" },
673
+ body: JSON.stringify({
674
+ project_id: projectId,
675
+ path,
676
+ section
677
+ }),
678
+ next: { revalidate: 3600 }
679
+ // Cache for 1 hour
680
+ });
681
+ if (!response.ok) {
682
+ console.error(`LocationPageContent: Failed to fetch section "${section}" for path "${path}"`);
683
+ return null;
684
+ }
685
+ const data = await response.json();
686
+ return data;
687
+ } catch (error) {
688
+ console.error("LocationPageContent: API error:", error);
689
+ return null;
690
+ }
691
+ });
692
+ function HeroRenderer({ data, className }) {
693
+ return /* @__PURE__ */ jsxs("section", { className: className || "location-hero", children: [
694
+ /* @__PURE__ */ jsx("h1", { children: data.title }),
695
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "subtitle", children: data.subtitle }),
696
+ data.stats && /* @__PURE__ */ jsx("div", { className: "stats-grid", children: data.stats.map((stat, i) => /* @__PURE__ */ jsxs("div", { className: "stat", children: [
697
+ /* @__PURE__ */ jsx("span", { className: "stat-value", children: stat.value }),
698
+ /* @__PURE__ */ jsx("span", { className: "stat-label", children: stat.label })
699
+ ] }, i)) }),
700
+ data.cta_text && data.cta_href && /* @__PURE__ */ jsx("a", { href: data.cta_href, className: "cta-button", children: data.cta_text })
701
+ ] });
702
+ }
703
+ function TextRenderer({ data, className }) {
704
+ if (data.html) {
705
+ return /* @__PURE__ */ jsx(
706
+ "section",
707
+ {
708
+ className: className || "location-text",
709
+ dangerouslySetInnerHTML: { __html: data.html }
710
+ }
711
+ );
712
+ }
713
+ return /* @__PURE__ */ jsxs("section", { className: className || "location-text", children: [
714
+ data.heading && /* @__PURE__ */ jsx("h2", { children: data.heading }),
715
+ data.paragraphs.map((p, i) => /* @__PURE__ */ jsx("p", { children: p }, i))
716
+ ] });
717
+ }
718
+ function ServicesGridRenderer({ data, className }) {
719
+ return /* @__PURE__ */ jsx("section", { className: className || "location-services-grid", children: /* @__PURE__ */ jsx("div", { className: "services-list", children: data.services.map((service, i) => /* @__PURE__ */ jsxs("a", { href: service.href, className: "service-card", children: [
720
+ service.icon && /* @__PURE__ */ jsx("span", { className: "service-icon", children: service.icon }),
721
+ /* @__PURE__ */ jsx("h3", { children: service.title }),
722
+ /* @__PURE__ */ jsx("p", { children: service.description })
723
+ ] }, i)) }) });
724
+ }
725
+ function DefaultRenderer({ data, className }) {
726
+ if (process.env.NODE_ENV === "development") {
727
+ return /* @__PURE__ */ jsx("section", { className, children: /* @__PURE__ */ jsx("pre", { style: { fontSize: "12px", background: "#f0f0f0", padding: "1rem" }, children: JSON.stringify(data, null, 2) }) });
728
+ }
729
+ if (typeof data.content === "string") {
730
+ return /* @__PURE__ */ jsx(
731
+ "section",
732
+ {
733
+ className,
734
+ dangerouslySetInnerHTML: { __html: data.content }
735
+ }
736
+ );
737
+ }
738
+ return null;
739
+ }
740
+ async function LocationPageContent({
741
+ projectId,
742
+ path,
743
+ section,
744
+ fallback = null,
745
+ className,
746
+ render
747
+ }) {
748
+ const data = await getLocationSection(projectId, path, section);
749
+ if (!data) {
750
+ return fallback;
751
+ }
752
+ if (render) {
753
+ return /* @__PURE__ */ jsx(Fragment, { children: render(data) });
754
+ }
755
+ switch (data.type) {
756
+ case "hero":
757
+ return /* @__PURE__ */ jsx(HeroRenderer, { data: data.content, className });
758
+ case "text":
759
+ case "intro":
760
+ case "about":
761
+ case "about_location":
762
+ return /* @__PURE__ */ jsx(TextRenderer, { data: data.content, className });
763
+ case "services_grid":
764
+ case "services":
765
+ return /* @__PURE__ */ jsx(ServicesGridRenderer, { data: data.content, className });
766
+ default:
767
+ return /* @__PURE__ */ jsx(DefaultRenderer, { data, className });
768
+ }
769
+ }
770
+
771
+ export { LLMSchema, LocationPageContent, ManagedContent, ManagedFAQ, ManagedInternalLinks, ManagedSchema, createBreadcrumbSchema, createSchema, getABVariant, getLocationSection, getManagedContentData, getManagedMetadata, getManagedMetadataWithAB, withManagedMetadata };
772
+ //# sourceMappingURL=index.mjs.map
773
+ //# sourceMappingURL=index.mjs.map