@sonordev/site-kit 5.1.0 → 5.3.1

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 (267) hide show
  1. package/README.md +15 -0
  2. package/agent-manifest.json +23 -2
  3. package/dist/AnalyticsProvider-NA7EMJCA.mjs +10 -0
  4. package/dist/{AnalyticsProvider-2LCSA6G3.mjs.map → AnalyticsProvider-NA7EMJCA.mjs.map} +1 -1
  5. package/dist/AnalyticsProvider-XE3ADUUH.js +31 -0
  6. package/dist/{AnalyticsProvider-V2U3TQMH.js.map → AnalyticsProvider-XE3ADUUH.js.map} +1 -1
  7. package/dist/{BlogViewTracker-COTPD7WL.js → BlogViewTracker-DVJHZ7CM.js} +6 -6
  8. package/dist/{BlogViewTracker-COTPD7WL.js.map → BlogViewTracker-DVJHZ7CM.js.map} +1 -1
  9. package/dist/{BlogViewTracker-HG25ONRP.mjs → BlogViewTracker-MKJYTTJQ.mjs} +5 -5
  10. package/dist/{BlogViewTracker-HG25ONRP.mjs.map → BlogViewTracker-MKJYTTJQ.mjs.map} +1 -1
  11. package/dist/ChatWidget-BD4F4XLD.mjs +11 -0
  12. package/dist/{ChatWidget-RWO7R7EJ.mjs.map → ChatWidget-BD4F4XLD.mjs.map} +1 -1
  13. package/dist/ChatWidget-BZ3KOSXG.js +20 -0
  14. package/dist/{ChatWidget-4QUJYFXU.js.map → ChatWidget-BZ3KOSXG.js.map} +1 -1
  15. package/dist/EngageWidget-JPP6EDCJ.js +18 -0
  16. package/dist/{EngageWidget-RSOXB3YM.js.map → EngageWidget-JPP6EDCJ.js.map} +1 -1
  17. package/dist/EngageWidget-L7B6PCM3.mjs +9 -0
  18. package/dist/{EngageWidget-LF4AC4QN.mjs.map → EngageWidget-L7B6PCM3.mjs.map} +1 -1
  19. package/dist/{FileField-YJ7DZXC3.mjs → FileField-7WPRONDS.mjs} +5 -5
  20. package/dist/{FileField-YJ7DZXC3.mjs.map → FileField-7WPRONDS.mjs.map} +1 -1
  21. package/dist/{FileField-S2GUM3QB.js → FileField-GHT7444Y.js} +6 -6
  22. package/dist/{FileField-S2GUM3QB.js.map → FileField-GHT7444Y.js.map} +1 -1
  23. package/dist/{FormSpotlight-7WAXLXZA.js → FormSpotlight-BB2IB7IX.js} +18 -18
  24. package/dist/{FormSpotlight-7WAXLXZA.js.map → FormSpotlight-BB2IB7IX.js.map} +1 -1
  25. package/dist/{FormSpotlight-HLH5LQKI.mjs → FormSpotlight-WZVS6HHR.mjs} +4 -4
  26. package/dist/{FormSpotlight-HLH5LQKI.mjs.map → FormSpotlight-WZVS6HHR.mjs.map} +1 -1
  27. package/dist/{FormStage-LEZYERJB.js → FormStage-FLBLXENZ.js} +15 -15
  28. package/dist/{FormStage-LEZYERJB.js.map → FormStage-FLBLXENZ.js.map} +1 -1
  29. package/dist/{FormStage-Q5JW75AF.mjs → FormStage-Y3NHHMV2.mjs} +4 -4
  30. package/dist/{FormStage-Q5JW75AF.mjs.map → FormStage-Y3NHHMV2.mjs.map} +1 -1
  31. package/dist/ManagedForm-2OPCHDNJ.js +23 -0
  32. package/dist/{ManagedForm-H4SEFSAF.js.map → ManagedForm-2OPCHDNJ.js.map} +1 -1
  33. package/dist/ManagedForm-AJM6D4SK.mjs +14 -0
  34. package/dist/{ManagedForm-U3NFIVEC.mjs.map → ManagedForm-AJM6D4SK.mjs.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-KT2NGUNW.js → ManagedNewsletterForm-L2ZHJ7F4.js} +8 -8
  36. package/dist/{ManagedNewsletterForm-KT2NGUNW.js.map → ManagedNewsletterForm-L2ZHJ7F4.js.map} +1 -1
  37. package/dist/{ManagedNewsletterForm-YKYW7B6P.mjs → ManagedNewsletterForm-MJI2JXIB.mjs} +7 -7
  38. package/dist/{ManagedNewsletterForm-YKYW7B6P.mjs.map → ManagedNewsletterForm-MJI2JXIB.mjs.map} +1 -1
  39. package/dist/{SignalCore-2BH5PUGS.mjs → SignalCore-23YDDSWO.mjs} +5 -5
  40. package/dist/{SignalCore-2BH5PUGS.mjs.map → SignalCore-23YDDSWO.mjs.map} +1 -1
  41. package/dist/{SignalCore-JM4ODFL2.js → SignalCore-G2VM7NUP.js} +11 -11
  42. package/dist/{SignalCore-JM4ODFL2.js.map → SignalCore-G2VM7NUP.js.map} +1 -1
  43. package/dist/SitemapSync-T2N3TCWF.js +17 -0
  44. package/dist/{SitemapSync-J4UMJRTO.js.map → SitemapSync-T2N3TCWF.js.map} +1 -1
  45. package/dist/SitemapSync-YLWMU6J3.mjs +8 -0
  46. package/dist/{SitemapSync-5CXS2JGB.mjs.map → SitemapSync-YLWMU6J3.mjs.map} +1 -1
  47. package/dist/analytics/index.js +9 -9
  48. package/dist/analytics/index.mjs +4 -4
  49. package/dist/blog/index.js +20 -20
  50. package/dist/blog/index.mjs +3 -3
  51. package/dist/blog/server-ui.js +14 -14
  52. package/dist/blog/server-ui.mjs +2 -2
  53. package/dist/{chunk-44ZTBQH4.js → chunk-2MPOO6QJ.js} +3 -3
  54. package/dist/{chunk-44ZTBQH4.js.map → chunk-2MPOO6QJ.js.map} +1 -1
  55. package/dist/{chunk-E3GHVAMK.js → chunk-2VQ5YXOD.js} +23 -23
  56. package/dist/{chunk-E3GHVAMK.js.map → chunk-2VQ5YXOD.js.map} +1 -1
  57. package/dist/{chunk-CGQO7MFO.js → chunk-47566YF4.js} +14 -14
  58. package/dist/{chunk-CGQO7MFO.js.map → chunk-47566YF4.js.map} +1 -1
  59. package/dist/{chunk-ADOGOLYO.mjs → chunk-4HL6CAZ7.mjs} +4 -4
  60. package/dist/{chunk-ADOGOLYO.mjs.map → chunk-4HL6CAZ7.mjs.map} +1 -1
  61. package/dist/{chunk-DTNNZJYM.mjs → chunk-4IMZ45YA.mjs} +5 -5
  62. package/dist/{chunk-DTNNZJYM.mjs.map → chunk-4IMZ45YA.mjs.map} +1 -1
  63. package/dist/{chunk-ACLBRIYD.js → chunk-4S7BHFGT.js} +3 -3
  64. package/dist/{chunk-ACLBRIYD.js.map → chunk-4S7BHFGT.js.map} +1 -1
  65. package/dist/{chunk-FMOOQKZU.js → chunk-5HMN3FXL.js} +10 -10
  66. package/dist/{chunk-FMOOQKZU.js.map → chunk-5HMN3FXL.js.map} +1 -1
  67. package/dist/{chunk-TAM2D54C.js → chunk-5TGSM5EQ.js} +14 -14
  68. package/dist/{chunk-TAM2D54C.js.map → chunk-5TGSM5EQ.js.map} +1 -1
  69. package/dist/{chunk-BVLGJ2CZ.mjs → chunk-77HT6TYK.mjs} +3 -3
  70. package/dist/{chunk-BVLGJ2CZ.mjs.map → chunk-77HT6TYK.mjs.map} +1 -1
  71. package/dist/{chunk-2XHEUWHV.mjs → chunk-7UPPYERC.mjs} +4 -4
  72. package/dist/{chunk-2XHEUWHV.mjs.map → chunk-7UPPYERC.mjs.map} +1 -1
  73. package/dist/chunk-AEW7EFYU.js +147 -0
  74. package/dist/chunk-AEW7EFYU.js.map +1 -0
  75. package/dist/{chunk-OAJVITNO.mjs → chunk-AJBJH3BA.mjs} +3 -3
  76. package/dist/{chunk-OAJVITNO.mjs.map → chunk-AJBJH3BA.mjs.map} +1 -1
  77. package/dist/{chunk-SXNKLHOX.mjs → chunk-AKQA5ZYZ.mjs} +3 -3
  78. package/dist/{chunk-SXNKLHOX.mjs.map → chunk-AKQA5ZYZ.mjs.map} +1 -1
  79. package/dist/{chunk-WZMM57R2.js → chunk-APL44ZVK.js} +5 -5
  80. package/dist/{chunk-WZMM57R2.js.map → chunk-APL44ZVK.js.map} +1 -1
  81. package/dist/{chunk-JEI3CSY4.js → chunk-AVPMSJCQ.js} +4 -4
  82. package/dist/{chunk-JEI3CSY4.js.map → chunk-AVPMSJCQ.js.map} +1 -1
  83. package/dist/{chunk-TECD4AP7.mjs → chunk-COAVBUMS.mjs} +3 -3
  84. package/dist/{chunk-TECD4AP7.mjs.map → chunk-COAVBUMS.mjs.map} +1 -1
  85. package/dist/{chunk-BUDV7QHH.mjs → chunk-DBJRJ2Q2.mjs} +4 -4
  86. package/dist/{chunk-BUDV7QHH.mjs.map → chunk-DBJRJ2Q2.mjs.map} +1 -1
  87. package/dist/{chunk-OTHKWMDB.mjs → chunk-DN6A6KXH.mjs} +3 -3
  88. package/dist/{chunk-OTHKWMDB.mjs.map → chunk-DN6A6KXH.mjs.map} +1 -1
  89. package/dist/{chunk-GYAH4KFC.js → chunk-DTX4R45S.js} +40 -4
  90. package/dist/chunk-DTX4R45S.js.map +1 -0
  91. package/dist/{chunk-UMWVTIIZ.mjs → chunk-FH4LLJFL.mjs} +8 -8
  92. package/dist/{chunk-UMWVTIIZ.mjs.map → chunk-FH4LLJFL.mjs.map} +1 -1
  93. package/dist/{chunk-ZFZMN4LT.mjs → chunk-GM5E6R5W.mjs} +39 -3
  94. package/dist/chunk-GM5E6R5W.mjs.map +1 -0
  95. package/dist/{chunk-GZVSGQKT.js → chunk-GPH3VVLP.js} +3 -3
  96. package/dist/{chunk-GZVSGQKT.js.map → chunk-GPH3VVLP.js.map} +1 -1
  97. package/dist/{chunk-CBMHJPR7.js → chunk-GQTSQR63.js} +5 -5
  98. package/dist/{chunk-CBMHJPR7.js.map → chunk-GQTSQR63.js.map} +1 -1
  99. package/dist/{chunk-BGBJSMXT.js → chunk-GTK3CGWF.js} +6 -6
  100. package/dist/{chunk-BGBJSMXT.js.map → chunk-GTK3CGWF.js.map} +1 -1
  101. package/dist/{chunk-LB7LHVWI.mjs → chunk-H7274TKR.mjs} +9 -3
  102. package/dist/chunk-H7274TKR.mjs.map +1 -0
  103. package/dist/{chunk-MCXHQHIX.js → chunk-HIV5YK5G.js} +4 -4
  104. package/dist/{chunk-MCXHQHIX.js.map → chunk-HIV5YK5G.js.map} +1 -1
  105. package/dist/chunk-HRQ4367C.mjs +6 -0
  106. package/dist/{chunk-4SQ6PROR.mjs.map → chunk-HRQ4367C.mjs.map} +1 -1
  107. package/dist/{chunk-A3VGZAZQ.mjs → chunk-I72AUITZ.mjs} +3 -3
  108. package/dist/{chunk-A3VGZAZQ.mjs.map → chunk-I72AUITZ.mjs.map} +1 -1
  109. package/dist/{chunk-2ACKOMAL.js → chunk-IPV2TUAT.js} +9 -3
  110. package/dist/chunk-IPV2TUAT.js.map +1 -0
  111. package/dist/{chunk-CYQB5GLU.mjs → chunk-ISKJLXB4.mjs} +4 -4
  112. package/dist/{chunk-CYQB5GLU.mjs.map → chunk-ISKJLXB4.mjs.map} +1 -1
  113. package/dist/{chunk-HPIY7AR3.js → chunk-KP56C66Z.js} +14 -14
  114. package/dist/{chunk-HPIY7AR3.js.map → chunk-KP56C66Z.js.map} +1 -1
  115. package/dist/{chunk-PXAALKTP.js → chunk-KP5BFPGT.js} +5 -3
  116. package/dist/chunk-KP5BFPGT.js.map +1 -0
  117. package/dist/{chunk-VCNPTLK2.js → chunk-LFJRMY4V.js} +12 -12
  118. package/dist/{chunk-VCNPTLK2.js.map → chunk-LFJRMY4V.js.map} +1 -1
  119. package/dist/{chunk-2EJX56YJ.js → chunk-LHD45PGP.js} +8 -8
  120. package/dist/{chunk-2EJX56YJ.js.map → chunk-LHD45PGP.js.map} +1 -1
  121. package/dist/chunk-MLXUMVBK.mjs +142 -0
  122. package/dist/chunk-MLXUMVBK.mjs.map +1 -0
  123. package/dist/{chunk-ROJ25QM3.mjs → chunk-NW5CBNRU.mjs} +3 -3
  124. package/dist/{chunk-ROJ25QM3.mjs.map → chunk-NW5CBNRU.mjs.map} +1 -1
  125. package/dist/{chunk-5G2ZRQMO.mjs → chunk-PA5ZVCW2.mjs} +3 -3
  126. package/dist/{chunk-5G2ZRQMO.mjs.map → chunk-PA5ZVCW2.mjs.map} +1 -1
  127. package/dist/{chunk-IQLYFQKZ.js → chunk-QG7WHAGD.js} +15 -15
  128. package/dist/{chunk-IQLYFQKZ.js.map → chunk-QG7WHAGD.js.map} +1 -1
  129. package/dist/{chunk-FZISCIJV.mjs → chunk-R4PFWVGZ.mjs} +4 -4
  130. package/dist/{chunk-FZISCIJV.mjs.map → chunk-R4PFWVGZ.mjs.map} +1 -1
  131. package/dist/{chunk-5YKMHPJL.mjs → chunk-R5F2JQVX.mjs} +5 -3
  132. package/dist/chunk-R5F2JQVX.mjs.map +1 -0
  133. package/dist/{chunk-CKPFETIO.js → chunk-SHZXSIRH.js} +4 -4
  134. package/dist/{chunk-CKPFETIO.js.map → chunk-SHZXSIRH.js.map} +1 -1
  135. package/dist/{chunk-NSTY7ZZA.mjs → chunk-SI7R3IJX.mjs} +8 -8
  136. package/dist/{chunk-NSTY7ZZA.mjs.map → chunk-SI7R3IJX.mjs.map} +1 -1
  137. package/dist/{chunk-ACWGG4VW.js → chunk-TAIGHH5J.js} +9 -9
  138. package/dist/{chunk-ACWGG4VW.js.map → chunk-TAIGHH5J.js.map} +1 -1
  139. package/dist/chunk-TMQKZ4DO.js +8 -0
  140. package/dist/{chunk-YPEX4RDE.js.map → chunk-TMQKZ4DO.js.map} +1 -1
  141. package/dist/{chunk-VIIGOCX4.js → chunk-UJOEN4X6.js} +15 -15
  142. package/dist/{chunk-VIIGOCX4.js.map → chunk-UJOEN4X6.js.map} +1 -1
  143. package/dist/{chunk-EZLK2OQL.js → chunk-UYR22S67.js} +7 -7
  144. package/dist/{chunk-EZLK2OQL.js.map → chunk-UYR22S67.js.map} +1 -1
  145. package/dist/{chunk-5W56B52Z.mjs → chunk-VGX6G3TA.mjs} +3 -3
  146. package/dist/{chunk-5W56B52Z.mjs.map → chunk-VGX6G3TA.mjs.map} +1 -1
  147. package/dist/{chunk-WMNRTCYY.js → chunk-VLR2UYO4.js} +11 -11
  148. package/dist/{chunk-WMNRTCYY.js.map → chunk-VLR2UYO4.js.map} +1 -1
  149. package/dist/{chunk-VWVUYL5J.mjs → chunk-W47J6ZZG.mjs} +4 -4
  150. package/dist/{chunk-VWVUYL5J.mjs.map → chunk-W47J6ZZG.mjs.map} +1 -1
  151. package/dist/{chunk-NIJVVW4G.mjs → chunk-WD57YWY5.mjs} +3 -3
  152. package/dist/{chunk-NIJVVW4G.mjs.map → chunk-WD57YWY5.mjs.map} +1 -1
  153. package/dist/{chunk-ADBLBGCQ.mjs → chunk-WZZYTFDV.mjs} +3 -3
  154. package/dist/{chunk-ADBLBGCQ.mjs.map → chunk-WZZYTFDV.mjs.map} +1 -1
  155. package/dist/{chunk-EKTMXHBI.mjs → chunk-X4PL7R63.mjs} +3 -3
  156. package/dist/{chunk-EKTMXHBI.mjs.map → chunk-X4PL7R63.mjs.map} +1 -1
  157. package/dist/{chunk-6YKNDQYJ.mjs → chunk-XR47TOGW.mjs} +3 -3
  158. package/dist/{chunk-6YKNDQYJ.mjs.map → chunk-XR47TOGW.mjs.map} +1 -1
  159. package/dist/{chunk-DKRXPXOR.js → chunk-ZMFJXFUY.js} +3 -3
  160. package/dist/{chunk-DKRXPXOR.js.map → chunk-ZMFJXFUY.js.map} +1 -1
  161. package/dist/cli/index.js +3 -3
  162. package/dist/cli/index.mjs +1 -1
  163. package/dist/client/index.js +4 -4
  164. package/dist/client/index.mjs +3 -3
  165. package/dist/commerce/index.js +56 -56
  166. package/dist/commerce/index.mjs +5 -5
  167. package/dist/config/index.js +2 -2
  168. package/dist/config/index.mjs +1 -1
  169. package/dist/engage/index.js +13 -13
  170. package/dist/engage/index.mjs +7 -7
  171. package/dist/fleet/index.js +8 -8
  172. package/dist/fleet/index.mjs +4 -4
  173. package/dist/forms/FormField.d.ts +2 -1
  174. package/dist/forms/FormField.d.ts.map +1 -1
  175. package/dist/forms/ga4-identity.d.ts +31 -0
  176. package/dist/forms/ga4-identity.d.ts.map +1 -0
  177. package/dist/forms/ga4-identity.test.d.ts +2 -0
  178. package/dist/forms/ga4-identity.test.d.ts.map +1 -0
  179. package/dist/forms/index.js +24 -24
  180. package/dist/forms/index.mjs +10 -10
  181. package/dist/forms/server.js +11 -11
  182. package/dist/forms/server.mjs +9 -9
  183. package/dist/forms/static.js +8 -8
  184. package/dist/forms/static.mjs +7 -7
  185. package/dist/forms/styles.css +21 -0
  186. package/dist/forms/submitForm.d.ts.map +1 -1
  187. package/dist/forms/types.d.ts +13 -0
  188. package/dist/forms/types.d.ts.map +1 -1
  189. package/dist/images/index.js +11 -11
  190. package/dist/images/index.mjs +4 -4
  191. package/dist/index.js +63 -63
  192. package/dist/index.mjs +9 -9
  193. package/dist/layout/client.js +8 -8
  194. package/dist/layout/client.mjs +7 -7
  195. package/dist/layout/index.js +10 -10
  196. package/dist/layout/index.mjs +8 -8
  197. package/dist/maps/index.js +5 -5
  198. package/dist/maps/index.mjs +3 -3
  199. package/dist/motion/Parallax.d.ts +42 -0
  200. package/dist/motion/Parallax.d.ts.map +1 -0
  201. package/dist/motion/Reveal.d.ts +59 -0
  202. package/dist/motion/Reveal.d.ts.map +1 -0
  203. package/dist/motion/ScrollScene.d.ts +42 -0
  204. package/dist/motion/ScrollScene.d.ts.map +1 -0
  205. package/dist/motion/engine.d.ts +74 -0
  206. package/dist/motion/engine.d.ts.map +1 -0
  207. package/dist/motion/failsafe.d.ts +20 -0
  208. package/dist/motion/failsafe.d.ts.map +1 -0
  209. package/dist/motion/gsap.d.ts +84 -0
  210. package/dist/motion/gsap.d.ts.map +1 -0
  211. package/dist/motion/gsap.js +103 -0
  212. package/dist/motion/gsap.js.map +1 -0
  213. package/dist/motion/gsap.mjs +99 -0
  214. package/dist/motion/gsap.mjs.map +1 -0
  215. package/dist/motion/index.d.ts +31 -0
  216. package/dist/motion/index.d.ts.map +1 -0
  217. package/dist/motion/index.js +252 -0
  218. package/dist/motion/index.js.map +1 -0
  219. package/dist/motion/index.mjs +230 -0
  220. package/dist/motion/index.mjs.map +1 -0
  221. package/dist/motion/motion.test.d.ts +16 -0
  222. package/dist/motion/motion.test.d.ts.map +1 -0
  223. package/dist/motion/three.d.ts +105 -0
  224. package/dist/motion/three.d.ts.map +1 -0
  225. package/dist/motion/three.js +150 -0
  226. package/dist/motion/three.js.map +1 -0
  227. package/dist/motion/three.mjs +145 -0
  228. package/dist/motion/three.mjs.map +1 -0
  229. package/dist/proxy/index.js +3 -3
  230. package/dist/proxy/index.mjs +2 -2
  231. package/dist/proxy/securityHeaders.d.ts +21 -6
  232. package/dist/proxy/securityHeaders.d.ts.map +1 -1
  233. package/dist/search/index.js +4 -4
  234. package/dist/search/index.mjs +3 -3
  235. package/dist/seo/client.js +5 -5
  236. package/dist/seo/client.mjs +4 -4
  237. package/dist/seo/index.js +5 -5
  238. package/dist/seo/index.mjs +4 -4
  239. package/dist/server/index.js +3 -3
  240. package/dist/server/index.mjs +2 -2
  241. package/dist/shared/build-entries.d.ts +7 -1
  242. package/dist/shared/build-entries.d.ts.map +1 -1
  243. package/dist/shared/version.d.ts +1 -1
  244. package/dist/signal/index.js +11 -11
  245. package/dist/signal/index.mjs +2 -2
  246. package/dist/sync/index.js +16 -16
  247. package/dist/sync/index.mjs +4 -4
  248. package/package.json +28 -2
  249. package/skills/site-kit/SKILL.md +6 -0
  250. package/dist/AnalyticsProvider-2LCSA6G3.mjs +0 -10
  251. package/dist/AnalyticsProvider-V2U3TQMH.js +0 -31
  252. package/dist/ChatWidget-4QUJYFXU.js +0 -20
  253. package/dist/ChatWidget-RWO7R7EJ.mjs +0 -11
  254. package/dist/EngageWidget-LF4AC4QN.mjs +0 -9
  255. package/dist/EngageWidget-RSOXB3YM.js +0 -18
  256. package/dist/ManagedForm-H4SEFSAF.js +0 -23
  257. package/dist/ManagedForm-U3NFIVEC.mjs +0 -14
  258. package/dist/SitemapSync-5CXS2JGB.mjs +0 -8
  259. package/dist/SitemapSync-J4UMJRTO.js +0 -17
  260. package/dist/chunk-2ACKOMAL.js.map +0 -1
  261. package/dist/chunk-4SQ6PROR.mjs +0 -6
  262. package/dist/chunk-5YKMHPJL.mjs.map +0 -1
  263. package/dist/chunk-GYAH4KFC.js.map +0 -1
  264. package/dist/chunk-LB7LHVWI.mjs.map +0 -1
  265. package/dist/chunk-PXAALKTP.js.map +0 -1
  266. package/dist/chunk-YPEX4RDE.js +0 -8
  267. package/dist/chunk-ZFZMN4LT.mjs.map +0 -1
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @sonordev/site-kit/motion/three — the Upforge motion standard, tier 2.
3
+ *
4
+ * WebGL stages driven by the scroll engine. Requires the optional peer
5
+ * `three` (~180KB gzipped — flagship builds only):
6
+ *
7
+ * npm i three && npm i -D @types/three
8
+ *
9
+ * A site that never imports this subpath never installs three. NOTHING
10
+ * outside this file may import from 'three' (src/motion/motion.test.tsx
11
+ * enforces it).
12
+ *
13
+ * How it must be used, so the page still ranks and still paints fast:
14
+ *
15
+ * - The scene component that calls `useThreeStage` is loaded with
16
+ * `dynamic(() => import('./Scene'), { ssr: false })` and mounted as a
17
+ * CHILDLESS sibling next to the server-rendered stage — never wrapping
18
+ * it. The copy stays in the HTML; three arrives as its own chunk, on
19
+ * approach.
20
+ * - The canvas is created here at runtime and slotted behind the stage's
21
+ * content. Give that content `position: relative` (and a z-index if
22
+ * needed) so it paints above the canvas.
23
+ * - Every word of copy lives in the DOM, never in the canvas.
24
+ * - `canRunWebGL()` is false under reduced motion, Save-Data, or without
25
+ * WebGL; the hook then mounts nothing and the visitor keeps the
26
+ * server-rendered still. Mobile gets composed stills by design.
27
+ * - Byte budget: ≤5MB of models/textures per scene, fetched on approach.
28
+ *
29
+ * upforgelabs.com is the reference build (components/cinema/SiteScene.tsx).
30
+ */
31
+ import { type RefObject } from 'react';
32
+ import { PerspectiveCamera, Scene, WebGLRenderer, type Object3D, type Texture } from 'three';
33
+ import { type SceneInfo, type SceneOptions } from './engine';
34
+ /**
35
+ * Whether a WebGL scene should run for this visitor at all. False under
36
+ * prefers-reduced-motion, Save-Data, or when the browser has no WebGL.
37
+ * Always false on the server.
38
+ */
39
+ export declare function canRunWebGL(): boolean;
40
+ export interface ThreeStage {
41
+ renderer: WebGLRenderer;
42
+ scene: Scene;
43
+ camera: PerspectiveCamera;
44
+ canvas: HTMLCanvasElement;
45
+ /** CSS pixel size of the stage. */
46
+ width: number;
47
+ height: number;
48
+ dpr: number;
49
+ }
50
+ export interface UseThreeStageOptions extends Pick<SceneOptions, 'continuous' | 'reducedP' | 'lerp'> {
51
+ /** Draw the frame for progress p. Called only while the scene is near the viewport. */
52
+ render: (p: number, stage: ThreeStage, info: SceneInfo) => void;
53
+ /** Build the scene. May return a cleanup for anything it allocated outside the scene graph. */
54
+ onReady?: (stage: ThreeStage) => void | (() => void);
55
+ /** Called after every resize, with the camera already updated. */
56
+ onResize?: (stage: ThreeStage) => void;
57
+ /**
58
+ * Element the canvas fills and is sized to. Default: the pin's
59
+ * `[data-sk-stage]` child (what <ScrollScene> renders), else the pin.
60
+ */
61
+ mount?: RefObject<HTMLElement | null>;
62
+ /** Cap on devicePixelRatio. Default 1.75. */
63
+ maxDpr?: number;
64
+ alpha?: boolean;
65
+ antialias?: boolean;
66
+ fov?: number;
67
+ near?: number;
68
+ far?: number;
69
+ /** DOM event dispatched on the pin once the stage is ready. Default "sk:scene-ready"; false to skip. */
70
+ readyEvent?: string | false;
71
+ /** Override the canRunWebGL() gate. */
72
+ enabled?: boolean;
73
+ }
74
+ /**
75
+ * Mount a three.js renderer on a pinned scene and drive it from scroll.
76
+ * Owns the canvas, sizing, DPR, context loss, and disposal.
77
+ *
78
+ * @example
79
+ * // Scene.tsx — loaded with dynamic(..., { ssr: false }) as a childless sibling
80
+ * 'use client'
81
+ * export default function Scene({ pin }: { pin: RefObject<HTMLElement | null> }) {
82
+ * useThreeStage(pin, {
83
+ * onReady: ({ scene, camera }) => { camera.position.z = 5; scene.add(mesh) },
84
+ * render: (p, { renderer, scene, camera }) => {
85
+ * camera.position.z = 5 - p * 4
86
+ * renderer.render(scene, camera)
87
+ * },
88
+ * })
89
+ * return null
90
+ * }
91
+ */
92
+ export declare function useThreeStage(pin: RefObject<HTMLElement | null>, options: UseThreeStageOptions): void;
93
+ /**
94
+ * Load a texture and never throw: resolves null on any failure (a
95
+ * cross-origin image without CORS headers, a 404), so one bad asset can't
96
+ * take a whole scene down. sRGB by default, which is right for photographs
97
+ * and screenshots.
98
+ */
99
+ export declare function loadTexture(url: string, options?: {
100
+ crossOrigin?: string;
101
+ colorSpace?: Texture['colorSpace'];
102
+ }): Promise<Texture | null>;
103
+ /** Dispose every geometry, material, and texture under `root`. */
104
+ export declare function disposeObject(root: Object3D): void;
105
+ //# sourceMappingURL=three.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"three.d.ts","sourceRoot":"","sources":["../../src/motion/three.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACzD,OAAO,EACL,iBAAiB,EACjB,KAAK,EAGL,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,OAAO,EACb,MAAM,OAAO,CAAA;AACd,OAAO,EAAsD,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAIhH;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAcrC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAA;IACvB,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,EAAE,iBAAiB,CAAA;IACzB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;IAClG,uFAAuF;IACvF,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;IAC/D,+FAA+F;IAC/F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;IACpD,kEAAkE;IAClE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACtC;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACrC,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wGAAwG;IACxG,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAuGrG;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAAO,GACzE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAczB;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAiBlD"}
@@ -0,0 +1,150 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var chunkAEW7EFYU_js = require('../chunk-AEW7EFYU.js');
5
+ require('../chunk-SNAQBZPT.js');
6
+ var react = require('react');
7
+ var three = require('three');
8
+
9
+ var webglProbe = null;
10
+ function canRunWebGL() {
11
+ if (typeof window === "undefined") return false;
12
+ if (chunkAEW7EFYU_js.prefersReducedMotion()) return false;
13
+ const nav = navigator;
14
+ if (nav.connection?.saveData) return false;
15
+ if (webglProbe === null) {
16
+ try {
17
+ const c = document.createElement("canvas");
18
+ webglProbe = !!(c.getContext("webgl2") || c.getContext("webgl"));
19
+ } catch {
20
+ webglProbe = false;
21
+ }
22
+ }
23
+ return webglProbe;
24
+ }
25
+ function useThreeStage(pin, options) {
26
+ const optsRef = react.useRef(options);
27
+ optsRef.current = options;
28
+ react.useEffect(() => {
29
+ const pinEl = pin.current;
30
+ if (!pinEl) return;
31
+ const o = optsRef.current;
32
+ if (o.enabled === false || o.enabled === void 0 && !canRunWebGL()) return;
33
+ const host = o.mount?.current ?? pinEl.querySelector("[data-sk-stage]") ?? pinEl;
34
+ const canvas = document.createElement("canvas");
35
+ Object.assign(canvas.style, {
36
+ position: "absolute",
37
+ inset: "0",
38
+ width: "100%",
39
+ height: "100%",
40
+ display: "block",
41
+ pointerEvents: "none"
42
+ });
43
+ canvas.setAttribute("data-sk-three", "");
44
+ canvas.setAttribute("aria-hidden", "true");
45
+ if (getComputedStyle(host).position === "static") host.style.position = "relative";
46
+ host.prepend(canvas);
47
+ let renderer;
48
+ try {
49
+ renderer = new three.WebGLRenderer({
50
+ canvas,
51
+ alpha: o.alpha ?? true,
52
+ antialias: o.antialias ?? true,
53
+ powerPreference: "high-performance"
54
+ });
55
+ } catch {
56
+ canvas.remove();
57
+ return;
58
+ }
59
+ const scene = new three.Scene();
60
+ const camera = new three.PerspectiveCamera(o.fov ?? 50, 1, o.near ?? 0.1, o.far ?? 1e3);
61
+ const stage = { renderer, scene, camera, canvas, width: 1, height: 1, dpr: 1 };
62
+ const size = () => {
63
+ const w = host.clientWidth || 1;
64
+ const h = host.clientHeight || 1;
65
+ stage.width = w;
66
+ stage.height = h;
67
+ stage.dpr = Math.min(window.devicePixelRatio || 1, optsRef.current.maxDpr ?? 1.75);
68
+ renderer.setPixelRatio(stage.dpr);
69
+ renderer.setSize(w, h, false);
70
+ camera.aspect = w / h;
71
+ camera.updateProjectionMatrix();
72
+ optsRef.current.onResize?.(stage);
73
+ };
74
+ size();
75
+ let lost = false;
76
+ const onLost = (e) => {
77
+ e.preventDefault();
78
+ lost = true;
79
+ };
80
+ const onRestored = () => {
81
+ lost = false;
82
+ chunkAEW7EFYU_js.refreshScenes();
83
+ };
84
+ canvas.addEventListener("webglcontextlost", onLost);
85
+ canvas.addEventListener("webglcontextrestored", onRestored);
86
+ const ro = new ResizeObserver(() => {
87
+ size();
88
+ chunkAEW7EFYU_js.refreshScenes();
89
+ });
90
+ ro.observe(host);
91
+ const cleanupReady = optsRef.current.onReady?.(stage);
92
+ const unregister = chunkAEW7EFYU_js.registerScene(
93
+ pinEl,
94
+ (p, info) => {
95
+ if (lost) return;
96
+ optsRef.current.render(p, stage, info);
97
+ },
98
+ { continuous: o.continuous, reducedP: o.reducedP, lerp: o.lerp, mode: "pin" }
99
+ );
100
+ const evt = o.readyEvent === false ? null : o.readyEvent ?? "sk:scene-ready";
101
+ if (evt) pinEl.dispatchEvent(new CustomEvent(evt, { bubbles: true }));
102
+ return () => {
103
+ unregister();
104
+ ro.disconnect();
105
+ canvas.removeEventListener("webglcontextlost", onLost);
106
+ canvas.removeEventListener("webglcontextrestored", onRestored);
107
+ if (typeof cleanupReady === "function") cleanupReady();
108
+ disposeObject(scene);
109
+ renderer.dispose();
110
+ canvas.remove();
111
+ };
112
+ }, [pin]);
113
+ }
114
+ function loadTexture(url, options = {}) {
115
+ return new Promise((resolve) => {
116
+ const loader = new three.TextureLoader();
117
+ loader.setCrossOrigin(options.crossOrigin ?? "anonymous");
118
+ loader.load(
119
+ url,
120
+ (t) => {
121
+ t.colorSpace = options.colorSpace ?? three.SRGBColorSpace;
122
+ resolve(t);
123
+ },
124
+ void 0,
125
+ () => resolve(null)
126
+ );
127
+ });
128
+ }
129
+ function disposeObject(root) {
130
+ root.traverse((obj) => {
131
+ const mesh = obj;
132
+ mesh.geometry?.dispose();
133
+ const mats = Array.isArray(mesh.material) ? mesh.material : mesh.material ? [mesh.material] : [];
134
+ for (const m of mats) {
135
+ for (const v of Object.values(m)) {
136
+ if (v && typeof v === "object" && v.isTexture) {
137
+ v.dispose();
138
+ }
139
+ }
140
+ m.dispose();
141
+ }
142
+ });
143
+ }
144
+
145
+ exports.canRunWebGL = canRunWebGL;
146
+ exports.disposeObject = disposeObject;
147
+ exports.loadTexture = loadTexture;
148
+ exports.useThreeStage = useThreeStage;
149
+ //# sourceMappingURL=three.js.map
150
+ //# sourceMappingURL=three.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/motion/three.ts"],"names":["prefersReducedMotion","useRef","useEffect","WebGLRenderer","Scene","PerspectiveCamera","refreshScenes","registerScene","TextureLoader","SRGBColorSpace"],"mappings":"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","file":"three.js","sourcesContent":["/**\n * @sonordev/site-kit/motion/three — the Upforge motion standard, tier 2.\n *\n * WebGL stages driven by the scroll engine. Requires the optional peer\n * `three` (~180KB gzipped — flagship builds only):\n *\n * npm i three && npm i -D @types/three\n *\n * A site that never imports this subpath never installs three. NOTHING\n * outside this file may import from 'three' (src/motion/motion.test.tsx\n * enforces it).\n *\n * How it must be used, so the page still ranks and still paints fast:\n *\n * - The scene component that calls `useThreeStage` is loaded with\n * `dynamic(() => import('./Scene'), { ssr: false })` and mounted as a\n * CHILDLESS sibling next to the server-rendered stage — never wrapping\n * it. The copy stays in the HTML; three arrives as its own chunk, on\n * approach.\n * - The canvas is created here at runtime and slotted behind the stage's\n * content. Give that content `position: relative` (and a z-index if\n * needed) so it paints above the canvas.\n * - Every word of copy lives in the DOM, never in the canvas.\n * - `canRunWebGL()` is false under reduced motion, Save-Data, or without\n * WebGL; the hook then mounts nothing and the visitor keeps the\n * server-rendered still. Mobile gets composed stills by design.\n * - Byte budget: ≤5MB of models/textures per scene, fetched on approach.\n *\n * upforgelabs.com is the reference build (components/cinema/SiteScene.tsx).\n */\n\n'use client'\n\nimport { useEffect, useRef, type RefObject } from 'react'\nimport {\n PerspectiveCamera,\n Scene,\n SRGBColorSpace,\n TextureLoader,\n WebGLRenderer,\n type Object3D,\n type Texture,\n} from 'three'\nimport { prefersReducedMotion, refreshScenes, registerScene, type SceneInfo, type SceneOptions } from './engine'\n\nlet webglProbe: boolean | null = null\n\n/**\n * Whether a WebGL scene should run for this visitor at all. False under\n * prefers-reduced-motion, Save-Data, or when the browser has no WebGL.\n * Always false on the server.\n */\nexport function canRunWebGL(): boolean {\n if (typeof window === 'undefined') return false\n if (prefersReducedMotion()) return false\n const nav = navigator as Navigator & { connection?: { saveData?: boolean } }\n if (nav.connection?.saveData) return false\n if (webglProbe === null) {\n try {\n const c = document.createElement('canvas')\n webglProbe = !!(c.getContext('webgl2') || c.getContext('webgl'))\n } catch {\n webglProbe = false\n }\n }\n return webglProbe\n}\n\nexport interface ThreeStage {\n renderer: WebGLRenderer\n scene: Scene\n camera: PerspectiveCamera\n canvas: HTMLCanvasElement\n /** CSS pixel size of the stage. */\n width: number\n height: number\n dpr: number\n}\n\nexport interface UseThreeStageOptions extends Pick<SceneOptions, 'continuous' | 'reducedP' | 'lerp'> {\n /** Draw the frame for progress p. Called only while the scene is near the viewport. */\n render: (p: number, stage: ThreeStage, info: SceneInfo) => void\n /** Build the scene. May return a cleanup for anything it allocated outside the scene graph. */\n onReady?: (stage: ThreeStage) => void | (() => void)\n /** Called after every resize, with the camera already updated. */\n onResize?: (stage: ThreeStage) => void\n /**\n * Element the canvas fills and is sized to. Default: the pin's\n * `[data-sk-stage]` child (what <ScrollScene> renders), else the pin.\n */\n mount?: RefObject<HTMLElement | null>\n /** Cap on devicePixelRatio. Default 1.75. */\n maxDpr?: number\n alpha?: boolean\n antialias?: boolean\n fov?: number\n near?: number\n far?: number\n /** DOM event dispatched on the pin once the stage is ready. Default \"sk:scene-ready\"; false to skip. */\n readyEvent?: string | false\n /** Override the canRunWebGL() gate. */\n enabled?: boolean\n}\n\n/**\n * Mount a three.js renderer on a pinned scene and drive it from scroll.\n * Owns the canvas, sizing, DPR, context loss, and disposal.\n *\n * @example\n * // Scene.tsx — loaded with dynamic(..., { ssr: false }) as a childless sibling\n * 'use client'\n * export default function Scene({ pin }: { pin: RefObject<HTMLElement | null> }) {\n * useThreeStage(pin, {\n * onReady: ({ scene, camera }) => { camera.position.z = 5; scene.add(mesh) },\n * render: (p, { renderer, scene, camera }) => {\n * camera.position.z = 5 - p * 4\n * renderer.render(scene, camera)\n * },\n * })\n * return null\n * }\n */\nexport function useThreeStage(pin: RefObject<HTMLElement | null>, options: UseThreeStageOptions): void {\n const optsRef = useRef(options)\n optsRef.current = options\n\n useEffect(() => {\n const pinEl = pin.current\n if (!pinEl) return\n const o = optsRef.current\n if (o.enabled === false || (o.enabled === undefined && !canRunWebGL())) return\n\n const host =\n o.mount?.current ??\n (pinEl.querySelector('[data-sk-stage]') as HTMLElement | null) ??\n pinEl\n\n const canvas = document.createElement('canvas')\n Object.assign(canvas.style, {\n position: 'absolute',\n inset: '0',\n width: '100%',\n height: '100%',\n display: 'block',\n pointerEvents: 'none',\n } satisfies Partial<CSSStyleDeclaration>)\n canvas.setAttribute('data-sk-three', '')\n canvas.setAttribute('aria-hidden', 'true')\n if (getComputedStyle(host).position === 'static') host.style.position = 'relative'\n host.prepend(canvas)\n\n let renderer: WebGLRenderer\n try {\n renderer = new WebGLRenderer({\n canvas,\n alpha: o.alpha ?? true,\n antialias: o.antialias ?? true,\n powerPreference: 'high-performance',\n })\n } catch {\n canvas.remove()\n return\n }\n\n const scene = new Scene()\n const camera = new PerspectiveCamera(o.fov ?? 50, 1, o.near ?? 0.1, o.far ?? 1000)\n const stage: ThreeStage = { renderer, scene, camera, canvas, width: 1, height: 1, dpr: 1 }\n\n const size = () => {\n const w = host.clientWidth || 1\n const h = host.clientHeight || 1\n stage.width = w\n stage.height = h\n stage.dpr = Math.min(window.devicePixelRatio || 1, optsRef.current.maxDpr ?? 1.75)\n renderer.setPixelRatio(stage.dpr)\n renderer.setSize(w, h, false)\n camera.aspect = w / h\n camera.updateProjectionMatrix()\n optsRef.current.onResize?.(stage)\n }\n size()\n\n let lost = false\n const onLost = (e: Event) => {\n e.preventDefault()\n lost = true\n }\n const onRestored = () => {\n lost = false\n refreshScenes()\n }\n canvas.addEventListener('webglcontextlost', onLost)\n canvas.addEventListener('webglcontextrestored', onRestored)\n\n const ro = new ResizeObserver(() => {\n size()\n refreshScenes()\n })\n ro.observe(host)\n\n const cleanupReady = optsRef.current.onReady?.(stage)\n\n const unregister = registerScene(\n pinEl,\n (p, info) => {\n if (lost) return\n optsRef.current.render(p, stage, info)\n },\n { continuous: o.continuous, reducedP: o.reducedP, lerp: o.lerp, mode: 'pin' },\n )\n\n const evt = o.readyEvent === false ? null : (o.readyEvent ?? 'sk:scene-ready')\n if (evt) pinEl.dispatchEvent(new CustomEvent(evt, { bubbles: true }))\n\n return () => {\n unregister()\n ro.disconnect()\n canvas.removeEventListener('webglcontextlost', onLost)\n canvas.removeEventListener('webglcontextrestored', onRestored)\n if (typeof cleanupReady === 'function') cleanupReady()\n disposeObject(scene)\n renderer.dispose()\n canvas.remove()\n }\n }, [pin])\n}\n\n/**\n * Load a texture and never throw: resolves null on any failure (a\n * cross-origin image without CORS headers, a 404), so one bad asset can't\n * take a whole scene down. sRGB by default, which is right for photographs\n * and screenshots.\n */\nexport function loadTexture(\n url: string,\n options: { crossOrigin?: string; colorSpace?: Texture['colorSpace'] } = {},\n): Promise<Texture | null> {\n return new Promise((resolve) => {\n const loader = new TextureLoader()\n loader.setCrossOrigin(options.crossOrigin ?? 'anonymous')\n loader.load(\n url,\n (t) => {\n t.colorSpace = options.colorSpace ?? SRGBColorSpace\n resolve(t)\n },\n undefined,\n () => resolve(null),\n )\n })\n}\n\n/** Dispose every geometry, material, and texture under `root`. */\nexport function disposeObject(root: Object3D): void {\n root.traverse((obj) => {\n const mesh = obj as Object3D & {\n geometry?: { dispose(): void }\n material?: unknown\n }\n mesh.geometry?.dispose()\n const mats = Array.isArray(mesh.material) ? mesh.material : mesh.material ? [mesh.material] : []\n for (const m of mats as Array<Record<string, unknown> & { dispose(): void }>) {\n for (const v of Object.values(m)) {\n if (v && typeof v === 'object' && (v as { isTexture?: boolean }).isTexture) {\n ;(v as Texture).dispose()\n }\n }\n m.dispose()\n }\n })\n}\n"]}
@@ -0,0 +1,145 @@
1
+ 'use client';
2
+ import { prefersReducedMotion, refreshScenes, registerScene } from '../chunk-MLXUMVBK.mjs';
3
+ import '../chunk-BEXTDHO4.mjs';
4
+ import { useRef, useEffect } from 'react';
5
+ import { WebGLRenderer, Scene, PerspectiveCamera, TextureLoader, SRGBColorSpace } from 'three';
6
+
7
+ var webglProbe = null;
8
+ function canRunWebGL() {
9
+ if (typeof window === "undefined") return false;
10
+ if (prefersReducedMotion()) return false;
11
+ const nav = navigator;
12
+ if (nav.connection?.saveData) return false;
13
+ if (webglProbe === null) {
14
+ try {
15
+ const c = document.createElement("canvas");
16
+ webglProbe = !!(c.getContext("webgl2") || c.getContext("webgl"));
17
+ } catch {
18
+ webglProbe = false;
19
+ }
20
+ }
21
+ return webglProbe;
22
+ }
23
+ function useThreeStage(pin, options) {
24
+ const optsRef = useRef(options);
25
+ optsRef.current = options;
26
+ useEffect(() => {
27
+ const pinEl = pin.current;
28
+ if (!pinEl) return;
29
+ const o = optsRef.current;
30
+ if (o.enabled === false || o.enabled === void 0 && !canRunWebGL()) return;
31
+ const host = o.mount?.current ?? pinEl.querySelector("[data-sk-stage]") ?? pinEl;
32
+ const canvas = document.createElement("canvas");
33
+ Object.assign(canvas.style, {
34
+ position: "absolute",
35
+ inset: "0",
36
+ width: "100%",
37
+ height: "100%",
38
+ display: "block",
39
+ pointerEvents: "none"
40
+ });
41
+ canvas.setAttribute("data-sk-three", "");
42
+ canvas.setAttribute("aria-hidden", "true");
43
+ if (getComputedStyle(host).position === "static") host.style.position = "relative";
44
+ host.prepend(canvas);
45
+ let renderer;
46
+ try {
47
+ renderer = new WebGLRenderer({
48
+ canvas,
49
+ alpha: o.alpha ?? true,
50
+ antialias: o.antialias ?? true,
51
+ powerPreference: "high-performance"
52
+ });
53
+ } catch {
54
+ canvas.remove();
55
+ return;
56
+ }
57
+ const scene = new Scene();
58
+ const camera = new PerspectiveCamera(o.fov ?? 50, 1, o.near ?? 0.1, o.far ?? 1e3);
59
+ const stage = { renderer, scene, camera, canvas, width: 1, height: 1, dpr: 1 };
60
+ const size = () => {
61
+ const w = host.clientWidth || 1;
62
+ const h = host.clientHeight || 1;
63
+ stage.width = w;
64
+ stage.height = h;
65
+ stage.dpr = Math.min(window.devicePixelRatio || 1, optsRef.current.maxDpr ?? 1.75);
66
+ renderer.setPixelRatio(stage.dpr);
67
+ renderer.setSize(w, h, false);
68
+ camera.aspect = w / h;
69
+ camera.updateProjectionMatrix();
70
+ optsRef.current.onResize?.(stage);
71
+ };
72
+ size();
73
+ let lost = false;
74
+ const onLost = (e) => {
75
+ e.preventDefault();
76
+ lost = true;
77
+ };
78
+ const onRestored = () => {
79
+ lost = false;
80
+ refreshScenes();
81
+ };
82
+ canvas.addEventListener("webglcontextlost", onLost);
83
+ canvas.addEventListener("webglcontextrestored", onRestored);
84
+ const ro = new ResizeObserver(() => {
85
+ size();
86
+ refreshScenes();
87
+ });
88
+ ro.observe(host);
89
+ const cleanupReady = optsRef.current.onReady?.(stage);
90
+ const unregister = registerScene(
91
+ pinEl,
92
+ (p, info) => {
93
+ if (lost) return;
94
+ optsRef.current.render(p, stage, info);
95
+ },
96
+ { continuous: o.continuous, reducedP: o.reducedP, lerp: o.lerp, mode: "pin" }
97
+ );
98
+ const evt = o.readyEvent === false ? null : o.readyEvent ?? "sk:scene-ready";
99
+ if (evt) pinEl.dispatchEvent(new CustomEvent(evt, { bubbles: true }));
100
+ return () => {
101
+ unregister();
102
+ ro.disconnect();
103
+ canvas.removeEventListener("webglcontextlost", onLost);
104
+ canvas.removeEventListener("webglcontextrestored", onRestored);
105
+ if (typeof cleanupReady === "function") cleanupReady();
106
+ disposeObject(scene);
107
+ renderer.dispose();
108
+ canvas.remove();
109
+ };
110
+ }, [pin]);
111
+ }
112
+ function loadTexture(url, options = {}) {
113
+ return new Promise((resolve) => {
114
+ const loader = new TextureLoader();
115
+ loader.setCrossOrigin(options.crossOrigin ?? "anonymous");
116
+ loader.load(
117
+ url,
118
+ (t) => {
119
+ t.colorSpace = options.colorSpace ?? SRGBColorSpace;
120
+ resolve(t);
121
+ },
122
+ void 0,
123
+ () => resolve(null)
124
+ );
125
+ });
126
+ }
127
+ function disposeObject(root) {
128
+ root.traverse((obj) => {
129
+ const mesh = obj;
130
+ mesh.geometry?.dispose();
131
+ const mats = Array.isArray(mesh.material) ? mesh.material : mesh.material ? [mesh.material] : [];
132
+ for (const m of mats) {
133
+ for (const v of Object.values(m)) {
134
+ if (v && typeof v === "object" && v.isTexture) {
135
+ v.dispose();
136
+ }
137
+ }
138
+ m.dispose();
139
+ }
140
+ });
141
+ }
142
+
143
+ export { canRunWebGL, disposeObject, loadTexture, useThreeStage };
144
+ //# sourceMappingURL=three.mjs.map
145
+ //# sourceMappingURL=three.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/motion/three.ts"],"names":[],"mappings":"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","file":"three.mjs","sourcesContent":["/**\n * @sonordev/site-kit/motion/three — the Upforge motion standard, tier 2.\n *\n * WebGL stages driven by the scroll engine. Requires the optional peer\n * `three` (~180KB gzipped — flagship builds only):\n *\n * npm i three && npm i -D @types/three\n *\n * A site that never imports this subpath never installs three. NOTHING\n * outside this file may import from 'three' (src/motion/motion.test.tsx\n * enforces it).\n *\n * How it must be used, so the page still ranks and still paints fast:\n *\n * - The scene component that calls `useThreeStage` is loaded with\n * `dynamic(() => import('./Scene'), { ssr: false })` and mounted as a\n * CHILDLESS sibling next to the server-rendered stage — never wrapping\n * it. The copy stays in the HTML; three arrives as its own chunk, on\n * approach.\n * - The canvas is created here at runtime and slotted behind the stage's\n * content. Give that content `position: relative` (and a z-index if\n * needed) so it paints above the canvas.\n * - Every word of copy lives in the DOM, never in the canvas.\n * - `canRunWebGL()` is false under reduced motion, Save-Data, or without\n * WebGL; the hook then mounts nothing and the visitor keeps the\n * server-rendered still. Mobile gets composed stills by design.\n * - Byte budget: ≤5MB of models/textures per scene, fetched on approach.\n *\n * upforgelabs.com is the reference build (components/cinema/SiteScene.tsx).\n */\n\n'use client'\n\nimport { useEffect, useRef, type RefObject } from 'react'\nimport {\n PerspectiveCamera,\n Scene,\n SRGBColorSpace,\n TextureLoader,\n WebGLRenderer,\n type Object3D,\n type Texture,\n} from 'three'\nimport { prefersReducedMotion, refreshScenes, registerScene, type SceneInfo, type SceneOptions } from './engine'\n\nlet webglProbe: boolean | null = null\n\n/**\n * Whether a WebGL scene should run for this visitor at all. False under\n * prefers-reduced-motion, Save-Data, or when the browser has no WebGL.\n * Always false on the server.\n */\nexport function canRunWebGL(): boolean {\n if (typeof window === 'undefined') return false\n if (prefersReducedMotion()) return false\n const nav = navigator as Navigator & { connection?: { saveData?: boolean } }\n if (nav.connection?.saveData) return false\n if (webglProbe === null) {\n try {\n const c = document.createElement('canvas')\n webglProbe = !!(c.getContext('webgl2') || c.getContext('webgl'))\n } catch {\n webglProbe = false\n }\n }\n return webglProbe\n}\n\nexport interface ThreeStage {\n renderer: WebGLRenderer\n scene: Scene\n camera: PerspectiveCamera\n canvas: HTMLCanvasElement\n /** CSS pixel size of the stage. */\n width: number\n height: number\n dpr: number\n}\n\nexport interface UseThreeStageOptions extends Pick<SceneOptions, 'continuous' | 'reducedP' | 'lerp'> {\n /** Draw the frame for progress p. Called only while the scene is near the viewport. */\n render: (p: number, stage: ThreeStage, info: SceneInfo) => void\n /** Build the scene. May return a cleanup for anything it allocated outside the scene graph. */\n onReady?: (stage: ThreeStage) => void | (() => void)\n /** Called after every resize, with the camera already updated. */\n onResize?: (stage: ThreeStage) => void\n /**\n * Element the canvas fills and is sized to. Default: the pin's\n * `[data-sk-stage]` child (what <ScrollScene> renders), else the pin.\n */\n mount?: RefObject<HTMLElement | null>\n /** Cap on devicePixelRatio. Default 1.75. */\n maxDpr?: number\n alpha?: boolean\n antialias?: boolean\n fov?: number\n near?: number\n far?: number\n /** DOM event dispatched on the pin once the stage is ready. Default \"sk:scene-ready\"; false to skip. */\n readyEvent?: string | false\n /** Override the canRunWebGL() gate. */\n enabled?: boolean\n}\n\n/**\n * Mount a three.js renderer on a pinned scene and drive it from scroll.\n * Owns the canvas, sizing, DPR, context loss, and disposal.\n *\n * @example\n * // Scene.tsx — loaded with dynamic(..., { ssr: false }) as a childless sibling\n * 'use client'\n * export default function Scene({ pin }: { pin: RefObject<HTMLElement | null> }) {\n * useThreeStage(pin, {\n * onReady: ({ scene, camera }) => { camera.position.z = 5; scene.add(mesh) },\n * render: (p, { renderer, scene, camera }) => {\n * camera.position.z = 5 - p * 4\n * renderer.render(scene, camera)\n * },\n * })\n * return null\n * }\n */\nexport function useThreeStage(pin: RefObject<HTMLElement | null>, options: UseThreeStageOptions): void {\n const optsRef = useRef(options)\n optsRef.current = options\n\n useEffect(() => {\n const pinEl = pin.current\n if (!pinEl) return\n const o = optsRef.current\n if (o.enabled === false || (o.enabled === undefined && !canRunWebGL())) return\n\n const host =\n o.mount?.current ??\n (pinEl.querySelector('[data-sk-stage]') as HTMLElement | null) ??\n pinEl\n\n const canvas = document.createElement('canvas')\n Object.assign(canvas.style, {\n position: 'absolute',\n inset: '0',\n width: '100%',\n height: '100%',\n display: 'block',\n pointerEvents: 'none',\n } satisfies Partial<CSSStyleDeclaration>)\n canvas.setAttribute('data-sk-three', '')\n canvas.setAttribute('aria-hidden', 'true')\n if (getComputedStyle(host).position === 'static') host.style.position = 'relative'\n host.prepend(canvas)\n\n let renderer: WebGLRenderer\n try {\n renderer = new WebGLRenderer({\n canvas,\n alpha: o.alpha ?? true,\n antialias: o.antialias ?? true,\n powerPreference: 'high-performance',\n })\n } catch {\n canvas.remove()\n return\n }\n\n const scene = new Scene()\n const camera = new PerspectiveCamera(o.fov ?? 50, 1, o.near ?? 0.1, o.far ?? 1000)\n const stage: ThreeStage = { renderer, scene, camera, canvas, width: 1, height: 1, dpr: 1 }\n\n const size = () => {\n const w = host.clientWidth || 1\n const h = host.clientHeight || 1\n stage.width = w\n stage.height = h\n stage.dpr = Math.min(window.devicePixelRatio || 1, optsRef.current.maxDpr ?? 1.75)\n renderer.setPixelRatio(stage.dpr)\n renderer.setSize(w, h, false)\n camera.aspect = w / h\n camera.updateProjectionMatrix()\n optsRef.current.onResize?.(stage)\n }\n size()\n\n let lost = false\n const onLost = (e: Event) => {\n e.preventDefault()\n lost = true\n }\n const onRestored = () => {\n lost = false\n refreshScenes()\n }\n canvas.addEventListener('webglcontextlost', onLost)\n canvas.addEventListener('webglcontextrestored', onRestored)\n\n const ro = new ResizeObserver(() => {\n size()\n refreshScenes()\n })\n ro.observe(host)\n\n const cleanupReady = optsRef.current.onReady?.(stage)\n\n const unregister = registerScene(\n pinEl,\n (p, info) => {\n if (lost) return\n optsRef.current.render(p, stage, info)\n },\n { continuous: o.continuous, reducedP: o.reducedP, lerp: o.lerp, mode: 'pin' },\n )\n\n const evt = o.readyEvent === false ? null : (o.readyEvent ?? 'sk:scene-ready')\n if (evt) pinEl.dispatchEvent(new CustomEvent(evt, { bubbles: true }))\n\n return () => {\n unregister()\n ro.disconnect()\n canvas.removeEventListener('webglcontextlost', onLost)\n canvas.removeEventListener('webglcontextrestored', onRestored)\n if (typeof cleanupReady === 'function') cleanupReady()\n disposeObject(scene)\n renderer.dispose()\n canvas.remove()\n }\n }, [pin])\n}\n\n/**\n * Load a texture and never throw: resolves null on any failure (a\n * cross-origin image without CORS headers, a 404), so one bad asset can't\n * take a whole scene down. sRGB by default, which is right for photographs\n * and screenshots.\n */\nexport function loadTexture(\n url: string,\n options: { crossOrigin?: string; colorSpace?: Texture['colorSpace'] } = {},\n): Promise<Texture | null> {\n return new Promise((resolve) => {\n const loader = new TextureLoader()\n loader.setCrossOrigin(options.crossOrigin ?? 'anonymous')\n loader.load(\n url,\n (t) => {\n t.colorSpace = options.colorSpace ?? SRGBColorSpace\n resolve(t)\n },\n undefined,\n () => resolve(null),\n )\n })\n}\n\n/** Dispose every geometry, material, and texture under `root`. */\nexport function disposeObject(root: Object3D): void {\n root.traverse((obj) => {\n const mesh = obj as Object3D & {\n geometry?: { dispose(): void }\n material?: unknown\n }\n mesh.geometry?.dispose()\n const mats = Array.isArray(mesh.material) ? mesh.material : mesh.material ? [mesh.material] : []\n for (const m of mats as Array<Record<string, unknown> & { dispose(): void }>) {\n for (const v of Object.values(m)) {\n if (v && typeof v === 'object' && (v as { isTexture?: boolean }).isTexture) {\n ;(v as Texture).dispose()\n }\n }\n m.dispose()\n }\n })\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkPXAALKTP_js = require('../chunk-PXAALKTP.js');
3
+ var chunkKP5BFPGT_js = require('../chunk-KP5BFPGT.js');
4
4
  var chunk5B4FABFK_js = require('../chunk-5B4FABFK.js');
5
5
  var chunk46BMNWE6_js = require('../chunk-46BMNWE6.js');
6
6
  require('../chunk-JP5WGL75.js');
@@ -79,7 +79,7 @@ function decodeSegment(value) {
79
79
 
80
80
  // src/proxy/index.ts
81
81
  function createProxy(config) {
82
- const securityHeaders = chunkPXAALKTP_js.buildSecurityHeaders(
82
+ const securityHeaders = chunkKP5BFPGT_js.buildSecurityHeaders(
83
83
  config?.securityHeaders
84
84
  );
85
85
  const discoveryHeaders = config?.llmsDiscovery ? chunk5B4FABFK_js.buildAiDiscoveryHeaders({
@@ -163,7 +163,7 @@ var createMiddleware = createProxy;
163
163
 
164
164
  Object.defineProperty(exports, "DEFAULT_FRAME_ANCESTORS", {
165
165
  enumerable: true,
166
- get: function () { return chunkPXAALKTP_js.DEFAULT_FRAME_ANCESTORS; }
166
+ get: function () { return chunkKP5BFPGT_js.DEFAULT_FRAME_ANCESTORS; }
167
167
  });
168
168
  exports.createMiddleware = createMiddleware;
169
169
  exports.createProxy = createProxy;
@@ -1,5 +1,5 @@
1
- import { buildSecurityHeaders } from '../chunk-5YKMHPJL.mjs';
2
- export { DEFAULT_FRAME_ANCESTORS } from '../chunk-5YKMHPJL.mjs';
1
+ import { buildSecurityHeaders } from '../chunk-R5F2JQVX.mjs';
2
+ export { DEFAULT_FRAME_ANCESTORS } from '../chunk-R5F2JQVX.mjs';
3
3
  import { buildAiDiscoveryHeaders } from '../chunk-H4OBGC43.mjs';
4
4
  import { handleManagedRedirects, SK_PATH_HEADER } from '../chunk-AJQI3WTN.mjs';
5
5
  import '../chunk-B22WSN4L.mjs';
@@ -9,13 +9,28 @@
9
9
  *
10
10
  * Upforge showcases live client work inside iframes on its portfolio /
11
11
  * area pages, so every managed marketing site has to be embeddable from
12
- * upforge.io. `X-Frame-Options` cannot express an allowlist (`ALLOW-FROM`
13
- * is dead and ignored by every current browser), so the CSP
14
- * `frame-ancestors` directive is the only way to say "these origins and
15
- * nobody else". Everything not listed here is still blocked.
12
+ * the Upforge showcase origins. `X-Frame-Options` cannot express an
13
+ * allowlist (`ALLOW-FROM` is dead and ignored by every current browser),
14
+ * so the CSP `frame-ancestors` directive is the only way to say "these
15
+ * origins and nobody else". Everything not listed here is still blocked.
16
16
  *
17
- * Do NOT re-fork this list into individual sites' middleware/next.config
18
- * add origins here and let the fleet inherit them.
17
+ * upforgelabs.com is a SEPARATE APEX DOMAIN, not a subdomain of
18
+ * upforge.io, so `https://*.upforge.io` does not cover it and never did.
19
+ * Labs case studies embed three live client frames each; without this
20
+ * entry every one of them is refused with ERR_BLOCKED_BY_RESPONSE.
21
+ *
22
+ * upforgeapps.com is deliberately NOT here. It is a third Upforge apex,
23
+ * but it only *links* to case studies (`upforge.io/work/<slug>`, see its
24
+ * `lib/proof.ts`) and frames no client site anywhere. An origin earns a
25
+ * place on this list by embedding, not by belonging to Upforge; adding a
26
+ * non-embedder would hand out framing rights nothing needs. Re-check that
27
+ * before adding it.
28
+ *
29
+ * Do NOT re-fork this list into individual sites' proxy/middleware/
30
+ * next.config/netlify.toml/_headers — a fork is a copy that stops
31
+ * tracking this one, which is exactly how upforgelabs.com came to be
32
+ * missing from ten sites' allowlists at once. Add origins HERE and let
33
+ * the fleet inherit them on its next deploy.
19
34
  */
20
35
  export declare const DEFAULT_FRAME_ANCESTORS: string[];
21
36
  export interface SecurityHeadersConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"securityHeaders.d.ts","sourceRoot":"","sources":["../../src/proxy/securityHeaders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,UAInC,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC;0EACsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,CAAA;IAC5C;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACjC,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+DxB"}
1
+ {"version":3,"file":"securityHeaders.d.ts","sourceRoot":"","sources":["../../src/proxy/securityHeaders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,uBAAuB,UAMnC,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC;0EACsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,CAAA;IAC5C;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACjC,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+DxB"}
@@ -2,9 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkG2WC3CXW_js = require('../chunk-G2WC3CXW.js');
5
- var chunkVIIGOCX4_js = require('../chunk-VIIGOCX4.js');
6
- require('../chunk-CKPFETIO.js');
7
- require('../chunk-YPEX4RDE.js');
5
+ var chunkUJOEN4X6_js = require('../chunk-UJOEN4X6.js');
6
+ require('../chunk-SHZXSIRH.js');
7
+ require('../chunk-TMQKZ4DO.js');
8
8
  require('../chunk-SNAQBZPT.js');
9
9
  var react = require('react');
10
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -39,7 +39,7 @@ function useSiteSearch(options = {}) {
39
39
  const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
40
40
  const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
41
41
  const resolvedSite = site ?? (typeof window !== "undefined" ? window.__SITE_KIT_SITE__ : void 0);
42
- const res = await chunkVIIGOCX4_js.sonorFetch(
42
+ const res = await chunkUJOEN4X6_js.sonorFetch(
43
43
  `${apiUrl}${chunkG2WC3CXW_js.SEARCH_ENDPOINT}`,
44
44
  {
45
45
  method: "POST",
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { SEARCH_ENDPOINT } from '../chunk-75A4KY4X.mjs';
3
3
  export { SEARCH_ENDPOINT } from '../chunk-75A4KY4X.mjs';
4
- import { sonorFetch } from '../chunk-ADOGOLYO.mjs';
5
- import '../chunk-SXNKLHOX.mjs';
6
- import '../chunk-4SQ6PROR.mjs';
4
+ import { sonorFetch } from '../chunk-4HL6CAZ7.mjs';
5
+ import '../chunk-AKQA5ZYZ.mjs';
6
+ import '../chunk-HRQ4367C.mjs';
7
7
  import '../chunk-BEXTDHO4.mjs';
8
8
  import { useState, useRef, useCallback, useEffect } from 'react';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,18 +1,18 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkCBMHJPR7_js = require('../chunk-CBMHJPR7.js');
4
+ var chunkGQTSQR63_js = require('../chunk-GQTSQR63.js');
5
5
  require('../chunk-JEOKDUPQ.js');
6
- require('../chunk-VIIGOCX4.js');
7
- require('../chunk-CKPFETIO.js');
8
- require('../chunk-YPEX4RDE.js');
6
+ require('../chunk-UJOEN4X6.js');
7
+ require('../chunk-SHZXSIRH.js');
8
+ require('../chunk-TMQKZ4DO.js');
9
9
  require('../chunk-SNAQBZPT.js');
10
10
 
11
11
 
12
12
 
13
13
  Object.defineProperty(exports, "SitemapSync", {
14
14
  enumerable: true,
15
- get: function () { return chunkCBMHJPR7_js.SitemapSync; }
15
+ get: function () { return chunkGQTSQR63_js.SitemapSync; }
16
16
  });
17
17
  //# sourceMappingURL=client.js.map
18
18
  //# sourceMappingURL=client.js.map
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-ADBLBGCQ.mjs';
2
+ export { SitemapSync } from '../chunk-WZZYTFDV.mjs';
3
3
  import '../chunk-QJU6HBSK.mjs';
4
- import '../chunk-ADOGOLYO.mjs';
5
- import '../chunk-SXNKLHOX.mjs';
6
- import '../chunk-4SQ6PROR.mjs';
4
+ import '../chunk-4HL6CAZ7.mjs';
5
+ import '../chunk-AKQA5ZYZ.mjs';
6
+ import '../chunk-HRQ4367C.mjs';
7
7
  import '../chunk-BEXTDHO4.mjs';
8
8
  //# sourceMappingURL=client.mjs.map
9
9
  //# sourceMappingURL=client.mjs.map