@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,814 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/setup/integration-generator.ts
8
+ function generateIntegrationCode(context) {
9
+ const snippets = [];
10
+ const apiUrl = context.apiUrl || "https://api.uptrademedia.com";
11
+ let order = 0;
12
+ snippets.push(...generateProviderSnippets(context, apiUrl, order));
13
+ order += 10;
14
+ for (const module of context.enabledModules) {
15
+ switch (module) {
16
+ case "analytics":
17
+ snippets.push(...generateAnalyticsSnippets(context, order));
18
+ order += 10;
19
+ break;
20
+ case "engage":
21
+ snippets.push(...generateEngageSnippets(context, order));
22
+ order += 10;
23
+ break;
24
+ case "forms":
25
+ snippets.push(...generateFormsSnippets(context, order));
26
+ order += 10;
27
+ break;
28
+ case "commerce":
29
+ snippets.push(...generateCommerceSnippets(context, order));
30
+ order += 10;
31
+ break;
32
+ case "seo":
33
+ snippets.push(...generateSEOSnippets(context, order));
34
+ order += 10;
35
+ break;
36
+ case "blog":
37
+ snippets.push(...generateBlogSnippets(context, order));
38
+ order += 10;
39
+ break;
40
+ }
41
+ }
42
+ return snippets;
43
+ }
44
+ function getSnippetsByModule(snippets) {
45
+ return snippets.reduce((acc, snippet) => {
46
+ if (!acc[snippet.module]) {
47
+ acc[snippet.module] = [];
48
+ }
49
+ acc[snippet.module].push(snippet);
50
+ return acc;
51
+ }, {});
52
+ }
53
+ function generateProviderSnippets(ctx, apiUrl, startOrder) {
54
+ const enabledModulesConfig = ctx.enabledModules.map((m) => {
55
+ if (m === "analytics") return " analytics={{ enabled: true }}";
56
+ if (m === "engage") return " engage={{ enabled: true }}";
57
+ return null;
58
+ }).filter(Boolean).join("\n");
59
+ return [
60
+ {
61
+ module: "provider",
62
+ snippetType: "install",
63
+ title: "Install @sonordev/site-kit",
64
+ description: "Install the Uptrade Site Kit package",
65
+ code: `pnpm add @sonordev/site-kit`,
66
+ language: "bash",
67
+ order: startOrder,
68
+ required: true
69
+ },
70
+ {
71
+ module: "provider",
72
+ snippetType: "env",
73
+ title: "Environment Variables",
74
+ description: "Add these to your .env.local file",
75
+ filePath: ".env.local",
76
+ code: `# Uptrade Integration
77
+ NEXT_PUBLIC_UPTRADE_API_URL=${apiUrl}
78
+ NEXT_PUBLIC_UPTRADE_PROJECT_ID=${ctx.projectId}
79
+ UPTRADE_API_KEY=your-api-key-here`,
80
+ language: "env",
81
+ order: startOrder + 1,
82
+ required: true
83
+ },
84
+ {
85
+ module: "provider",
86
+ snippetType: "layout",
87
+ title: "Root Layout Provider",
88
+ description: "Wrap your app with SiteKitProvider in app/layout.tsx",
89
+ filePath: "app/layout.tsx",
90
+ code: `import { SiteKitProvider } from '@sonordev/site-kit'
91
+ import { ManagedFavicon } from '@sonordev/site-kit/images'
92
+
93
+ export default function RootLayout({
94
+ children,
95
+ }: {
96
+ children: React.ReactNode
97
+ }) {
98
+ return (
99
+ <html lang="en">
100
+ <head>
101
+ <ManagedFavicon />
102
+ </head>
103
+ <body>
104
+ <SiteKitProvider
105
+ apiUrl={process.env.NEXT_PUBLIC_UPTRADE_API_URL!}
106
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
107
+ ${enabledModulesConfig}
108
+ >
109
+ {children}
110
+ </SiteKitProvider>
111
+ </body>
112
+ </html>
113
+ )
114
+ }`,
115
+ language: "tsx",
116
+ order: startOrder + 2,
117
+ required: true
118
+ }
119
+ ];
120
+ }
121
+ function generateAnalyticsSnippets(ctx, startOrder) {
122
+ return [
123
+ {
124
+ module: "analytics",
125
+ snippetType: "component",
126
+ title: "Custom Event Tracking",
127
+ description: "Track custom events throughout your app",
128
+ filePath: "components/TrackableButton.tsx",
129
+ code: `'use client'
130
+
131
+ import { useSiteKit } from '@sonordev/site-kit'
132
+
133
+ interface TrackableButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
134
+ eventName: string
135
+ eventData?: Record<string, unknown>
136
+ children: React.ReactNode
137
+ }
138
+
139
+ export function TrackableButton({
140
+ children,
141
+ eventName,
142
+ eventData,
143
+ ...props
144
+ }: TrackableButtonProps) {
145
+ const { analytics } = useSiteKit()
146
+
147
+ const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
148
+ analytics?.trackEvent(eventName, eventData)
149
+ props.onClick?.(e)
150
+ }
151
+
152
+ return (
153
+ <button {...props} onClick={handleClick}>
154
+ {children}
155
+ </button>
156
+ )
157
+ }`,
158
+ language: "tsx",
159
+ order: startOrder,
160
+ required: false
161
+ }
162
+ ];
163
+ }
164
+ function generateEngageSnippets(ctx, startOrder) {
165
+ const primaryColor = ctx.brand?.primaryColor || "#0066cc";
166
+ return [
167
+ {
168
+ module: "engage",
169
+ snippetType: "component",
170
+ title: "Chat Widget",
171
+ description: "Add the AI chat widget to your site. This is unstyled - customize to match your brand.",
172
+ filePath: "components/ChatWidget.tsx",
173
+ code: `'use client'
174
+
175
+ import { ChatWidget } from '@sonordev/site-kit/engage'
176
+
177
+ export function SiteChat() {
178
+ return (
179
+ <ChatWidget
180
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
181
+ config={{
182
+ position: 'bottom-right',
183
+ buttonColor: '${primaryColor}',
184
+ greeting: 'Hi! How can I help you today?',
185
+ placeholder: 'Type your message...',
186
+ }}
187
+ />
188
+ )
189
+ }`,
190
+ language: "tsx",
191
+ order: startOrder,
192
+ required: true
193
+ },
194
+ {
195
+ module: "engage",
196
+ snippetType: "layout",
197
+ title: "Add Chat to Layout",
198
+ description: "Add the ChatWidget component to your root layout",
199
+ filePath: "app/layout.tsx",
200
+ code: `// Add import at top:
201
+ import { SiteChat } from '@/components/ChatWidget'
202
+
203
+ // Add inside your layout body, after SiteKitProvider children:
204
+ <SiteChat />`,
205
+ language: "tsx",
206
+ order: startOrder + 1,
207
+ required: true
208
+ }
209
+ ];
210
+ }
211
+ function generateFormsSnippets(ctx, startOrder) {
212
+ return [
213
+ {
214
+ module: "forms",
215
+ snippetType: "component",
216
+ title: "Managed Form Component",
217
+ description: "Embed a managed form from the Portal. Form slug must match one created in Forms module.",
218
+ filePath: "components/ContactForm.tsx",
219
+ code: `import { ManagedForm } from '@sonordev/site-kit/forms'
220
+
221
+ interface ContactFormProps {
222
+ formSlug?: string
223
+ className?: string
224
+ }
225
+
226
+ export async function ContactForm({
227
+ formSlug = 'contact',
228
+ className
229
+ }: ContactFormProps) {
230
+ return (
231
+ <ManagedForm
232
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
233
+ formSlug={formSlug}
234
+ className={className}
235
+ />
236
+ )
237
+ }`,
238
+ language: "tsx",
239
+ order: startOrder,
240
+ required: false
241
+ },
242
+ {
243
+ module: "forms",
244
+ snippetType: "api-route",
245
+ title: "Form Submission Handler",
246
+ description: "API route to proxy form submissions to Portal API",
247
+ filePath: "app/api/forms/[formId]/submit/route.ts",
248
+ code: `import { NextRequest, NextResponse } from 'next/server'
249
+
250
+ export async function POST(
251
+ request: NextRequest,
252
+ { params }: { params: { formId: string } }
253
+ ) {
254
+ const body = await request.json()
255
+
256
+ const response = await fetch(
257
+ \`\${process.env.NEXT_PUBLIC_UPTRADE_API_URL}/forms/\${params.formId}/submit\`,
258
+ {
259
+ method: 'POST',
260
+ headers: {
261
+ 'Content-Type': 'application/json',
262
+ 'X-API-Key': process.env.UPTRADE_API_KEY!,
263
+ },
264
+ body: JSON.stringify(body),
265
+ }
266
+ )
267
+
268
+ const data = await response.json()
269
+ return NextResponse.json(data, { status: response.status })
270
+ }`,
271
+ language: "typescript",
272
+ order: startOrder + 1,
273
+ required: true
274
+ }
275
+ ];
276
+ }
277
+ function generateCommerceSnippets(ctx, startOrder) {
278
+ return [
279
+ {
280
+ module: "commerce",
281
+ snippetType: "component",
282
+ title: "Product Grid",
283
+ description: "Display products from your commerce catalog",
284
+ filePath: "components/Products.tsx",
285
+ code: `import { ProductGrid } from '@sonordev/site-kit/commerce'
286
+
287
+ interface ProductsSectionProps {
288
+ category?: string
289
+ limit?: number
290
+ }
291
+
292
+ export async function ProductsSection({
293
+ category = 'featured',
294
+ limit = 8
295
+ }: ProductsSectionProps) {
296
+ return (
297
+ <section className="py-12">
298
+ <h2 className="text-2xl font-bold mb-6">Our Products</h2>
299
+ <ProductGrid
300
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
301
+ category={category}
302
+ limit={limit}
303
+ />
304
+ </section>
305
+ )
306
+ }`,
307
+ language: "tsx",
308
+ order: startOrder,
309
+ required: false
310
+ },
311
+ {
312
+ module: "commerce",
313
+ snippetType: "component",
314
+ title: "Upcoming Events",
315
+ description: "Display upcoming events and classes",
316
+ filePath: "components/Events.tsx",
317
+ code: `import { UpcomingEvents, EventCalendar } from '@sonordev/site-kit/commerce'
318
+
319
+ export async function EventsSection({ limit = 6 }: { limit?: number }) {
320
+ return (
321
+ <section className="py-12">
322
+ <h2 className="text-2xl font-bold mb-6">Upcoming Events</h2>
323
+ <UpcomingEvents
324
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
325
+ limit={limit}
326
+ />
327
+ </section>
328
+ )
329
+ }
330
+
331
+ export async function FullCalendar() {
332
+ return (
333
+ <EventCalendar
334
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
335
+ />
336
+ )
337
+ }`,
338
+ language: "tsx",
339
+ order: startOrder + 1,
340
+ required: false
341
+ }
342
+ ];
343
+ }
344
+ function generateSEOSnippets(ctx, startOrder) {
345
+ return [
346
+ {
347
+ module: "seo",
348
+ snippetType: "component",
349
+ title: "Managed FAQ Section",
350
+ description: "Render FAQs with automatic JSON-LD schema markup. FAQs are managed in Portal SEO module.",
351
+ filePath: "components/FAQSection.tsx",
352
+ code: `import { ManagedFAQ } from '@sonordev/site-kit/seo'
353
+
354
+ interface FAQSectionProps {
355
+ path: string // Page path to fetch FAQs for (e.g., '/services/plumbing')
356
+ className?: string
357
+ }
358
+
359
+ export async function FAQSection({ path, className }: FAQSectionProps) {
360
+ return (
361
+ <section className={className}>
362
+ <ManagedFAQ
363
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
364
+ path={path}
365
+ showTitle
366
+ includeSchema
367
+ />
368
+ </section>
369
+ )
370
+ }`,
371
+ language: "tsx",
372
+ order: startOrder,
373
+ required: true
374
+ },
375
+ {
376
+ module: "seo",
377
+ snippetType: "page",
378
+ title: "Page with Managed Metadata + FAQs",
379
+ description: "Example dynamic page using managed metadata and FAQ sections",
380
+ filePath: "app/services/[slug]/page.tsx",
381
+ code: `import { getManagedMetadata, ManagedFAQ } from '@sonordev/site-kit/seo'
382
+ import type { Metadata } from 'next'
383
+
384
+ interface Props {
385
+ params: { slug: string }
386
+ }
387
+
388
+ export async function generateMetadata({ params }: Props): Promise<Metadata> {
389
+ const path = \`/services/\${params.slug}\`
390
+ return getManagedMetadata({
391
+ projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,
392
+ path,
393
+ })
394
+ }
395
+
396
+ export default async function ServicePage({ params }: Props) {
397
+ const path = \`/services/\${params.slug}\`
398
+
399
+ return (
400
+ <main>
401
+ <h1 className="text-3xl font-bold">Service: {params.slug}</h1>
402
+
403
+ {/* Your page content here */}
404
+
405
+ {/* FAQs section with JSON-LD schema */}
406
+ <section className="mt-12">
407
+ <ManagedFAQ
408
+ projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}
409
+ path={path}
410
+ showTitle
411
+ includeSchema
412
+ />
413
+ </section>
414
+ </main>
415
+ )
416
+ }`,
417
+ language: "tsx",
418
+ order: startOrder + 1,
419
+ required: false
420
+ }
421
+ ];
422
+ }
423
+ function generateBlogSnippets(ctx, startOrder) {
424
+ return [
425
+ {
426
+ module: "blog",
427
+ snippetType: "page",
428
+ title: "Blog List Page",
429
+ description: "Display all blog posts from Portal",
430
+ filePath: "app/blog/page.tsx",
431
+ code: `import { getBlogPosts } from '@sonordev/site-kit/blog'
432
+ import Link from 'next/link'
433
+
434
+ export default async function BlogPage() {
435
+ const posts = await getBlogPosts({
436
+ projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,
437
+ limit: 10,
438
+ })
439
+
440
+ return (
441
+ <main className="py-12">
442
+ <h1 className="text-3xl font-bold mb-8">Blog</h1>
443
+ <div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
444
+ {posts.map((post) => (
445
+ <article key={post.id} className="border rounded-lg p-4">
446
+ {post.featured_image && (
447
+ <img
448
+ src={post.featured_image}
449
+ alt={post.title}
450
+ className="w-full h-48 object-cover rounded mb-4"
451
+ />
452
+ )}
453
+ <h2 className="text-xl font-semibold mb-2">
454
+ <Link href={\`/blog/\${post.slug}\`}>{post.title}</Link>
455
+ </h2>
456
+ <p className="text-gray-600">{post.excerpt}</p>
457
+ </article>
458
+ ))}
459
+ </div>
460
+ </main>
461
+ )
462
+ }`,
463
+ language: "tsx",
464
+ order: startOrder,
465
+ required: false
466
+ },
467
+ {
468
+ module: "blog",
469
+ snippetType: "page",
470
+ title: "Blog Post Page",
471
+ description: "Individual blog post page with SEO metadata",
472
+ filePath: "app/blog/[slug]/page.tsx",
473
+ code: `import { getBlogPost, getBlogPosts } from '@sonordev/site-kit/blog'
474
+ import type { Metadata } from 'next'
475
+ import { notFound } from 'next/navigation'
476
+
477
+ interface Props {
478
+ params: { slug: string }
479
+ }
480
+
481
+ export async function generateStaticParams() {
482
+ const posts = await getBlogPosts({
483
+ projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,
484
+ })
485
+ return posts.map((post) => ({ slug: post.slug }))
486
+ }
487
+
488
+ export async function generateMetadata({ params }: Props): Promise<Metadata> {
489
+ const post = await getBlogPost({
490
+ projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,
491
+ slug: params.slug,
492
+ })
493
+
494
+ if (!post) return {}
495
+
496
+ return {
497
+ title: post.title,
498
+ description: post.excerpt,
499
+ openGraph: {
500
+ title: post.title,
501
+ description: post.excerpt,
502
+ images: post.featured_image ? [post.featured_image] : [],
503
+ },
504
+ }
505
+ }
506
+
507
+ export default async function BlogPostPage({ params }: Props) {
508
+ const post = await getBlogPost({
509
+ projectId: process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!,
510
+ slug: params.slug,
511
+ })
512
+
513
+ if (!post) notFound()
514
+
515
+ return (
516
+ <article className="py-12 max-w-3xl mx-auto">
517
+ <h1 className="text-4xl font-bold mb-4">{post.title}</h1>
518
+ {post.featured_image && (
519
+ <img
520
+ src={post.featured_image}
521
+ alt={post.title}
522
+ className="w-full rounded-lg mb-8"
523
+ />
524
+ )}
525
+ <div
526
+ className="prose prose-lg"
527
+ dangerouslySetInnerHTML={{ __html: post.content }}
528
+ />
529
+ </article>
530
+ )
531
+ }`,
532
+ language: "tsx",
533
+ order: startOrder + 1,
534
+ required: false
535
+ }
536
+ ];
537
+ }
538
+ function CopyIcon({ className }) {
539
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { className, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
540
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
541
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
542
+ ] });
543
+ }
544
+ function CheckIcon({ className }) {
545
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { className, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) });
546
+ }
547
+ function ChevronDownIcon({ className }) {
548
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { className, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" }) });
549
+ }
550
+ function ChevronRightIcon({ className }) {
551
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { className, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "9 18 15 12 9 6" }) });
552
+ }
553
+ var moduleLabels = {
554
+ provider: "Setup",
555
+ analytics: "Analytics",
556
+ engage: "Engage (Chat)",
557
+ forms: "Forms",
558
+ commerce: "Commerce",
559
+ seo: "SEO",
560
+ blog: "Blog"
561
+ };
562
+ var moduleColors = {
563
+ provider: "#6366f1",
564
+ // indigo
565
+ analytics: "#8b5cf6",
566
+ // violet
567
+ engage: "#ec4899",
568
+ // pink
569
+ forms: "#14b8a6",
570
+ // teal
571
+ commerce: "#f59e0b",
572
+ // amber
573
+ seo: "#10b981",
574
+ // emerald
575
+ blog: "#3b82f6"
576
+ // blue
577
+ };
578
+ function IntegrationCodeView({
579
+ projectId,
580
+ enabledModules,
581
+ apiUrl,
582
+ brand,
583
+ className,
584
+ onCopy
585
+ }) {
586
+ const [expandedModules, setExpandedModules] = react.useState(/* @__PURE__ */ new Set(["provider"]));
587
+ const [copiedId, setCopiedId] = react.useState(null);
588
+ const snippets = react.useMemo(() => {
589
+ return generateIntegrationCode({
590
+ projectId,
591
+ enabledModules,
592
+ apiUrl,
593
+ brand
594
+ });
595
+ }, [projectId, enabledModules, apiUrl, brand]);
596
+ const snippetsByModule = react.useMemo(() => {
597
+ return getSnippetsByModule(snippets);
598
+ }, [snippets]);
599
+ const toggleModule = (module) => {
600
+ setExpandedModules((prev) => {
601
+ const next = new Set(prev);
602
+ if (next.has(module)) {
603
+ next.delete(module);
604
+ } else {
605
+ next.add(module);
606
+ }
607
+ return next;
608
+ });
609
+ };
610
+ const copyCode = async (code, id, title) => {
611
+ try {
612
+ await navigator.clipboard.writeText(code);
613
+ setCopiedId(id);
614
+ onCopy?.(code, title);
615
+ setTimeout(() => setCopiedId(null), 2e3);
616
+ } catch (err) {
617
+ console.error("Failed to copy:", err);
618
+ }
619
+ };
620
+ const copyAll = async () => {
621
+ const allCode = snippets.map((s) => `// ${s.title}
622
+ ${s.filePath ? `// File: ${s.filePath}
623
+ ` : ""}${s.code}`).join("\n\n// ---\n\n");
624
+ try {
625
+ await navigator.clipboard.writeText(allCode);
626
+ onCopy?.(allCode, "All snippets");
627
+ } catch (err) {
628
+ console.error("Failed to copy:", err);
629
+ }
630
+ };
631
+ if (enabledModules.length === 0) {
632
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style: { textAlign: "center", padding: "2rem", color: "#666" }, children: [
633
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: "No modules enabled for this project." }),
634
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.875rem", marginTop: "0.5rem" }, children: "Enable modules in Project Settings to generate integration code." })
635
+ ] });
636
+ }
637
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: [
638
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
639
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
640
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { margin: 0, fontWeight: 600 }, children: "Integration Code" }),
641
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { margin: "0.25rem 0 0", fontSize: "0.875rem", color: "#666" }, children: [
642
+ snippets.length,
643
+ " snippets for ",
644
+ enabledModules.length,
645
+ " modules"
646
+ ] })
647
+ ] }),
648
+ /* @__PURE__ */ jsxRuntime.jsxs(
649
+ "button",
650
+ {
651
+ onClick: copyAll,
652
+ style: {
653
+ display: "flex",
654
+ alignItems: "center",
655
+ gap: "0.5rem",
656
+ padding: "0.5rem 1rem",
657
+ border: "1px solid #e5e7eb",
658
+ borderRadius: "0.375rem",
659
+ background: "white",
660
+ cursor: "pointer",
661
+ fontSize: "0.875rem"
662
+ },
663
+ children: [
664
+ /* @__PURE__ */ jsxRuntime.jsx(CopyIcon, {}),
665
+ "Copy All"
666
+ ]
667
+ }
668
+ )
669
+ ] }),
670
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "0.75rem" }, children: Object.entries(snippetsByModule).map(([module, moduleSnippets]) => {
671
+ const isExpanded = expandedModules.has(module);
672
+ const color = moduleColors[module] || "#6366f1";
673
+ return /* @__PURE__ */ jsxRuntime.jsxs(
674
+ "div",
675
+ {
676
+ style: {
677
+ border: "1px solid #e5e7eb",
678
+ borderRadius: "0.5rem",
679
+ overflow: "hidden"
680
+ },
681
+ children: [
682
+ /* @__PURE__ */ jsxRuntime.jsxs(
683
+ "button",
684
+ {
685
+ onClick: () => toggleModule(module),
686
+ style: {
687
+ width: "100%",
688
+ display: "flex",
689
+ alignItems: "center",
690
+ justifyContent: "space-between",
691
+ padding: "0.75rem 1rem",
692
+ background: "#f9fafb",
693
+ border: "none",
694
+ cursor: "pointer",
695
+ textAlign: "left"
696
+ },
697
+ children: [
698
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem" }, children: [
699
+ /* @__PURE__ */ jsxRuntime.jsx(
700
+ "div",
701
+ {
702
+ style: {
703
+ width: "0.5rem",
704
+ height: "0.5rem",
705
+ borderRadius: "50%",
706
+ background: color
707
+ }
708
+ }
709
+ ),
710
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 500 }, children: moduleLabels[module] || module }),
711
+ /* @__PURE__ */ jsxRuntime.jsx(
712
+ "span",
713
+ {
714
+ style: {
715
+ fontSize: "0.75rem",
716
+ padding: "0.125rem 0.5rem",
717
+ background: "#e5e7eb",
718
+ borderRadius: "9999px"
719
+ },
720
+ children: moduleSnippets.length
721
+ }
722
+ )
723
+ ] }),
724
+ isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(ChevronDownIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, {})
725
+ ]
726
+ }
727
+ ),
728
+ isExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { children: moduleSnippets.map((snippet, idx) => {
729
+ const snippetId = `${module}-${idx}`;
730
+ const isCopied = copiedId === snippetId;
731
+ return /* @__PURE__ */ jsxRuntime.jsxs(
732
+ "div",
733
+ {
734
+ style: {
735
+ padding: "1rem",
736
+ borderTop: "1px solid #e5e7eb"
737
+ },
738
+ children: [
739
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", marginBottom: "0.75rem" }, children: [
740
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
741
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
742
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 500, fontSize: "0.875rem" }, children: snippet.title }),
743
+ snippet.required && /* @__PURE__ */ jsxRuntime.jsx(
744
+ "span",
745
+ {
746
+ style: {
747
+ fontSize: "0.625rem",
748
+ padding: "0.125rem 0.375rem",
749
+ border: "1px solid #e5e7eb",
750
+ borderRadius: "0.25rem",
751
+ textTransform: "uppercase"
752
+ },
753
+ children: "Required"
754
+ }
755
+ )
756
+ ] }),
757
+ snippet.description && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: "0.25rem 0 0", fontSize: "0.75rem", color: "#666" }, children: snippet.description }),
758
+ snippet.filePath && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: "0.25rem 0 0", fontSize: "0.75rem", color, fontFamily: "monospace" }, children: snippet.filePath })
759
+ ] }),
760
+ /* @__PURE__ */ jsxRuntime.jsx(
761
+ "button",
762
+ {
763
+ onClick: () => copyCode(snippet.code, snippetId, snippet.title),
764
+ style: {
765
+ display: "flex",
766
+ alignItems: "center",
767
+ justifyContent: "center",
768
+ width: "2rem",
769
+ height: "2rem",
770
+ border: "none",
771
+ background: "transparent",
772
+ cursor: "pointer",
773
+ borderRadius: "0.25rem"
774
+ },
775
+ title: "Copy code",
776
+ children: isCopied ? /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: "text-green-500" }) : /* @__PURE__ */ jsxRuntime.jsx(CopyIcon, {})
777
+ }
778
+ )
779
+ ] }),
780
+ /* @__PURE__ */ jsxRuntime.jsx(
781
+ "pre",
782
+ {
783
+ style: {
784
+ margin: 0,
785
+ padding: "0.75rem",
786
+ background: "#1f2937",
787
+ color: "#e5e7eb",
788
+ borderRadius: "0.375rem",
789
+ overflow: "auto",
790
+ fontSize: "0.75rem",
791
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
792
+ lineHeight: 1.5
793
+ },
794
+ children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: snippet.code })
795
+ }
796
+ )
797
+ ]
798
+ },
799
+ idx
800
+ );
801
+ }) })
802
+ ]
803
+ },
804
+ module
805
+ );
806
+ }) })
807
+ ] });
808
+ }
809
+
810
+ exports.IntegrationCodeView = IntegrationCodeView;
811
+ exports.generateIntegrationCode = generateIntegrationCode;
812
+ exports.getSnippetsByModule = getSnippetsByModule;
813
+ //# sourceMappingURL=chunk-XQQWI6WB.js.map
814
+ //# sourceMappingURL=chunk-XQQWI6WB.js.map