@makeswift/runtime 0.14.4 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/dist/cjs/api/react.js +3 -17
  2. package/dist/cjs/api/react.js.map +1 -1
  3. package/dist/cjs/api/resource-types.js +24 -0
  4. package/dist/cjs/api/resource-types.js.map +1 -0
  5. package/dist/cjs/components/builtin/Box/Box.js +1 -0
  6. package/dist/cjs/components/builtin/Box/Box.js.map +1 -1
  7. package/dist/cjs/components/builtin/Box/animations.js +1 -0
  8. package/dist/cjs/components/builtin/Box/animations.js.map +1 -1
  9. package/dist/cjs/components/builtin/Box/register.js +2 -3
  10. package/dist/cjs/components/builtin/Box/register.js.map +1 -1
  11. package/dist/cjs/components/builtin/Button/register.js +2 -3
  12. package/dist/cjs/components/builtin/Button/register.js.map +1 -1
  13. package/dist/cjs/components/builtin/Carousel/Carousel.js +1 -0
  14. package/dist/cjs/components/builtin/Carousel/Carousel.js.map +1 -1
  15. package/dist/cjs/components/builtin/Carousel/register.js +2 -3
  16. package/dist/cjs/components/builtin/Carousel/register.js.map +1 -1
  17. package/dist/cjs/components/builtin/Countdown/Countdown.js +1 -0
  18. package/dist/cjs/components/builtin/Countdown/Countdown.js.map +1 -1
  19. package/dist/cjs/components/builtin/Countdown/register.js +2 -3
  20. package/dist/cjs/components/builtin/Countdown/register.js.map +1 -1
  21. package/dist/cjs/components/builtin/Divider/register.js +2 -3
  22. package/dist/cjs/components/builtin/Divider/register.js.map +1 -1
  23. package/dist/cjs/components/builtin/Embed/Embed.js +1 -0
  24. package/dist/cjs/components/builtin/Embed/Embed.js.map +1 -1
  25. package/dist/cjs/components/builtin/Embed/register.js +2 -3
  26. package/dist/cjs/components/builtin/Embed/register.js.map +1 -1
  27. package/dist/cjs/components/builtin/Form/Form.js +3 -2
  28. package/dist/cjs/components/builtin/Form/Form.js.map +1 -1
  29. package/dist/cjs/components/builtin/Form/context/FormContext.js +1 -0
  30. package/dist/cjs/components/builtin/Form/context/FormContext.js.map +1 -1
  31. package/dist/cjs/components/builtin/Form/register.js +2 -3
  32. package/dist/cjs/components/builtin/Form/register.js.map +1 -1
  33. package/dist/cjs/components/builtin/Image/Image.js +1 -0
  34. package/dist/cjs/components/builtin/Image/Image.js.map +1 -1
  35. package/dist/cjs/components/builtin/Image/register.js +2 -3
  36. package/dist/cjs/components/builtin/Image/register.js.map +1 -1
  37. package/dist/cjs/components/builtin/Navigation/Navigation.js +1 -0
  38. package/dist/cjs/components/builtin/Navigation/Navigation.js.map +1 -1
  39. package/dist/cjs/components/builtin/Navigation/register.js +2 -3
  40. package/dist/cjs/components/builtin/Navigation/register.js.map +1 -1
  41. package/dist/cjs/components/builtin/Root/register.js +2 -3
  42. package/dist/cjs/components/builtin/Root/register.js.map +1 -1
  43. package/dist/cjs/components/builtin/SocialLinks/register.js +2 -3
  44. package/dist/cjs/components/builtin/SocialLinks/register.js.map +1 -1
  45. package/dist/cjs/components/builtin/Text/register.js +2 -3
  46. package/dist/cjs/components/builtin/Text/register.js.map +1 -1
  47. package/dist/cjs/components/builtin/Video/Video.js +1 -0
  48. package/dist/cjs/components/builtin/Video/Video.js.map +1 -1
  49. package/dist/cjs/components/builtin/Video/register.js +2 -3
  50. package/dist/cjs/components/builtin/Video/register.js.map +1 -1
  51. package/dist/cjs/components/hooks/usePageSnippets.js +93 -0
  52. package/dist/cjs/components/hooks/usePageSnippets.js.map +1 -0
  53. package/dist/cjs/components/hooks/useRouterLocaleSync.js +49 -0
  54. package/dist/cjs/components/hooks/useRouterLocaleSync.js.map +1 -0
  55. package/dist/cjs/components/page/BodySnippet.js +1 -1
  56. package/dist/cjs/components/page/BodySnippet.js.map +1 -1
  57. package/dist/cjs/components/page/HeadSnippet.js +134 -0
  58. package/dist/cjs/components/page/HeadSnippet.js.map +1 -0
  59. package/dist/cjs/components/page/Page.js +9 -178
  60. package/dist/cjs/components/page/Page.js.map +1 -1
  61. package/dist/cjs/components/page/PageHead.js +109 -0
  62. package/dist/cjs/components/page/PageHead.js.map +1 -0
  63. package/dist/cjs/components/shared/BackgroundsContainer/index.js +1 -0
  64. package/dist/cjs/components/shared/BackgroundsContainer/index.js.map +1 -1
  65. package/dist/cjs/components/shared/Link/index.js +5 -1
  66. package/dist/cjs/components/shared/Link/index.js.map +1 -1
  67. package/dist/cjs/index.js +0 -2
  68. package/dist/cjs/index.js.map +1 -1
  69. package/dist/cjs/next/api-handler/handlers/element-tree.js +17 -8
  70. package/dist/cjs/next/api-handler/handlers/element-tree.js.map +1 -1
  71. package/dist/cjs/next/api-handler/handlers/fonts.js +7 -2
  72. package/dist/cjs/next/api-handler/handlers/fonts.js.map +1 -1
  73. package/dist/cjs/next/api-handler/handlers/manifest.js +20 -8
  74. package/dist/cjs/next/api-handler/handlers/manifest.js.map +1 -1
  75. package/dist/cjs/next/api-handler/handlers/merge-translated-data.js +17 -6
  76. package/dist/cjs/next/api-handler/handlers/merge-translated-data.js.map +1 -1
  77. package/dist/cjs/next/api-handler/handlers/proxy-draft-mode.js +69 -0
  78. package/dist/cjs/next/api-handler/handlers/proxy-draft-mode.js.map +1 -0
  79. package/dist/cjs/next/api-handler/handlers/proxy-preview-mode.js +55 -44
  80. package/dist/cjs/next/api-handler/handlers/proxy-preview-mode.js.map +1 -1
  81. package/dist/cjs/next/api-handler/handlers/revalidate.js +27 -16
  82. package/dist/cjs/next/api-handler/handlers/revalidate.js.map +1 -1
  83. package/dist/cjs/next/api-handler/handlers/translatable-data.js +16 -5
  84. package/dist/cjs/next/api-handler/handlers/translatable-data.js.map +1 -1
  85. package/dist/cjs/next/api-handler/index.js +68 -34
  86. package/dist/cjs/next/api-handler/index.js.map +1 -1
  87. package/dist/cjs/next/client.js +3 -2
  88. package/dist/cjs/next/client.js.map +1 -1
  89. package/dist/cjs/next/components/head-tags.js +77 -0
  90. package/dist/cjs/next/components/head-tags.js.map +1 -0
  91. package/dist/cjs/next/components/page.js +56 -0
  92. package/dist/cjs/next/components/page.js.map +1 -0
  93. package/dist/cjs/next/context/makeswift-host-api-client.js +46 -0
  94. package/dist/cjs/next/context/makeswift-host-api-client.js.map +1 -0
  95. package/dist/cjs/next/context/react-runtime.js +44 -0
  96. package/dist/cjs/next/context/react-runtime.js.map +1 -0
  97. package/dist/cjs/next/draft-mode/draft-mode-script.js +123 -0
  98. package/dist/cjs/next/draft-mode/draft-mode-script.js.map +1 -0
  99. package/dist/cjs/next/draft-mode/index.js +56 -0
  100. package/dist/cjs/next/draft-mode/index.js.map +1 -0
  101. package/dist/cjs/next/hooks/use-is-pages-router.js +37 -0
  102. package/dist/cjs/next/hooks/use-is-pages-router.js.map +1 -0
  103. package/dist/cjs/next/index.js +10 -36
  104. package/dist/cjs/next/index.js.map +1 -1
  105. package/dist/cjs/next/preview-mode.js +4 -2
  106. package/dist/cjs/next/preview-mode.js.map +1 -1
  107. package/dist/cjs/next/root-style-registry.js +90 -0
  108. package/dist/cjs/next/root-style-registry.js.map +1 -0
  109. package/dist/cjs/next/server.js +8 -2
  110. package/dist/cjs/next/server.js.map +1 -1
  111. package/dist/cjs/runtimes/react/components/Element.js +1 -0
  112. package/dist/cjs/runtimes/react/components/Element.js.map +1 -1
  113. package/dist/cjs/runtimes/react/components/LiveProvider.js +6 -13
  114. package/dist/cjs/runtimes/react/components/LiveProvider.js.map +1 -1
  115. package/dist/cjs/runtimes/react/components/PreviewProvider.js +6 -8
  116. package/dist/cjs/runtimes/react/components/PreviewProvider.js.map +1 -1
  117. package/dist/cjs/runtimes/react/components/RuntimeProvider.js +3 -3
  118. package/dist/cjs/runtimes/react/components/RuntimeProvider.js.map +1 -1
  119. package/dist/cjs/runtimes/react/controls/link.js +1 -1
  120. package/dist/cjs/runtimes/react/controls/link.js.map +1 -1
  121. package/dist/cjs/runtimes/react/controls/rich-text/rich-text.js +2 -4
  122. package/dist/cjs/runtimes/react/controls/rich-text/rich-text.js.map +1 -1
  123. package/dist/cjs/runtimes/react/controls/rich-text-v2/rich-text-v2.js +4 -11
  124. package/dist/cjs/runtimes/react/controls/rich-text-v2/rich-text-v2.js.map +1 -1
  125. package/dist/cjs/runtimes/react/hooks/makeswift-api.js +11 -10
  126. package/dist/cjs/runtimes/react/hooks/makeswift-api.js.map +1 -1
  127. package/dist/cjs/runtimes/react/hooks/use-document-key.js +1 -0
  128. package/dist/cjs/runtimes/react/hooks/use-document-key.js.map +1 -1
  129. package/dist/cjs/runtimes/react/hooks/use-page-id.js +1 -0
  130. package/dist/cjs/runtimes/react/hooks/use-page-id.js.map +1 -1
  131. package/dist/cjs/runtimes/react/hooks/use-store.js +1 -0
  132. package/dist/cjs/runtimes/react/hooks/use-store.js.map +1 -1
  133. package/dist/cjs/runtimes/react/use-global-style.js +15 -10
  134. package/dist/cjs/runtimes/react/use-global-style.js.map +1 -1
  135. package/dist/cjs/runtimes/react/use-style.js +7 -6
  136. package/dist/cjs/runtimes/react/use-style.js.map +1 -1
  137. package/dist/cjs/state/actions.js +0 -25
  138. package/dist/cjs/state/actions.js.map +1 -1
  139. package/dist/cjs/state/react-builder-preview.js +1 -24
  140. package/dist/cjs/state/react-builder-preview.js.map +1 -1
  141. package/dist/esm/api/react.js +2 -14
  142. package/dist/esm/api/react.js.map +1 -1
  143. package/dist/esm/api/resource-types.js +8 -0
  144. package/dist/esm/api/resource-types.js.map +1 -0
  145. package/dist/esm/components/builtin/Box/Box.js +1 -0
  146. package/dist/esm/components/builtin/Box/Box.js.map +1 -1
  147. package/dist/esm/components/builtin/Box/animations.js +1 -0
  148. package/dist/esm/components/builtin/Box/animations.js.map +1 -1
  149. package/dist/esm/components/builtin/Box/register.js +2 -3
  150. package/dist/esm/components/builtin/Box/register.js.map +1 -1
  151. package/dist/esm/components/builtin/Button/register.js +2 -3
  152. package/dist/esm/components/builtin/Button/register.js.map +1 -1
  153. package/dist/esm/components/builtin/Carousel/Carousel.js +1 -0
  154. package/dist/esm/components/builtin/Carousel/Carousel.js.map +1 -1
  155. package/dist/esm/components/builtin/Carousel/register.js +2 -3
  156. package/dist/esm/components/builtin/Carousel/register.js.map +1 -1
  157. package/dist/esm/components/builtin/Countdown/Countdown.js +1 -0
  158. package/dist/esm/components/builtin/Countdown/Countdown.js.map +1 -1
  159. package/dist/esm/components/builtin/Countdown/register.js +2 -3
  160. package/dist/esm/components/builtin/Countdown/register.js.map +1 -1
  161. package/dist/esm/components/builtin/Divider/register.js +2 -3
  162. package/dist/esm/components/builtin/Divider/register.js.map +1 -1
  163. package/dist/esm/components/builtin/Embed/Embed.js +1 -0
  164. package/dist/esm/components/builtin/Embed/Embed.js.map +1 -1
  165. package/dist/esm/components/builtin/Embed/register.js +2 -3
  166. package/dist/esm/components/builtin/Embed/register.js.map +1 -1
  167. package/dist/esm/components/builtin/Form/Form.js +3 -2
  168. package/dist/esm/components/builtin/Form/Form.js.map +1 -1
  169. package/dist/esm/components/builtin/Form/context/FormContext.js +1 -0
  170. package/dist/esm/components/builtin/Form/context/FormContext.js.map +1 -1
  171. package/dist/esm/components/builtin/Form/register.js +2 -3
  172. package/dist/esm/components/builtin/Form/register.js.map +1 -1
  173. package/dist/esm/components/builtin/Image/Image.js +1 -0
  174. package/dist/esm/components/builtin/Image/Image.js.map +1 -1
  175. package/dist/esm/components/builtin/Image/register.js +2 -3
  176. package/dist/esm/components/builtin/Image/register.js.map +1 -1
  177. package/dist/esm/components/builtin/Navigation/Navigation.js +1 -0
  178. package/dist/esm/components/builtin/Navigation/Navigation.js.map +1 -1
  179. package/dist/esm/components/builtin/Navigation/register.js +2 -3
  180. package/dist/esm/components/builtin/Navigation/register.js.map +1 -1
  181. package/dist/esm/components/builtin/Root/register.js +2 -3
  182. package/dist/esm/components/builtin/Root/register.js.map +1 -1
  183. package/dist/esm/components/builtin/SocialLinks/register.js +2 -3
  184. package/dist/esm/components/builtin/SocialLinks/register.js.map +1 -1
  185. package/dist/esm/components/builtin/Text/register.js +2 -3
  186. package/dist/esm/components/builtin/Text/register.js.map +1 -1
  187. package/dist/esm/components/builtin/Video/Video.js +1 -0
  188. package/dist/esm/components/builtin/Video/Video.js.map +1 -1
  189. package/dist/esm/components/builtin/Video/register.js +2 -3
  190. package/dist/esm/components/builtin/Video/register.js.map +1 -1
  191. package/dist/esm/components/hooks/usePageSnippets.js +59 -0
  192. package/dist/esm/components/hooks/usePageSnippets.js.map +1 -0
  193. package/dist/esm/components/hooks/useRouterLocaleSync.js +25 -0
  194. package/dist/esm/components/hooks/useRouterLocaleSync.js.map +1 -0
  195. package/dist/esm/components/page/BodySnippet.js +1 -1
  196. package/dist/esm/components/page/BodySnippet.js.map +1 -1
  197. package/dist/esm/components/page/HeadSnippet.js +100 -0
  198. package/dist/esm/components/page/HeadSnippet.js.map +1 -0
  199. package/dist/esm/components/page/Page.js +7 -166
  200. package/dist/esm/components/page/Page.js.map +1 -1
  201. package/dist/esm/components/page/PageHead.js +85 -0
  202. package/dist/esm/components/page/PageHead.js.map +1 -0
  203. package/dist/esm/components/shared/BackgroundsContainer/index.js +1 -0
  204. package/dist/esm/components/shared/BackgroundsContainer/index.js.map +1 -1
  205. package/dist/esm/components/shared/Link/index.js +5 -1
  206. package/dist/esm/components/shared/Link/index.js.map +1 -1
  207. package/dist/esm/index.js +0 -2
  208. package/dist/esm/index.js.map +1 -1
  209. package/dist/esm/next/api-handler/handlers/element-tree.js +17 -8
  210. package/dist/esm/next/api-handler/handlers/element-tree.js.map +1 -1
  211. package/dist/esm/next/api-handler/handlers/fonts.js +7 -2
  212. package/dist/esm/next/api-handler/handlers/fonts.js.map +1 -1
  213. package/dist/esm/next/api-handler/handlers/manifest.js +20 -8
  214. package/dist/esm/next/api-handler/handlers/manifest.js.map +1 -1
  215. package/dist/esm/next/api-handler/handlers/merge-translated-data.js +17 -6
  216. package/dist/esm/next/api-handler/handlers/merge-translated-data.js.map +1 -1
  217. package/dist/esm/next/api-handler/handlers/proxy-draft-mode.js +49 -0
  218. package/dist/esm/next/api-handler/handlers/proxy-draft-mode.js.map +1 -0
  219. package/dist/esm/next/api-handler/handlers/proxy-preview-mode.js +55 -44
  220. package/dist/esm/next/api-handler/handlers/proxy-preview-mode.js.map +1 -1
  221. package/dist/esm/next/api-handler/handlers/revalidate.js +27 -16
  222. package/dist/esm/next/api-handler/handlers/revalidate.js.map +1 -1
  223. package/dist/esm/next/api-handler/handlers/translatable-data.js +16 -5
  224. package/dist/esm/next/api-handler/handlers/translatable-data.js.map +1 -1
  225. package/dist/esm/next/api-handler/index.js +68 -34
  226. package/dist/esm/next/api-handler/index.js.map +1 -1
  227. package/dist/esm/next/client.js +3 -2
  228. package/dist/esm/next/client.js.map +1 -1
  229. package/dist/esm/next/components/head-tags.js +40 -0
  230. package/dist/esm/next/components/head-tags.js.map +1 -0
  231. package/dist/esm/next/components/page.js +32 -0
  232. package/dist/esm/next/components/page.js.map +1 -0
  233. package/dist/esm/next/context/makeswift-host-api-client.js +21 -0
  234. package/dist/esm/next/context/makeswift-host-api-client.js.map +1 -0
  235. package/dist/esm/next/context/react-runtime.js +19 -0
  236. package/dist/esm/next/context/react-runtime.js.map +1 -0
  237. package/dist/esm/next/draft-mode/draft-mode-script.js +99 -0
  238. package/dist/esm/next/draft-mode/draft-mode-script.js.map +1 -0
  239. package/dist/esm/next/draft-mode/index.js +30 -0
  240. package/dist/esm/next/draft-mode/index.js.map +1 -0
  241. package/dist/esm/next/hooks/use-is-pages-router.js +13 -0
  242. package/dist/esm/next/hooks/use-is-pages-router.js.map +1 -0
  243. package/dist/esm/next/index.js +5 -32
  244. package/dist/esm/next/index.js.map +1 -1
  245. package/dist/esm/next/preview-mode.js +2 -1
  246. package/dist/esm/next/preview-mode.js.map +1 -1
  247. package/dist/esm/next/root-style-registry.js +55 -0
  248. package/dist/esm/next/root-style-registry.js.map +1 -0
  249. package/dist/esm/next/server.js +5 -1
  250. package/dist/esm/next/server.js.map +1 -1
  251. package/dist/esm/runtimes/react/components/Element.js +1 -0
  252. package/dist/esm/runtimes/react/components/Element.js.map +1 -1
  253. package/dist/esm/runtimes/react/components/LiveProvider.js +6 -13
  254. package/dist/esm/runtimes/react/components/LiveProvider.js.map +1 -1
  255. package/dist/esm/runtimes/react/components/PreviewProvider.js +6 -8
  256. package/dist/esm/runtimes/react/components/PreviewProvider.js.map +1 -1
  257. package/dist/esm/runtimes/react/components/RuntimeProvider.js +3 -3
  258. package/dist/esm/runtimes/react/components/RuntimeProvider.js.map +1 -1
  259. package/dist/esm/runtimes/react/controls/link.js +1 -1
  260. package/dist/esm/runtimes/react/controls/link.js.map +1 -1
  261. package/dist/esm/runtimes/react/controls/rich-text/rich-text.js +3 -5
  262. package/dist/esm/runtimes/react/controls/rich-text/rich-text.js.map +1 -1
  263. package/dist/esm/runtimes/react/controls/rich-text-v2/rich-text-v2.js +4 -11
  264. package/dist/esm/runtimes/react/controls/rich-text-v2/rich-text-v2.js.map +1 -1
  265. package/dist/esm/runtimes/react/hooks/makeswift-api.js +11 -10
  266. package/dist/esm/runtimes/react/hooks/makeswift-api.js.map +1 -1
  267. package/dist/esm/runtimes/react/hooks/use-document-key.js +1 -0
  268. package/dist/esm/runtimes/react/hooks/use-document-key.js.map +1 -1
  269. package/dist/esm/runtimes/react/hooks/use-page-id.js +1 -0
  270. package/dist/esm/runtimes/react/hooks/use-page-id.js.map +1 -1
  271. package/dist/esm/runtimes/react/hooks/use-store.js +1 -0
  272. package/dist/esm/runtimes/react/hooks/use-store.js.map +1 -1
  273. package/dist/esm/runtimes/react/use-global-style.js +8 -3
  274. package/dist/esm/runtimes/react/use-global-style.js.map +1 -1
  275. package/dist/esm/runtimes/react/use-style.js +2 -1
  276. package/dist/esm/runtimes/react/use-style.js.map +1 -1
  277. package/dist/esm/state/actions.js +0 -22
  278. package/dist/esm/state/actions.js.map +1 -1
  279. package/dist/esm/state/react-builder-preview.js +2 -28
  280. package/dist/esm/state/react-builder-preview.js.map +1 -1
  281. package/dist/types/api/react.d.ts +1 -9
  282. package/dist/types/api/react.d.ts.map +1 -1
  283. package/dist/types/api/resource-types.d.ts +20 -0
  284. package/dist/types/api/resource-types.d.ts.map +1 -0
  285. package/dist/types/components/builtin/Box/Box.d.ts.map +1 -1
  286. package/dist/types/components/builtin/Box/animations.d.ts.map +1 -1
  287. package/dist/types/components/builtin/Box/register.d.ts.map +1 -1
  288. package/dist/types/components/builtin/Button/register.d.ts.map +1 -1
  289. package/dist/types/components/builtin/Carousel/Carousel.d.ts.map +1 -1
  290. package/dist/types/components/builtin/Carousel/register.d.ts.map +1 -1
  291. package/dist/types/components/builtin/Countdown/Countdown.d.ts.map +1 -1
  292. package/dist/types/components/builtin/Countdown/register.d.ts.map +1 -1
  293. package/dist/types/components/builtin/Divider/register.d.ts.map +1 -1
  294. package/dist/types/components/builtin/Embed/Embed.d.ts.map +1 -1
  295. package/dist/types/components/builtin/Embed/register.d.ts.map +1 -1
  296. package/dist/types/components/builtin/Form/Form.d.ts.map +1 -1
  297. package/dist/types/components/builtin/Form/components/Field/components/Checkbox/index.d.ts +1 -1
  298. package/dist/types/components/builtin/Form/context/FormContext.d.ts.map +1 -1
  299. package/dist/types/components/builtin/Form/register.d.ts.map +1 -1
  300. package/dist/types/components/builtin/Image/Image.d.ts.map +1 -1
  301. package/dist/types/components/builtin/Image/register.d.ts.map +1 -1
  302. package/dist/types/components/builtin/Navigation/Navigation.d.ts.map +1 -1
  303. package/dist/types/components/builtin/Navigation/register.d.ts.map +1 -1
  304. package/dist/types/components/builtin/Root/register.d.ts.map +1 -1
  305. package/dist/types/components/builtin/SocialLinks/register.d.ts.map +1 -1
  306. package/dist/types/components/builtin/Text/register.d.ts.map +1 -1
  307. package/dist/types/components/builtin/Video/Video.d.ts.map +1 -1
  308. package/dist/types/components/builtin/Video/register.d.ts.map +1 -1
  309. package/dist/types/components/hooks/usePageSnippets.d.ts +36 -0
  310. package/dist/types/components/hooks/usePageSnippets.d.ts.map +1 -0
  311. package/dist/types/components/hooks/useRouterLocaleSync.d.ts +2 -0
  312. package/dist/types/components/hooks/useRouterLocaleSync.d.ts.map +1 -0
  313. package/dist/types/components/page/BodySnippet.d.ts.map +1 -1
  314. package/dist/types/components/page/HeadSnippet.d.ts +7 -0
  315. package/dist/types/components/page/HeadSnippet.d.ts.map +1 -0
  316. package/dist/types/components/page/Page.d.ts.map +1 -1
  317. package/dist/types/components/page/PageHead.d.ts +8 -0
  318. package/dist/types/components/page/PageHead.d.ts.map +1 -0
  319. package/dist/types/components/shared/BackgroundsContainer/index.d.ts.map +1 -1
  320. package/dist/types/components/shared/Link/index.d.ts.map +1 -1
  321. package/dist/types/index.d.ts +1 -1
  322. package/dist/types/index.d.ts.map +1 -1
  323. package/dist/types/next/api-handler/handlers/element-tree.d.ts +9 -1
  324. package/dist/types/next/api-handler/handlers/element-tree.d.ts.map +1 -1
  325. package/dist/types/next/api-handler/handlers/fonts.d.ts +10 -1
  326. package/dist/types/next/api-handler/handlers/fonts.d.ts.map +1 -1
  327. package/dist/types/next/api-handler/handlers/manifest.d.ts +9 -0
  328. package/dist/types/next/api-handler/handlers/manifest.d.ts.map +1 -1
  329. package/dist/types/next/api-handler/handlers/merge-translated-data.d.ts +7 -0
  330. package/dist/types/next/api-handler/handlers/merge-translated-data.d.ts.map +1 -1
  331. package/dist/types/next/api-handler/handlers/proxy-draft-mode.d.ts +20 -0
  332. package/dist/types/next/api-handler/handlers/proxy-draft-mode.d.ts.map +1 -0
  333. package/dist/types/next/api-handler/handlers/proxy-preview-mode.d.ts +14 -2
  334. package/dist/types/next/api-handler/handlers/proxy-preview-mode.d.ts.map +1 -1
  335. package/dist/types/next/api-handler/handlers/revalidate.d.ts +9 -0
  336. package/dist/types/next/api-handler/handlers/revalidate.d.ts.map +1 -1
  337. package/dist/types/next/api-handler/handlers/translatable-data.d.ts +7 -0
  338. package/dist/types/next/api-handler/handlers/translatable-data.d.ts.map +1 -1
  339. package/dist/types/next/api-handler/index.d.ts +11 -3
  340. package/dist/types/next/api-handler/index.d.ts.map +1 -1
  341. package/dist/types/next/client.d.ts.map +1 -1
  342. package/dist/types/next/components/head-tags.d.ts +19 -0
  343. package/dist/types/next/components/head-tags.d.ts.map +1 -0
  344. package/dist/types/next/components/page.d.ts +7 -0
  345. package/dist/types/next/components/page.d.ts.map +1 -0
  346. package/dist/types/next/context/makeswift-host-api-client.d.ts +8 -0
  347. package/dist/types/next/context/makeswift-host-api-client.d.ts.map +1 -0
  348. package/dist/types/next/context/react-runtime.d.ts +8 -0
  349. package/dist/types/next/context/react-runtime.d.ts.map +1 -0
  350. package/dist/types/next/draft-mode/draft-mode-script.d.ts +6 -0
  351. package/dist/types/next/draft-mode/draft-mode-script.d.ts.map +1 -0
  352. package/dist/types/next/draft-mode/index.d.ts +15 -0
  353. package/dist/types/next/draft-mode/index.d.ts.map +1 -0
  354. package/dist/types/next/hooks/use-is-pages-router.d.ts +2 -0
  355. package/dist/types/next/hooks/use-is-pages-router.d.ts.map +1 -0
  356. package/dist/types/next/index.d.ts +4 -9
  357. package/dist/types/next/index.d.ts.map +1 -1
  358. package/dist/types/next/preview-mode.d.ts +1 -1
  359. package/dist/types/next/preview-mode.d.ts.map +1 -1
  360. package/dist/types/next/root-style-registry.d.ts +7 -0
  361. package/dist/types/next/root-style-registry.d.ts.map +1 -0
  362. package/dist/types/next/server.d.ts +2 -0
  363. package/dist/types/next/server.d.ts.map +1 -1
  364. package/dist/types/runtimes/react/components/Element.d.ts.map +1 -1
  365. package/dist/types/runtimes/react/components/LiveProvider.d.ts +3 -5
  366. package/dist/types/runtimes/react/components/LiveProvider.d.ts.map +1 -1
  367. package/dist/types/runtimes/react/components/PreviewProvider.d.ts +3 -5
  368. package/dist/types/runtimes/react/components/PreviewProvider.d.ts.map +1 -1
  369. package/dist/types/runtimes/react/components/RuntimeProvider.d.ts +2 -2
  370. package/dist/types/runtimes/react/components/RuntimeProvider.d.ts.map +1 -1
  371. package/dist/types/runtimes/react/controls/link.d.ts.map +1 -1
  372. package/dist/types/runtimes/react/controls/rich-text/rich-text.d.ts.map +1 -1
  373. package/dist/types/runtimes/react/controls/rich-text-v2/rich-text-v2.d.ts.map +1 -1
  374. package/dist/types/runtimes/react/hooks/makeswift-api.d.ts +2 -1
  375. package/dist/types/runtimes/react/hooks/makeswift-api.d.ts.map +1 -1
  376. package/dist/types/runtimes/react/hooks/use-document-key.d.ts.map +1 -1
  377. package/dist/types/runtimes/react/hooks/use-page-id.d.ts.map +1 -1
  378. package/dist/types/runtimes/react/hooks/use-store.d.ts.map +1 -1
  379. package/dist/types/runtimes/react/use-global-style.d.ts.map +1 -1
  380. package/dist/types/runtimes/react/use-style.d.ts.map +1 -1
  381. package/dist/types/state/actions.d.ts +1 -19
  382. package/dist/types/state/actions.d.ts.map +1 -1
  383. package/dist/types/state/react-builder-preview.d.ts +3 -3
  384. package/dist/types/state/react-builder-preview.d.ts.map +1 -1
  385. package/next/plugin/package.json +1 -0
  386. package/package.json +6 -10
  387. package/slate/package.json +1 -1
  388. package/dist/cjs/next/dynamic.js +0 -52
  389. package/dist/cjs/next/dynamic.js.map +0 -1
  390. package/dist/esm/next/dynamic.js +0 -31
  391. package/dist/esm/next/dynamic.js.map +0 -1
  392. package/dist/types/next/dynamic.d.ts +0 -13
  393. package/dist/types/next/dynamic.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/builtin/Video/register.ts"],"sourcesContent":["import dynamic from 'next/dynamic'\n\nimport { forwardNextDynamicRef } from '../../../next/dynamic'\nimport { Props } from '../../../prop-controllers'\nimport { ReactRuntime } from '../../../runtimes/react'\nimport { MakeswiftComponentType } from '../constants'\nimport { ComponentIcon } from '../../../state/modules/components-meta'\n\nexport function registerComponent(runtime: ReactRuntime) {\n return runtime.registerComponent(\n forwardNextDynamicRef(patch => dynamic(() => patch(import('./Video')))),\n {\n type: MakeswiftComponentType.Video,\n label: 'Video',\n icon: ComponentIcon.Video,\n props: {\n id: Props.ElementID(),\n video: Props.Video({ preset: { controls: true } }),\n width: Props.Width({\n format: Props.Width.Format.ClassName,\n defaultValue: { value: 560, unit: 'px' },\n }),\n margin: Props.Margin({ format: Props.Margin.Format.ClassName }),\n borderRadius: Props.BorderRadius({ format: Props.BorderRadius.Format.ClassName }),\n },\n },\n )\n}\n"],"mappings":"AAAA,OAAO,aAAa;AAEpB,SAAS,6BAA6B;AACtC,SAAS,aAAa;AAEtB,SAAS,8BAA8B;AACvC,SAAS,qBAAqB;AAEvB,SAAS,kBAAkB,SAAuB;AACvD,SAAO,QAAQ;AAAA,IACb,sBAAsB,WAAS,QAAQ,MAAM,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC;AAAA,IACtE;AAAA,MACE,MAAM,uBAAuB;AAAA,MAC7B,OAAO;AAAA,MACP,MAAM,cAAc;AAAA,MACpB,OAAO;AAAA,QACL,IAAI,MAAM,UAAU;AAAA,QACpB,OAAO,MAAM,MAAM,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE,CAAC;AAAA,QACjD,OAAO,MAAM,MAAM;AAAA,UACjB,QAAQ,MAAM,MAAM,OAAO;AAAA,UAC3B,cAAc,EAAE,OAAO,KAAK,MAAM,KAAK;AAAA,QACzC,CAAC;AAAA,QACD,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,OAAO,OAAO,UAAU,CAAC;AAAA,QAC9D,cAAc,MAAM,aAAa,EAAE,QAAQ,MAAM,aAAa,OAAO,UAAU,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/builtin/Video/register.ts"],"sourcesContent":["import { Props } from '../../../prop-controllers'\nimport { ReactRuntime } from '../../../runtimes/react'\nimport { MakeswiftComponentType } from '../constants'\nimport { ComponentIcon } from '../../../state/modules/components-meta'\nimport { lazy } from 'react'\n\nexport function registerComponent(runtime: ReactRuntime) {\n return runtime.registerComponent(\n lazy(() => import('./Video')),\n {\n type: MakeswiftComponentType.Video,\n label: 'Video',\n icon: ComponentIcon.Video,\n props: {\n id: Props.ElementID(),\n video: Props.Video({ preset: { controls: true } }),\n width: Props.Width({\n format: Props.Width.Format.ClassName,\n defaultValue: { value: 560, unit: 'px' },\n }),\n margin: Props.Margin({ format: Props.Margin.Format.ClassName }),\n borderRadius: Props.BorderRadius({ format: Props.BorderRadius.Format.ClassName }),\n },\n },\n )\n}\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,8BAA8B;AACvC,SAAS,qBAAqB;AAC9B,SAAS,YAAY;AAEd,SAAS,kBAAkB,SAAuB;AACvD,SAAO,QAAQ;AAAA,IACb,KAAK,MAAM,OAAO,SAAS,CAAC;AAAA,IAC5B;AAAA,MACE,MAAM,uBAAuB;AAAA,MAC7B,OAAO;AAAA,MACP,MAAM,cAAc;AAAA,MACpB,OAAO;AAAA,QACL,IAAI,MAAM,UAAU;AAAA,QACpB,OAAO,MAAM,MAAM,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE,CAAC;AAAA,QACjD,OAAO,MAAM,MAAM;AAAA,UACjB,QAAQ,MAAM,MAAM,OAAO;AAAA,UAC3B,cAAc,EAAE,OAAO,KAAK,MAAM,KAAK;AAAA,QACzC,CAAC;AAAA,QACD,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,OAAO,OAAO,UAAU,CAAC;AAAA,QAC9D,cAAc,MAAM,aAAa,EAAE,QAAQ,MAAM,aAAa,OAAO,UAAU,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,59 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ import { useIsInBuilder } from "../../react";
3
+ import deepEqual from "../../utils/deepEqual";
4
+ import { useMakeswiftHostApiClient } from "../../next/context/makeswift-host-api-client";
5
+ import { useSyncExternalStore } from "use-sync-external-store/shim";
6
+ const SnippetLocation = {
7
+ Body: "BODY",
8
+ Head: "HEAD"
9
+ };
10
+ const filterUsedSnippetProperties = ({
11
+ code,
12
+ builderEnabled,
13
+ liveEnabled,
14
+ location,
15
+ cleanup
16
+ }) => ({
17
+ code,
18
+ builderEnabled,
19
+ liveEnabled,
20
+ location,
21
+ cleanup
22
+ });
23
+ function usePageSnippets({ page }) {
24
+ const isInBuilder = useIsInBuilder();
25
+ const [snippets, setSnippets] = useState(page.snippets);
26
+ const cachedPage = useCachedPage(isInBuilder ? page.id : null);
27
+ useEffect(() => {
28
+ if (cachedPage == null)
29
+ return;
30
+ const oldSnippets = snippets.map(filterUsedSnippetProperties);
31
+ const newSnippets = cachedPage.snippets.map(filterUsedSnippetProperties);
32
+ if (deepEqual(newSnippets, oldSnippets))
33
+ return;
34
+ setSnippets(cachedPage.snippets);
35
+ }, [cachedPage]);
36
+ const filteredSnippets = useMemo(
37
+ () => snippets.filter((snippet) => isInBuilder ? snippet.builderEnabled : snippet.liveEnabled),
38
+ [snippets, isInBuilder]
39
+ );
40
+ const headSnippets = useMemo(
41
+ () => filteredSnippets.filter((snippet) => snippet.location === SnippetLocation.Head),
42
+ [filteredSnippets]
43
+ );
44
+ const bodySnippets = useMemo(
45
+ () => filteredSnippets.filter((snippet) => snippet.location === SnippetLocation.Body),
46
+ [filteredSnippets]
47
+ );
48
+ return { headSnippets, bodySnippets };
49
+ }
50
+ function useCachedPage(pageId) {
51
+ const client = useMakeswiftHostApiClient();
52
+ const getSnapshot = () => pageId == null ? null : client.readPage(pageId);
53
+ const page = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot);
54
+ return page;
55
+ }
56
+ export {
57
+ usePageSnippets
58
+ };
59
+ //# sourceMappingURL=usePageSnippets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/hooks/usePageSnippets.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { useIsInBuilder } from '../../react'\nimport { MakeswiftPageDocument } from '../../next'\nimport deepEqual from '../../utils/deepEqual'\nimport { useMakeswiftHostApiClient } from '../../next/context/makeswift-host-api-client'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport { Page as PageType } from '../../api'\n\nconst SnippetLocation = {\n Body: 'BODY',\n Head: 'HEAD',\n} as const\n\nexport type SnippetLocation = typeof SnippetLocation[keyof typeof SnippetLocation]\n\nexport type Snippet = {\n builderEnabled: boolean\n cleanup: string | null\n code: string\n id: string\n liveEnabled: boolean\n location: SnippetLocation\n}\n\nconst filterUsedSnippetProperties = ({\n code,\n builderEnabled,\n liveEnabled,\n location,\n cleanup,\n}: Snippet) => ({\n code,\n builderEnabled,\n liveEnabled,\n location,\n cleanup,\n})\n\nexport function usePageSnippets({ page }: { page: MakeswiftPageDocument }) {\n const isInBuilder = useIsInBuilder()\n const [snippets, setSnippets] = useState(page.snippets)\n\n // We're using cached results here for page snippets so that anytime the user\n // changes the snippets or fonts on the builder, the change would be reflected\n // here. See this PR for discussions and things we can do to improve it in the\n // future: https://github.com/makeswift/makeswift/pull/77\n const cachedPage = useCachedPage(isInBuilder ? page.id : null)\n useEffect(() => {\n if (cachedPage == null) return\n\n const oldSnippets = snippets.map(filterUsedSnippetProperties)\n const newSnippets = cachedPage.snippets.map(filterUsedSnippetProperties)\n\n if (deepEqual(newSnippets, oldSnippets)) return\n\n setSnippets(cachedPage.snippets)\n }, [cachedPage])\n\n const filteredSnippets = useMemo(\n () => snippets.filter(snippet => (isInBuilder ? snippet.builderEnabled : snippet.liveEnabled)),\n [snippets, isInBuilder],\n )\n\n const headSnippets = useMemo(\n () => filteredSnippets.filter(snippet => snippet.location === SnippetLocation.Head),\n [filteredSnippets],\n )\n\n const bodySnippets = useMemo(\n () => filteredSnippets.filter(snippet => snippet.location === SnippetLocation.Body),\n [filteredSnippets],\n )\n\n return { headSnippets, bodySnippets }\n}\n\nfunction useCachedPage(pageId: string | null): PageType | null {\n const client = useMakeswiftHostApiClient()\n const getSnapshot = () => (pageId == null ? null : client.readPage(pageId))\n\n const page = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot)\n\n return page\n}\n"],"mappings":"AAAA,SAAS,WAAW,SAAS,gBAAgB;AAC7C,SAAS,sBAAsB;AAE/B,OAAO,eAAe;AACtB,SAAS,iCAAiC;AAC1C,SAAS,4BAA4B;AAGrC,MAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AACR;AAaA,MAAM,8BAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OAAgB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,EAAE,KAAK,GAAoC;AACzE,QAAM,cAAc,eAAe;AACnC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK,QAAQ;AAMtD,QAAM,aAAa,cAAc,cAAc,KAAK,KAAK,IAAI;AAC7D,YAAU,MAAM;AACd,QAAI,cAAc;AAAM;AAExB,UAAM,cAAc,SAAS,IAAI,2BAA2B;AAC5D,UAAM,cAAc,WAAW,SAAS,IAAI,2BAA2B;AAEvE,QAAI,UAAU,aAAa,WAAW;AAAG;AAEzC,gBAAY,WAAW,QAAQ;AAAA,EACjC,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,mBAAmB;AAAA,IACvB,MAAM,SAAS,OAAO,aAAY,cAAc,QAAQ,iBAAiB,QAAQ,WAAY;AAAA,IAC7F,CAAC,UAAU,WAAW;AAAA,EACxB;AAEA,QAAM,eAAe;AAAA,IACnB,MAAM,iBAAiB,OAAO,aAAW,QAAQ,aAAa,gBAAgB,IAAI;AAAA,IAClF,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,eAAe;AAAA,IACnB,MAAM,iBAAiB,OAAO,aAAW,QAAQ,aAAa,gBAAgB,IAAI;AAAA,IAClF,CAAC,gBAAgB;AAAA,EACnB;AAEA,SAAO,EAAE,cAAc,aAAa;AACtC;AAEA,SAAS,cAAc,QAAwC;AAC7D,QAAM,SAAS,0BAA0B;AACzC,QAAM,cAAc,MAAO,UAAU,OAAO,OAAO,OAAO,SAAS,MAAM;AAEzE,QAAM,OAAO,qBAAqB,OAAO,WAAW,aAAa,WAAW;AAE5E,SAAO;AACT;","names":[]}
@@ -0,0 +1,25 @@
1
+ import { useRouter as usePagesRouter } from "next/router";
2
+ import { P, match } from "ts-pattern";
3
+ import { useEffect } from "react";
4
+ import { setLocale } from "../../state/actions";
5
+ import { useDispatch } from "../../runtimes/react/hooks/use-dispatch";
6
+ function useRouter() {
7
+ try {
8
+ const router = usePagesRouter();
9
+ return router;
10
+ } catch (e) {
11
+ return;
12
+ }
13
+ }
14
+ const useRouterLocaleSync = () => {
15
+ const router = useRouter();
16
+ const dispatch = useDispatch();
17
+ useEffect(() => {
18
+ match(router).with({ locale: P.string }, ({ locale }) => dispatch(setLocale(new Intl.Locale(locale)))).otherwise(() => {
19
+ });
20
+ }, [router]);
21
+ };
22
+ export {
23
+ useRouterLocaleSync
24
+ };
25
+ //# sourceMappingURL=useRouterLocaleSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/hooks/useRouterLocaleSync.ts"],"sourcesContent":["import { useRouter as usePagesRouter } from 'next/router'\nimport { P, match } from 'ts-pattern'\nimport { useEffect } from 'react'\n\nimport { setLocale } from '../../state/actions'\nimport { useDispatch } from '../../runtimes/react/hooks/use-dispatch'\n\nfunction useRouter() {\n try {\n const router = usePagesRouter()\n\n return router\n } catch (e) {\n return;\n }\n}\n\nexport const useRouterLocaleSync = () => {\n const router = useRouter()\n const dispatch = useDispatch()\n\n useEffect(() => {\n match(router)\n .with({ locale: P.string }, ({ locale }) => dispatch(setLocale(new Intl.Locale(locale))))\n .otherwise(() => {})\n }, [router])\n}\n"],"mappings":"AAAA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,GAAG,aAAa;AACzB,SAAS,iBAAiB;AAE1B,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,SAAS,YAAY;AACnB,MAAI;AACF,UAAM,SAAS,eAAe;AAE9B,WAAO;AAAA,EACT,SAAS,GAAG;AACV;AAAA,EACF;AACF;AAEO,MAAM,sBAAsB,MAAM;AACvC,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,YAAY;AAE7B,YAAU,MAAM;AACd,UAAM,MAAM,EACT,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,MAAM,SAAS,UAAU,IAAI,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC,EACvF,UAAU,MAAM;AAAA,IAAC,CAAC;AAAA,EACvB,GAAG,CAAC,MAAM,CAAC;AACb;","names":[]}
@@ -26,8 +26,8 @@ function BodySnippet({ code, cleanup }) {
26
26
  });
27
27
  if (cleanup == null)
28
28
  return;
29
- const cleanUp = new Function(cleanup);
30
29
  try {
30
+ const cleanUp = new Function(cleanup);
31
31
  cleanUp();
32
32
  } catch {
33
33
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/page/BodySnippet.tsx"],"sourcesContent":["import { useEffect } from 'react'\n\nconst SCRIPT_TAG = 'script'\n\ntype Props = {\n code: string\n cleanup: string | null | undefined\n}\n\nexport function BodySnippet({ code, cleanup }: Props): null {\n useEffect(() => {\n const container = document.createElement('div')\n\n container.innerHTML = code\n\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT)\n const scripts: HTMLScriptElement[] = []\n\n while (walker.nextNode()) {\n if (walker.currentNode instanceof HTMLScriptElement) scripts.push(walker.currentNode)\n }\n\n scripts.forEach(inlineScript => {\n const executableScript = document.createElement(SCRIPT_TAG)\n\n executableScript.textContent = inlineScript.textContent\n Array.from(inlineScript.attributes).forEach(({ name, value }) => {\n executableScript.setAttribute(name, value)\n })\n\n inlineScript.parentNode?.replaceChild(executableScript, inlineScript)\n })\n\n const nodes = Array.from(container.childNodes)\n\n document.body.append(...nodes)\n\n return () => {\n nodes.forEach(node => {\n node.parentNode?.removeChild(node)\n })\n\n if (cleanup == null) return\n\n const cleanUp = new Function(cleanup)\n\n try {\n cleanUp()\n } catch {\n // Ignore errors from user input.\n }\n }\n }, [code, cleanup])\n\n return null\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAE1B,MAAM,aAAa;AAOZ,SAAS,YAAY,EAAE,MAAM,QAAQ,GAAgB;AAC1D,YAAU,MAAM;AACd,UAAM,YAAY,SAAS,cAAc,KAAK;AAE9C,cAAU,YAAY;AAEtB,UAAM,SAAS,SAAS,iBAAiB,WAAW,WAAW,YAAY;AAC3E,UAAM,UAA+B,CAAC;AAEtC,WAAO,OAAO,SAAS,GAAG;AACxB,UAAI,OAAO,uBAAuB;AAAmB,gBAAQ,KAAK,OAAO,WAAW;AAAA,IACtF;AAEA,YAAQ,QAAQ,kBAAgB;AAC9B,YAAM,mBAAmB,SAAS,cAAc,UAAU;AAE1D,uBAAiB,cAAc,aAAa;AAC5C,YAAM,KAAK,aAAa,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AAC/D,yBAAiB,aAAa,MAAM,KAAK;AAAA,MAC3C,CAAC;AAED,mBAAa,YAAY,aAAa,kBAAkB,YAAY;AAAA,IACtE,CAAC;AAED,UAAM,QAAQ,MAAM,KAAK,UAAU,UAAU;AAE7C,aAAS,KAAK,OAAO,GAAG,KAAK;AAE7B,WAAO,MAAM;AACX,YAAM,QAAQ,UAAQ;AACpB,aAAK,YAAY,YAAY,IAAI;AAAA,MACnC,CAAC;AAED,UAAI,WAAW;AAAM;AAErB,YAAM,UAAU,IAAI,SAAS,OAAO;AAEpC,UAAI;AACF,gBAAQ;AAAA,MACV,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/page/BodySnippet.tsx"],"sourcesContent":["import { useEffect } from 'react'\n\nconst SCRIPT_TAG = 'script'\n\ntype Props = {\n code: string\n cleanup: string | null | undefined\n}\n\nexport function BodySnippet({ code, cleanup }: Props): null {\n useEffect(() => {\n const container = document.createElement('div')\n\n container.innerHTML = code\n\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT)\n const scripts: HTMLScriptElement[] = []\n\n while (walker.nextNode()) {\n if (walker.currentNode instanceof HTMLScriptElement) scripts.push(walker.currentNode)\n }\n\n scripts.forEach(inlineScript => {\n const executableScript = document.createElement(SCRIPT_TAG)\n\n executableScript.textContent = inlineScript.textContent\n Array.from(inlineScript.attributes).forEach(({ name, value }) => {\n executableScript.setAttribute(name, value)\n })\n\n inlineScript.parentNode?.replaceChild(executableScript, inlineScript)\n })\n\n const nodes = Array.from(container.childNodes)\n\n document.body.append(...nodes)\n\n return () => {\n nodes.forEach(node => {\n node.parentNode?.removeChild(node)\n })\n\n if (cleanup == null) return\n\n try {\n const cleanUp = new Function(cleanup)\n cleanUp()\n } catch {\n // Ignore errors from user input.\n }\n }\n }, [code, cleanup])\n\n return null\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAE1B,MAAM,aAAa;AAOZ,SAAS,YAAY,EAAE,MAAM,QAAQ,GAAgB;AAC1D,YAAU,MAAM;AACd,UAAM,YAAY,SAAS,cAAc,KAAK;AAE9C,cAAU,YAAY;AAEtB,UAAM,SAAS,SAAS,iBAAiB,WAAW,WAAW,YAAY;AAC3E,UAAM,UAA+B,CAAC;AAEtC,WAAO,OAAO,SAAS,GAAG;AACxB,UAAI,OAAO,uBAAuB;AAAmB,gBAAQ,KAAK,OAAO,WAAW;AAAA,IACtF;AAEA,YAAQ,QAAQ,kBAAgB;AAC9B,YAAM,mBAAmB,SAAS,cAAc,UAAU;AAE1D,uBAAiB,cAAc,aAAa;AAC5C,YAAM,KAAK,aAAa,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AAC/D,yBAAiB,aAAa,MAAM,KAAK;AAAA,MAC3C,CAAC;AAED,mBAAa,YAAY,aAAa,kBAAkB,YAAY;AAAA,IACtE,CAAC;AAED,UAAM,QAAQ,MAAM,KAAK,UAAU,UAAU;AAE7C,aAAS,KAAK,OAAO,GAAG,KAAK;AAE7B,WAAO,MAAM;AACX,YAAM,QAAQ,UAAQ;AACpB,aAAK,YAAY,YAAY,IAAI;AAAA,MACnC,CAAC;AAED,UAAI,WAAW;AAAM;AAErB,UAAI;AACF,cAAM,UAAU,IAAI,SAAS,OAAO;AACpC,gBAAQ;AAAA,MACV,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,SAAO;AACT;","names":[]}
@@ -0,0 +1,100 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Children, createElement, useEffect, useRef } from "react";
3
+ import { useServerInsertedHTML } from "next/navigation";
4
+ import parse from "html-react-parser";
5
+ import Head from "next/head";
6
+ import { useIsPagesRouter } from "../../next/hooks/use-is-pages-router";
7
+ function HeadSnippet({ snippet }) {
8
+ const isPagesRouter = useIsPagesRouter();
9
+ useEffect(() => {
10
+ if (isPagesRouter) {
11
+ return () => {
12
+ const snippetElements2 = getSnippetElementsFromDOM(snippet);
13
+ if (snippetElements2.length > 0)
14
+ return;
15
+ cleanUpSnippet(snippet);
16
+ };
17
+ }
18
+ const snippetElements = getSnippetElementsFromDOM(snippet);
19
+ const isAlreadyInTheDOM = snippetElements.length > 0;
20
+ if (isAlreadyInTheDOM)
21
+ return;
22
+ return renderSnippetAndExecuteScripts(snippet, document.head);
23
+ }, [isPagesRouter, snippet]);
24
+ const headSnippetElement = snippetToElement(snippet);
25
+ const insertedServerHTML = useRef(false);
26
+ useServerInsertedHTML(() => {
27
+ if (isPagesRouter || insertedServerHTML.current)
28
+ return;
29
+ insertedServerHTML.current = true;
30
+ return headSnippetElement;
31
+ });
32
+ if (isPagesRouter) {
33
+ return /* @__PURE__ */ jsx(Head, { children: headSnippetElement });
34
+ }
35
+ return null;
36
+ }
37
+ const SNIPPET_ID_ATRIBUTE_NAME = "data-makeswift-snippet-id";
38
+ const VALID_HEAD_ELEMENT_TYPES = [
39
+ "title",
40
+ "base",
41
+ "link",
42
+ "style",
43
+ "meta",
44
+ "script",
45
+ "noscript",
46
+ "template"
47
+ ];
48
+ function snippetToElement(snippet) {
49
+ return Children.map(parse(snippet.code), (element) => {
50
+ if (typeof element === "string")
51
+ return element;
52
+ if (!VALID_HEAD_ELEMENT_TYPES.includes(element.type))
53
+ return null;
54
+ const key = element.key ? `${snippet.id}:${element.key}` : snippet.id;
55
+ return createElement(element.type, {
56
+ ...element.props,
57
+ key,
58
+ [SNIPPET_ID_ATRIBUTE_NAME]: snippet.id
59
+ });
60
+ });
61
+ }
62
+ function renderSnippetAndExecuteScripts(snippet, container) {
63
+ const virtualContainer = container.ownerDocument.createElement(container.tagName);
64
+ virtualContainer.innerHTML = snippet.code;
65
+ const elements = Array.from(virtualContainer.querySelectorAll("*"));
66
+ const scripts = elements.filter((el) => el instanceof HTMLScriptElement);
67
+ scripts.forEach((script) => {
68
+ const clone = script.ownerDocument.createElement(script.tagName);
69
+ clone.textContent = script.textContent;
70
+ Array.from(script.attributes).forEach(({ name, value }) => {
71
+ clone.setAttribute(name, value);
72
+ });
73
+ clone.setAttribute(SNIPPET_ID_ATRIBUTE_NAME, snippet.id);
74
+ script.parentNode?.replaceChild(clone, script);
75
+ });
76
+ const nodes = Array.from(virtualContainer.childNodes);
77
+ container.append(...nodes);
78
+ return () => {
79
+ nodes.forEach((node) => {
80
+ node.parentNode?.removeChild(node);
81
+ });
82
+ cleanUpSnippet(snippet);
83
+ };
84
+ }
85
+ function cleanUpSnippet(snippet) {
86
+ if (snippet.cleanup == null)
87
+ return;
88
+ try {
89
+ const cleanUp = new Function(snippet.cleanup);
90
+ cleanUp();
91
+ } catch {
92
+ }
93
+ }
94
+ function getSnippetElementsFromDOM(snippet) {
95
+ return document.head.querySelectorAll(`[${SNIPPET_ID_ATRIBUTE_NAME}="${snippet.id}"]`);
96
+ }
97
+ export {
98
+ HeadSnippet
99
+ };
100
+ //# sourceMappingURL=HeadSnippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/page/HeadSnippet.tsx"],"sourcesContent":["import { Children, createElement, useEffect, useRef } from 'react'\nimport { Snippet } from '../hooks/usePageSnippets'\nimport { useServerInsertedHTML } from 'next/navigation'\nimport parse from 'html-react-parser'\nimport Head from 'next/head'\nimport { useIsPagesRouter } from '../../next/hooks/use-is-pages-router'\n\ntype Props = {\n snippet: Snippet\n}\n\nexport function HeadSnippet({ snippet }: Props) {\n const isPagesRouter = useIsPagesRouter()\n\n useEffect(() => {\n if (isPagesRouter) {\n return () => {\n const snippetElements = getSnippetElementsFromDOM(snippet)\n if (snippetElements.length > 0) return\n cleanUpSnippet(snippet)\n }\n }\n\n const snippetElements = getSnippetElementsFromDOM(snippet)\n const isAlreadyInTheDOM = snippetElements.length > 0\n\n if (isAlreadyInTheDOM) return\n\n return renderSnippetAndExecuteScripts(snippet, document.head)\n }, [isPagesRouter, snippet])\n\n const headSnippetElement = snippetToElement(snippet)\n const insertedServerHTML = useRef(false)\n\n useServerInsertedHTML(() => {\n if (isPagesRouter || insertedServerHTML.current) return\n\n insertedServerHTML.current = true\n\n return headSnippetElement\n })\n\n if (isPagesRouter) {\n return <Head>{headSnippetElement}</Head>\n }\n\n return null\n}\n\nconst SNIPPET_ID_ATRIBUTE_NAME = 'data-makeswift-snippet-id'\n\nconst VALID_HEAD_ELEMENT_TYPES = [\n 'title',\n 'base',\n 'link',\n 'style',\n 'meta',\n 'script',\n 'noscript',\n 'template',\n]\n\nfunction snippetToElement(snippet: Pick<Snippet, 'id' | 'code'>): (string | JSX.Element)[] {\n return Children.map(parse(snippet.code), element => {\n if (typeof element === 'string') return element\n\n if (!VALID_HEAD_ELEMENT_TYPES.includes(element.type as string)) return null\n\n const key = element.key ? `${snippet.id}:${element.key}` : snippet.id\n\n return createElement(element.type, {\n ...element.props,\n key,\n [SNIPPET_ID_ATRIBUTE_NAME]: snippet.id,\n })\n })\n}\n\nfunction renderSnippetAndExecuteScripts(snippet: Snippet, container: HTMLElement): () => void {\n const virtualContainer = container.ownerDocument.createElement(container.tagName)\n\n virtualContainer.innerHTML = snippet.code\n\n const elements = Array.from(virtualContainer.querySelectorAll('*'))\n const scripts = elements.filter(el => el instanceof HTMLScriptElement)\n\n scripts.forEach(script => {\n const clone = script.ownerDocument.createElement(script.tagName)\n\n clone.textContent = script.textContent\n Array.from(script.attributes).forEach(({ name, value }) => {\n clone.setAttribute(name, value)\n })\n clone.setAttribute(SNIPPET_ID_ATRIBUTE_NAME, snippet.id)\n script.parentNode?.replaceChild(clone, script)\n })\n\n const nodes = Array.from(virtualContainer.childNodes)\n container.append(...nodes)\n\n return () => {\n nodes.forEach(node => {\n node.parentNode?.removeChild(node)\n })\n\n cleanUpSnippet(snippet)\n }\n}\n\nfunction cleanUpSnippet(snippet: Snippet): void {\n if (snippet.cleanup == null) return\n try {\n const cleanUp = new Function(snippet.cleanup)\n cleanUp()\n } catch {\n // Ignore errors from user input.\n }\n}\n\nfunction getSnippetElementsFromDOM(snippet: Snippet) {\n return document.head.querySelectorAll(`[${SNIPPET_ID_ATRIBUTE_NAME}=\"${snippet.id}\"]`)\n}\n"],"mappings":"AA2CW;AA3CX,SAAS,UAAU,eAAe,WAAW,cAAc;AAE3D,SAAS,6BAA6B;AACtC,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,SAAS,wBAAwB;AAM1B,SAAS,YAAY,EAAE,QAAQ,GAAU;AAC9C,QAAM,gBAAgB,iBAAiB;AAEvC,YAAU,MAAM;AACd,QAAI,eAAe;AACjB,aAAO,MAAM;AACX,cAAMA,mBAAkB,0BAA0B,OAAO;AACzD,YAAIA,iBAAgB,SAAS;AAAG;AAChC,uBAAe,OAAO;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,kBAAkB,0BAA0B,OAAO;AACzD,UAAM,oBAAoB,gBAAgB,SAAS;AAEnD,QAAI;AAAmB;AAEvB,WAAO,+BAA+B,SAAS,SAAS,IAAI;AAAA,EAC9D,GAAG,CAAC,eAAe,OAAO,CAAC;AAE3B,QAAM,qBAAqB,iBAAiB,OAAO;AACnD,QAAM,qBAAqB,OAAO,KAAK;AAEvC,wBAAsB,MAAM;AAC1B,QAAI,iBAAiB,mBAAmB;AAAS;AAEjD,uBAAmB,UAAU;AAE7B,WAAO;AAAA,EACT,CAAC;AAED,MAAI,eAAe;AACjB,WAAO,oBAAC,QAAM,8BAAmB;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,MAAM,2BAA2B;AAEjC,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,iBAAiB,SAAiE;AACzF,SAAO,SAAS,IAAI,MAAM,QAAQ,IAAI,GAAG,aAAW;AAClD,QAAI,OAAO,YAAY;AAAU,aAAO;AAExC,QAAI,CAAC,yBAAyB,SAAS,QAAQ,IAAc;AAAG,aAAO;AAEvE,UAAM,MAAM,QAAQ,MAAM,GAAG,QAAQ,EAAE,IAAI,QAAQ,GAAG,KAAK,QAAQ;AAEnE,WAAO,cAAc,QAAQ,MAAM;AAAA,MACjC,GAAG,QAAQ;AAAA,MACX;AAAA,MACA,CAAC,wBAAwB,GAAG,QAAQ;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,+BAA+B,SAAkB,WAAoC;AAC5F,QAAM,mBAAmB,UAAU,cAAc,cAAc,UAAU,OAAO;AAEhF,mBAAiB,YAAY,QAAQ;AAErC,QAAM,WAAW,MAAM,KAAK,iBAAiB,iBAAiB,GAAG,CAAC;AAClE,QAAM,UAAU,SAAS,OAAO,QAAM,cAAc,iBAAiB;AAErE,UAAQ,QAAQ,YAAU;AACxB,UAAM,QAAQ,OAAO,cAAc,cAAc,OAAO,OAAO;AAE/D,UAAM,cAAc,OAAO;AAC3B,UAAM,KAAK,OAAO,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AACzD,YAAM,aAAa,MAAM,KAAK;AAAA,IAChC,CAAC;AACD,UAAM,aAAa,0BAA0B,QAAQ,EAAE;AACvD,WAAO,YAAY,aAAa,OAAO,MAAM;AAAA,EAC/C,CAAC;AAED,QAAM,QAAQ,MAAM,KAAK,iBAAiB,UAAU;AACpD,YAAU,OAAO,GAAG,KAAK;AAEzB,SAAO,MAAM;AACX,UAAM,QAAQ,UAAQ;AACpB,WAAK,YAAY,YAAY,IAAI;AAAA,IACnC,CAAC;AAED,mBAAe,OAAO;AAAA,EACxB;AACF;AAEA,SAAS,eAAe,SAAwB;AAC9C,MAAI,QAAQ,WAAW;AAAM;AAC7B,MAAI;AACF,UAAM,UAAU,IAAI,SAAS,QAAQ,OAAO;AAC5C,YAAQ;AAAA,EACV,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,0BAA0B,SAAkB;AACnD,SAAO,SAAS,KAAK,iBAAiB,IAAI,wBAAwB,KAAK,QAAQ,EAAE,IAAI;AACvF;","names":["snippetElements"]}
@@ -1,181 +1,22 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { Children, createElement, useMemo, useEffect, useRef, useState } from "react";
4
- import { useSyncExternalStore } from "use-sync-external-store/shim";
5
- import parse from "html-react-parser";
6
- import Head from "next/head";
7
3
  import { BodySnippet } from "./BodySnippet";
8
4
  import { DocumentReference } from "../../runtimes/react";
9
5
  import { createDocumentReference } from "../../state/react-page";
10
- import { useMakeswiftClient } from "../../api/react";
11
- import { useIsInBuilder } from "../../react";
12
- import deepEqual from "../../utils/deepEqual";
13
- const SnippetLocation = {
14
- Body: "BODY",
15
- Head: "HEAD"
16
- };
17
- const defaultFavicon = {
18
- mimetype: "image/png",
19
- publicUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAACXBIWXMAABcRAAAXEQHKJvM/AAABjElEQVRYhc2XzU3EMBCFB8TddAAXn6EE6GCpgNABZ1/IXnymBOgAOmA7YM8+ABVsXEHQQFaKQryeN3Yk3ilKJtEnv/nLUd/3pFG0riGi88yrnQn+UfJ5FUi0riWiB2H4nQn+KRd0DFP8agXEfkqCYJBoHdtxIQxfm+DfFgEhoith3NYE30o/qgGR2BJB+xY7kdYEL8oNFUi0jiFMJuxVWrJqEMFxsyUNCsE6AeNztvBp7aJ143vXksoRnwhYtmNdSoIQa6RlO9YXEWW7KgoCleOgxgTf1QZBT+RZ2lXFING6UxCCq+ceeUE8fYdknY599v9sJvzGBP+yCEgC7GPmETc0OJ+0awAlkhe2pAbIXAeFZ8xe2g2Nk3c3ub0xwWt6zY9qbmiqGVMbZK21ZC/YmhlbeBMTzZNDQqcvDb1kM1x32iqZSt1HaqukfKvq34BAOTLsrH+ETNmUkKHHA+428RgeclPVWozeSyAI2EdWB34jtqXNTAySOY3i/KgFIlqOa4GkFmBegorzg4joG07he/M7zl6jAAAAAElFTkSuQmCC"
20
- };
21
- const VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_.\-\d]*$/;
22
- const VALID_HEAD_ELEMENT_TYPES = [
23
- "title",
24
- "base",
25
- "link",
26
- "style",
27
- "meta",
28
- "script",
29
- "noscript",
30
- "template"
31
- ];
32
- function snippetToElement(snippet) {
33
- return Children.map(parse(snippet.code), (element) => {
34
- if (typeof element === "string")
35
- return element;
36
- if (!VALID_TAG_REGEX.test(element.type))
37
- return null;
38
- const key = element.key ? `${snippet.id}:${element.key}` : snippet.id;
39
- return createElement(element.type, { ...element.props, key });
40
- });
41
- }
42
- const filterUsedSnippetProperties = ({
43
- code,
44
- builderEnabled,
45
- liveEnabled,
46
- location,
47
- cleanup
48
- }) => ({
49
- code,
50
- builderEnabled,
51
- liveEnabled,
52
- location,
53
- cleanup
54
- });
6
+ import { useRouterLocaleSync } from "../hooks/useRouterLocaleSync";
7
+ import { usePageSnippets } from "../hooks/usePageSnippets";
8
+ import { PageHead } from "./PageHead";
55
9
  function Page({ document: page }) {
56
- const isInBuilder = useIsInBuilder();
57
- const [snippets, setSnippets] = useState(page.snippets);
58
- const cachedPage = useCachedPage(isInBuilder ? page.id : null);
59
- useEffect(() => {
60
- if (cachedPage == null)
61
- return;
62
- const oldSnippets = snippets.map(filterUsedSnippetProperties);
63
- const newSnippets = cachedPage.snippets.map(filterUsedSnippetProperties);
64
- if (deepEqual(newSnippets, oldSnippets))
65
- return;
66
- setSnippets(cachedPage.snippets);
67
- }, [cachedPage]);
68
- const site = useCachedSite(isInBuilder ? page.site.id : null);
10
+ const { bodySnippets } = usePageSnippets({ page });
69
11
  const baseLocalizedPage = page.localizedPages.find(({ parentId }) => parentId == null);
70
- const favicon = page.meta.favicon ?? defaultFavicon;
71
- const title = baseLocalizedPage?.meta.title ?? page.meta.title;
72
- const description = baseLocalizedPage?.meta.description ?? page.meta.description;
73
- const keywords = baseLocalizedPage?.meta.keywords ?? page.meta.keywords;
74
- const socialImage = baseLocalizedPage?.meta.socialImage ?? page.meta.socialImage;
75
- const canonicalUrl = baseLocalizedPage?.seo.canonicalUrl ?? page.seo.canonicalUrl;
76
- const isIndexingBlocked = baseLocalizedPage?.seo.isIndexingBlocked ?? page.seo.isIndexingBlocked;
77
- const fontFamilyParamValue = useMemo(() => {
78
- if (site == null) {
79
- return page.fonts.map(({ family, variants }) => {
80
- return `${family.replace(/ /g, "+")}:${variants.join()}`;
81
- }).join("|");
82
- }
83
- return site.googleFonts.edges.filter((edge) => edge != null).map(({ activeVariants, node: { family, variants } }) => {
84
- const activeVariantSpecifiers = variants.filter(
85
- (variant) => activeVariants.some((activeVariant) => activeVariant.specifier === variant.specifier)
86
- ).map((variant) => variant.specifier).join();
87
- return `${family.replace(/ /g, "+")}:${activeVariantSpecifiers}`;
88
- }).join("|");
89
- }, [site, page]);
90
- const filteredSnippets = useMemo(
91
- () => snippets.filter((snippet) => isInBuilder ? snippet.builderEnabled : snippet.liveEnabled),
92
- [snippets, isInBuilder]
93
- );
94
- const headSnippets = useMemo(
95
- () => filteredSnippets.filter((snippet) => snippet.location === SnippetLocation.Head),
96
- [filteredSnippets]
97
- );
98
- const previousHeadSnippets = useRef(null);
99
- useEffect(() => {
100
- const headSnippetsToCleanUp = (previousHeadSnippets.current ?? []).filter((previousSnippet) => previousSnippet.cleanup != null).filter((previousSnippet) => !headSnippets.some((snippet) => previousSnippet.id === snippet.id));
101
- headSnippetsToCleanUp.forEach((snippetToCleanUp) => {
102
- if (snippetToCleanUp.cleanup == null)
103
- return;
104
- const cleanUp = new Function(snippetToCleanUp.cleanup);
105
- try {
106
- cleanUp();
107
- } catch {
108
- }
109
- });
110
- previousHeadSnippets.current = headSnippets;
111
- }, [headSnippets]);
112
12
  const documentId = baseLocalizedPage?.elementTreeId ?? page.id;
13
+ useRouterLocaleSync();
113
14
  return /* @__PURE__ */ jsxs(Fragment, { children: [
114
- /* @__PURE__ */ jsxs(Head, { children: [
115
- /* @__PURE__ */ jsx("style", { children: `
116
- html {
117
- font-family: sans-serif;
118
- }
119
- div#__next {
120
- overflow: hidden;
121
- }
122
- ` }),
123
- /* @__PURE__ */ jsx("link", { rel: "icon", type: favicon.mimetype, href: favicon.publicUrl }),
124
- canonicalUrl && /* @__PURE__ */ jsx("link", { rel: "canonical", href: canonicalUrl }),
125
- isIndexingBlocked && /* @__PURE__ */ jsx("meta", { name: "robots", content: "noindex" }),
126
- title && /* @__PURE__ */ jsxs(Fragment, { children: [
127
- /* @__PURE__ */ jsx("title", { children: title }),
128
- /* @__PURE__ */ jsx("meta", { property: "og:title", content: title }),
129
- /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: title }),
130
- /* @__PURE__ */ jsx("meta", { itemProp: "name", content: title })
131
- ] }),
132
- description && /* @__PURE__ */ jsxs(Fragment, { children: [
133
- /* @__PURE__ */ jsx("meta", { name: "description", content: description }),
134
- /* @__PURE__ */ jsx("meta", { property: "og:description", content: description }),
135
- /* @__PURE__ */ jsx("meta", { name: "twitter:description", content: description }),
136
- /* @__PURE__ */ jsx("meta", { itemProp: "description", content: description })
137
- ] }),
138
- keywords && /* @__PURE__ */ jsx("meta", { name: "keywords", content: keywords }),
139
- socialImage && /* @__PURE__ */ jsxs(Fragment, { children: [
140
- /* @__PURE__ */ jsx("meta", { property: "og:image", content: socialImage.publicUrl }),
141
- /* @__PURE__ */ jsx("meta", { property: "og:image:type", content: socialImage.mimetype }),
142
- /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: socialImage.publicUrl }),
143
- /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }),
144
- /* @__PURE__ */ jsx("meta", { itemProp: "image", content: socialImage.publicUrl })
145
- ] }),
146
- fontFamilyParamValue !== "" && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
147
- "link",
148
- {
149
- rel: "stylesheet",
150
- href: `https://fonts.googleapis.com/css?family=${fontFamilyParamValue}&display=swap`
151
- }
152
- ) }),
153
- headSnippets.map(snippetToElement).map(
154
- (children) => Children.map(children, (child) => {
155
- if (typeof child === "string")
156
- return child;
157
- if (VALID_HEAD_ELEMENT_TYPES.includes(child.type))
158
- return child;
159
- return null;
160
- })
161
- )
162
- ] }),
15
+ /* @__PURE__ */ jsx(PageHead, { document: page }),
163
16
  /* @__PURE__ */ jsx(DocumentReference, { documentReference: createDocumentReference(documentId) }),
164
- filteredSnippets.filter((snippet) => snippet.location === SnippetLocation.Body).map((snippet) => /* @__PURE__ */ jsx(BodySnippet, { code: snippet.code, cleanup: snippet.cleanup }, snippet.id))
17
+ bodySnippets.map((snippet) => /* @__PURE__ */ jsx(BodySnippet, { code: snippet.code, cleanup: snippet.cleanup }, snippet.id))
165
18
  ] });
166
19
  }
167
- function useCachedPage(pageId) {
168
- const client = useMakeswiftClient();
169
- const getSnapshot = () => pageId == null ? null : client.readPage(pageId);
170
- const page = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot);
171
- return page;
172
- }
173
- function useCachedSite(siteId) {
174
- const client = useMakeswiftClient();
175
- const getSnapshot = () => siteId == null ? null : client.readSite(siteId);
176
- const site = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot);
177
- return site;
178
- }
179
20
  export {
180
21
  Page
181
22
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/page/Page.tsx"],"sourcesContent":["'use client'\n\nimport { ReactElement, Children, createElement, useMemo, useEffect, useRef, useState } from 'react'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport parse from 'html-react-parser'\nimport Head from 'next/head'\n\nimport { BodySnippet } from './BodySnippet'\nimport { DocumentReference } from '../../runtimes/react'\nimport { createDocumentReference } from '../../state/react-page'\nimport { useMakeswiftClient } from '../../api/react'\nimport { useIsInBuilder } from '../../react'\nimport deepEqual from '../../utils/deepEqual'\nimport { MakeswiftPageDocument } from '../../next'\nimport { Page as PageType, Site } from '../../api'\n\nconst SnippetLocation = {\n Body: 'BODY',\n Head: 'HEAD',\n} as const\n\ntype SnippetLocation = typeof SnippetLocation[keyof typeof SnippetLocation]\n\ntype Snippet = {\n builderEnabled: boolean\n cleanup: string | null\n code: string\n id: string\n liveEnabled: boolean\n location: SnippetLocation\n}\n\nconst defaultFavicon = {\n mimetype: 'image/png',\n publicUrl:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAACXBIWXMAABcRAAAXEQHKJvM/AAABjElEQVRYhc2XzU3EMBCFB8TddAAXn6EE6GCpgNABZ1/IXnymBOgAOmA7YM8+ABVsXEHQQFaKQryeN3Yk3ilKJtEnv/nLUd/3pFG0riGi88yrnQn+UfJ5FUi0riWiB2H4nQn+KRd0DFP8agXEfkqCYJBoHdtxIQxfm+DfFgEhoith3NYE30o/qgGR2BJB+xY7kdYEL8oNFUi0jiFMJuxVWrJqEMFxsyUNCsE6AeNztvBp7aJ143vXksoRnwhYtmNdSoIQa6RlO9YXEWW7KgoCleOgxgTf1QZBT+RZ2lXFING6UxCCq+ceeUE8fYdknY599v9sJvzGBP+yCEgC7GPmETc0OJ+0awAlkhe2pAbIXAeFZ8xe2g2Nk3c3ub0xwWt6zY9qbmiqGVMbZK21ZC/YmhlbeBMTzZNDQqcvDb1kM1x32iqZSt1HaqukfKvq34BAOTLsrH+ETNmUkKHHA+428RgeclPVWozeSyAI2EdWB34jtqXNTAySOY3i/KgFIlqOa4GkFmBegorzg4joG07he/M7zl6jAAAAAElFTkSuQmCC',\n}\n\n// Taken from https://github.com/facebook/react/blob/14bac6193a334eda42e727336e8967419f08f5df/packages/react-dom/src/server/ReactPartialRenderer.js#L208\nconst VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_.\\-\\d]*$/\n\nconst VALID_HEAD_ELEMENT_TYPES = [\n 'title',\n 'base',\n 'link',\n 'style',\n 'meta',\n 'script',\n 'noscript',\n 'template',\n]\n\nfunction snippetToElement(snippet: Pick<Snippet, 'id' | 'code'>): (string | ReactElement)[] {\n return Children.map(parse(snippet.code), element => {\n if (typeof element === 'string') return element\n\n if (!VALID_TAG_REGEX.test(element.type)) return null\n\n const key = element.key ? `${snippet.id}:${element.key}` : snippet.id\n\n return createElement(element.type, { ...element.props, key })\n })\n}\n\nconst filterUsedSnippetProperties = ({\n code,\n builderEnabled,\n liveEnabled,\n location,\n cleanup,\n}: Snippet) => ({\n code,\n builderEnabled,\n liveEnabled,\n location,\n cleanup,\n})\n\ntype Props = {\n document: MakeswiftPageDocument\n}\n\nexport function Page({ document: page }: Props): JSX.Element {\n const isInBuilder = useIsInBuilder()\n const [snippets, setSnippets] = useState(page.snippets)\n // We're using cached results here for page snippets and site fonts so that anytime the user\n // changes the snippets or fonts on the builder, the change would be reflected here.\n // See this PR for discussions and things we can do to improve it in the future:\n // https://github.com/makeswift/makeswift/pull/77\n const cachedPage = useCachedPage(isInBuilder ? page.id : null)\n useEffect(() => {\n if (cachedPage == null) return\n\n const oldSnippets = snippets.map(filterUsedSnippetProperties)\n const newSnippets = cachedPage.snippets.map(filterUsedSnippetProperties)\n\n if (deepEqual(newSnippets, oldSnippets)) return\n\n setSnippets(cachedPage.snippets)\n }, [cachedPage])\n const site = useCachedSite(isInBuilder ? page.site.id : null)\n\n const baseLocalizedPage = page.localizedPages.find(({ parentId }) => parentId == null)\n const favicon = page.meta.favicon ?? defaultFavicon\n const title = baseLocalizedPage?.meta.title ?? page.meta.title\n const description = baseLocalizedPage?.meta.description ?? page.meta.description\n const keywords = baseLocalizedPage?.meta.keywords ?? page.meta.keywords\n const socialImage = baseLocalizedPage?.meta.socialImage ?? page.meta.socialImage\n const canonicalUrl = baseLocalizedPage?.seo.canonicalUrl ?? page.seo.canonicalUrl\n const isIndexingBlocked = baseLocalizedPage?.seo.isIndexingBlocked ?? page.seo.isIndexingBlocked\n\n const fontFamilyParamValue = useMemo(() => {\n if (site == null) {\n return page.fonts\n .map(({ family, variants }) => {\n return `${family.replace(/ /g, '+')}:${variants.join()}`\n })\n .join('|')\n }\n\n return site.googleFonts.edges\n .filter((edge): edge is NonNullable<typeof edge> => edge != null)\n .map(({ activeVariants, node: { family, variants } }) => {\n const activeVariantSpecifiers = variants\n .filter(variant =>\n activeVariants.some(activeVariant => activeVariant.specifier === variant.specifier),\n )\n .map(variant => variant.specifier)\n .join()\n\n return `${family.replace(/ /g, '+')}:${activeVariantSpecifiers}`\n })\n .join('|')\n }, [site, page])\n\n const filteredSnippets = useMemo(\n () => snippets.filter(snippet => (isInBuilder ? snippet.builderEnabled : snippet.liveEnabled)),\n [snippets, isInBuilder],\n )\n const headSnippets = useMemo(\n () => filteredSnippets.filter(snippet => snippet.location === SnippetLocation.Head),\n [filteredSnippets],\n )\n\n const previousHeadSnippets = useRef<MakeswiftPageDocument['snippets'] | null>(null)\n useEffect(() => {\n const headSnippetsToCleanUp = (previousHeadSnippets.current ?? [])\n .filter(previousSnippet => previousSnippet.cleanup != null)\n .filter(previousSnippet => !headSnippets.some(snippet => previousSnippet.id === snippet.id))\n\n headSnippetsToCleanUp.forEach(snippetToCleanUp => {\n if (snippetToCleanUp.cleanup == null) return\n\n const cleanUp = new Function(snippetToCleanUp.cleanup)\n\n try {\n cleanUp()\n } catch {\n // Ignore errors from user input.\n }\n })\n\n previousHeadSnippets.current = headSnippets\n }, [headSnippets])\n\n const documentId = baseLocalizedPage?.elementTreeId ?? page.id\n\n return (\n <>\n <Head>\n <style>\n {`\n html {\n font-family: sans-serif;\n }\n div#__next {\n overflow: hidden;\n }\n `}\n </style>\n\n <link rel=\"icon\" type={favicon.mimetype} href={favicon.publicUrl} />\n\n {canonicalUrl && <link rel=\"canonical\" href={canonicalUrl} />}\n\n {isIndexingBlocked && <meta name=\"robots\" content=\"noindex\" />}\n\n {title && (\n <>\n <title>{title}</title>\n <meta property=\"og:title\" content={title} />\n <meta name=\"twitter:title\" content={title} />\n <meta itemProp=\"name\" content={title} />\n </>\n )}\n\n {description && (\n <>\n <meta name=\"description\" content={description} />\n <meta property=\"og:description\" content={description} />\n <meta name=\"twitter:description\" content={description} />\n <meta itemProp=\"description\" content={description} />\n </>\n )}\n\n {keywords && <meta name=\"keywords\" content={keywords} />}\n\n {socialImage && (\n <>\n <meta property=\"og:image\" content={socialImage.publicUrl} />\n <meta property=\"og:image:type\" content={socialImage.mimetype} />\n <meta name=\"twitter:image\" content={socialImage.publicUrl} />\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta itemProp=\"image\" content={socialImage.publicUrl} />\n </>\n )}\n\n {fontFamilyParamValue !== '' && (\n <>\n <link\n rel=\"stylesheet\"\n href={`https://fonts.googleapis.com/css?family=${fontFamilyParamValue}&display=swap`}\n />\n </>\n )}\n\n {headSnippets.map(snippetToElement).map(children =>\n Children.map(children, child => {\n if (typeof child === 'string') return child\n\n if (VALID_HEAD_ELEMENT_TYPES.includes(child.type as string)) return child\n\n return null\n }),\n )}\n </Head>\n\n <DocumentReference documentReference={createDocumentReference(documentId)} />\n\n {filteredSnippets\n .filter(snippet => snippet.location === SnippetLocation.Body)\n .map(snippet => (\n <BodySnippet key={snippet.id} code={snippet.code} cleanup={snippet.cleanup} />\n ))}\n </>\n )\n}\n\nfunction useCachedPage(pageId: string | null): PageType | null {\n const client = useMakeswiftClient()\n const getSnapshot = () => (pageId == null ? null : client.readPage(pageId))\n\n const page = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot)\n\n return page\n}\n\nfunction useCachedSite(siteId: string | null): Site | null {\n const client = useMakeswiftClient()\n const getSnapshot = () => (siteId == null ? null : client.readSite(siteId))\n\n const site = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot)\n\n return site\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/page/Page.tsx"],"sourcesContent":["'use client'\n\nimport { BodySnippet } from './BodySnippet'\nimport { DocumentReference } from '../../runtimes/react'\nimport { createDocumentReference } from '../../state/react-page'\nimport { MakeswiftPageDocument } from '../../next'\nimport { useRouterLocaleSync } from '../hooks/useRouterLocaleSync'\nimport { usePageSnippets } from '../hooks/usePageSnippets'\nimport { PageHead } from './PageHead'\n\ntype Props = {\n document: MakeswiftPageDocument\n}\n\nexport function Page({ document: page }: Props): JSX.Element {\n const { bodySnippets } = usePageSnippets({ page })\n\n const baseLocalizedPage = page.localizedPages.find(({ parentId }) => parentId == null)\n const documentId = baseLocalizedPage?.elementTreeId ?? page.id\n\n useRouterLocaleSync()\n\n return (\n <>\n <PageHead document={page} />\n\n <DocumentReference documentReference={createDocumentReference(documentId)} />\n\n {bodySnippets.map(snippet => (\n <BodySnippet key={snippet.id} code={snippet.code} cleanup={snippet.cleanup} />\n ))}\n </>\n )\n}\n"],"mappings":";AAuBI,mBACE,KADF;AArBJ,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AAExC,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AAMlB,SAAS,KAAK,EAAE,UAAU,KAAK,GAAuB;AAC3D,QAAM,EAAE,aAAa,IAAI,gBAAgB,EAAE,KAAK,CAAC;AAEjD,QAAM,oBAAoB,KAAK,eAAe,KAAK,CAAC,EAAE,SAAS,MAAM,YAAY,IAAI;AACrF,QAAM,aAAa,mBAAmB,iBAAiB,KAAK;AAE5D,sBAAoB;AAEpB,SACE,iCACE;AAAA,wBAAC,YAAS,UAAU,MAAM;AAAA,IAE1B,oBAAC,qBAAkB,mBAAmB,wBAAwB,UAAU,GAAG;AAAA,IAE1E,aAAa,IAAI,aAChB,oBAAC,eAA6B,MAAM,QAAQ,MAAM,SAAS,QAAQ,WAAjD,QAAQ,EAAkD,CAC7E;AAAA,KACH;AAEJ;","names":[]}
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useMemo } from "react";
4
+ import { usePageSnippets } from "../hooks/usePageSnippets";
5
+ import { useIsInBuilder } from "../../react";
6
+ import { useMakeswiftHostApiClient } from "../../next/context/makeswift-host-api-client";
7
+ import { useSyncExternalStore } from "use-sync-external-store/shim";
8
+ import { PageTitle, PageMeta, PageLink, PageStyle } from "../../next/components/head-tags";
9
+ import { HeadSnippet } from "./HeadSnippet";
10
+ const defaultFavicon = {
11
+ id: "default-favicon",
12
+ mimetype: "image/png",
13
+ publicUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAACXBIWXMAABcRAAAXEQHKJvM/AAABjElEQVRYhc2XzU3EMBCFB8TddAAXn6EE6GCpgNABZ1/IXnymBOgAOmA7YM8+ABVsXEHQQFaKQryeN3Yk3ilKJtEnv/nLUd/3pFG0riGi88yrnQn+UfJ5FUi0riWiB2H4nQn+KRd0DFP8agXEfkqCYJBoHdtxIQxfm+DfFgEhoith3NYE30o/qgGR2BJB+xY7kdYEL8oNFUi0jiFMJuxVWrJqEMFxsyUNCsE6AeNztvBp7aJ143vXksoRnwhYtmNdSoIQa6RlO9YXEWW7KgoCleOgxgTf1QZBT+RZ2lXFING6UxCCq+ceeUE8fYdknY599v9sJvzGBP+yCEgC7GPmETc0OJ+0awAlkhe2pAbIXAeFZ8xe2g2Nk3c3ub0xwWt6zY9qbmiqGVMbZK21ZC/YmhlbeBMTzZNDQqcvDb1kM1x32iqZSt1HaqukfKvq34BAOTLsrH+ETNmUkKHHA+428RgeclPVWozeSyAI2EdWB34jtqXNTAySOY3i/KgFIlqOa4GkFmBegorzg4joG07he/M7zl6jAAAAAElFTkSuQmCC"
14
+ };
15
+ function PageHead({ document: page }) {
16
+ const { headSnippets } = usePageSnippets({ page });
17
+ const isInBuilder = useIsInBuilder();
18
+ const site = useCachedSite(isInBuilder ? page.site.id : null);
19
+ const baseLocalizedPage = page.localizedPages.find(({ parentId }) => parentId == null);
20
+ const favicon = page.meta.favicon ?? defaultFavicon;
21
+ const title = baseLocalizedPage?.meta.title ?? page.meta.title;
22
+ const description = baseLocalizedPage?.meta.description ?? page.meta.description;
23
+ const keywords = baseLocalizedPage?.meta.keywords ?? page.meta.keywords;
24
+ const socialImage = baseLocalizedPage?.meta.socialImage ?? page.meta.socialImage;
25
+ const canonicalUrl = baseLocalizedPage?.seo.canonicalUrl ?? page.seo.canonicalUrl;
26
+ const isIndexingBlocked = baseLocalizedPage?.seo.isIndexingBlocked ?? page.seo.isIndexingBlocked;
27
+ const fontFamilyParamValue = useMemo(() => {
28
+ if (site == null) {
29
+ return page.fonts.map(({ family, variants }) => {
30
+ return `${family.replace(/ /g, "+")}:${variants.join()}`;
31
+ }).join("|");
32
+ }
33
+ return site.googleFonts.edges.filter((edge) => edge != null).map(({ activeVariants, node: { family, variants } }) => {
34
+ const activeVariantSpecifiers = variants.filter(
35
+ (variant) => activeVariants.some((activeVariant) => activeVariant.specifier === variant.specifier)
36
+ ).map((variant) => variant.specifier).join();
37
+ return `${family.replace(/ /g, "+")}:${activeVariantSpecifiers}`;
38
+ }).join("|");
39
+ }, [site, page]);
40
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
41
+ /* @__PURE__ */ jsx(PageStyle, { precedence: "high", href: "makeswift-base-styles", children: `
42
+ html {
43
+ font-family: sans-serif;
44
+ }
45
+ div#__next {
46
+ overflow: hidden;
47
+ }
48
+ ` }),
49
+ title && /* @__PURE__ */ jsx(PageTitle, { children: title }),
50
+ favicon && /* @__PURE__ */ jsx(PageLink, { rel: "icon", type: favicon.mimetype, href: favicon.publicUrl }),
51
+ canonicalUrl && /* @__PURE__ */ jsx(PageLink, { rel: "canonical", href: canonicalUrl }),
52
+ isIndexingBlocked && /* @__PURE__ */ jsx(PageMeta, { name: "robots", content: "noindex" }),
53
+ description && /* @__PURE__ */ jsxs(Fragment, { children: [
54
+ /* @__PURE__ */ jsx(PageMeta, { name: "description", content: description }),
55
+ /* @__PURE__ */ jsx(PageMeta, { property: "og:description", content: description }),
56
+ /* @__PURE__ */ jsx(PageMeta, { name: "twitter:description", content: description })
57
+ ] }),
58
+ keywords && /* @__PURE__ */ jsx(PageMeta, { name: "keywords", content: keywords }),
59
+ socialImage && /* @__PURE__ */ jsxs(Fragment, { children: [
60
+ /* @__PURE__ */ jsx(PageMeta, { property: "og:image", content: socialImage.publicUrl }),
61
+ /* @__PURE__ */ jsx(PageMeta, { property: "og:image:type", content: socialImage.mimetype }),
62
+ /* @__PURE__ */ jsx(PageMeta, { name: "twitter:image", content: socialImage.publicUrl }),
63
+ /* @__PURE__ */ jsx(PageMeta, { name: "twitter:card", content: "summary_large_image" })
64
+ ] }),
65
+ fontFamilyParamValue !== "" && /* @__PURE__ */ jsx(
66
+ PageLink,
67
+ {
68
+ precedence: "medium",
69
+ rel: "stylesheet",
70
+ href: `https://fonts.googleapis.com/css?family=${fontFamilyParamValue}&display=swap`
71
+ }
72
+ ),
73
+ headSnippets.map((snippet) => /* @__PURE__ */ jsx(HeadSnippet, { snippet }, snippet.id))
74
+ ] });
75
+ }
76
+ function useCachedSite(siteId) {
77
+ const client = useMakeswiftHostApiClient();
78
+ const getSnapshot = () => siteId == null ? null : client.readSite(siteId);
79
+ const site = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot);
80
+ return site;
81
+ }
82
+ export {
83
+ PageHead
84
+ };
85
+ //# sourceMappingURL=PageHead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/page/PageHead.tsx"],"sourcesContent":["'use client'\n\nimport { useMemo } from 'react'\nimport { MakeswiftPageDocument } from '../../next'\nimport { usePageSnippets } from '../hooks/usePageSnippets'\nimport { useIsInBuilder } from '../../react'\nimport { useMakeswiftHostApiClient } from '../../next/context/makeswift-host-api-client'\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\nimport { Site } from '../../api'\nimport { PageTitle, PageMeta, PageLink, PageStyle } from '../../next/components/head-tags'\nimport { HeadSnippet } from './HeadSnippet'\n\nconst defaultFavicon = {\n id: 'default-favicon',\n mimetype: 'image/png',\n publicUrl:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAACXBIWXMAABcRAAAXEQHKJvM/AAABjElEQVRYhc2XzU3EMBCFB8TddAAXn6EE6GCpgNABZ1/IXnymBOgAOmA7YM8+ABVsXEHQQFaKQryeN3Yk3ilKJtEnv/nLUd/3pFG0riGi88yrnQn+UfJ5FUi0riWiB2H4nQn+KRd0DFP8agXEfkqCYJBoHdtxIQxfm+DfFgEhoith3NYE30o/qgGR2BJB+xY7kdYEL8oNFUi0jiFMJuxVWrJqEMFxsyUNCsE6AeNztvBp7aJ143vXksoRnwhYtmNdSoIQa6RlO9YXEWW7KgoCleOgxgTf1QZBT+RZ2lXFING6UxCCq+ceeUE8fYdknY599v9sJvzGBP+yCEgC7GPmETc0OJ+0awAlkhe2pAbIXAeFZ8xe2g2Nk3c3ub0xwWt6zY9qbmiqGVMbZK21ZC/YmhlbeBMTzZNDQqcvDb1kM1x32iqZSt1HaqukfKvq34BAOTLsrH+ETNmUkKHHA+428RgeclPVWozeSyAI2EdWB34jtqXNTAySOY3i/KgFIlqOa4GkFmBegorzg4joG07he/M7zl6jAAAAAElFTkSuQmCC',\n}\n\ntype Props = {\n document: MakeswiftPageDocument\n}\n\nexport function PageHead({ document: page }: Props): JSX.Element {\n const { headSnippets } = usePageSnippets({ page })\n\n const isInBuilder = useIsInBuilder()\n\n const site = useCachedSite(isInBuilder ? page.site.id : null)\n const baseLocalizedPage = page.localizedPages.find(({ parentId }) => parentId == null)\n\n const favicon = page.meta.favicon ?? defaultFavicon\n const title = baseLocalizedPage?.meta.title ?? page.meta.title\n const description = baseLocalizedPage?.meta.description ?? page.meta.description\n const keywords = baseLocalizedPage?.meta.keywords ?? page.meta.keywords\n const socialImage = baseLocalizedPage?.meta.socialImage ?? page.meta.socialImage\n const canonicalUrl = baseLocalizedPage?.seo.canonicalUrl ?? page.seo.canonicalUrl\n const isIndexingBlocked = baseLocalizedPage?.seo.isIndexingBlocked ?? page.seo.isIndexingBlocked\n\n const fontFamilyParamValue = useMemo(() => {\n if (site == null) {\n return page.fonts\n .map(({ family, variants }) => {\n return `${family.replace(/ /g, '+')}:${variants.join()}`\n })\n .join('|')\n }\n\n return site.googleFonts.edges\n .filter((edge): edge is NonNullable<typeof edge> => edge != null)\n .map(({ activeVariants, node: { family, variants } }) => {\n const activeVariantSpecifiers = variants\n .filter(variant =>\n activeVariants.some(activeVariant => activeVariant.specifier === variant.specifier),\n )\n .map(variant => variant.specifier)\n .join()\n\n return `${family.replace(/ /g, '+')}:${activeVariantSpecifiers}`\n })\n .join('|')\n }, [site, page])\n\n return (\n <>\n <PageStyle precedence=\"high\" href=\"makeswift-base-styles\">\n {`\n html {\n font-family: sans-serif;\n }\n div#__next {\n overflow: hidden;\n }\n `}\n </PageStyle>\n {title && <PageTitle>{title}</PageTitle>}\n {favicon && <PageLink rel=\"icon\" type={favicon.mimetype} href={favicon.publicUrl} />}\n {canonicalUrl && <PageLink rel=\"canonical\" href={canonicalUrl} />}\n {isIndexingBlocked && <PageMeta name=\"robots\" content=\"noindex\" />}\n {description && (\n <>\n <PageMeta name=\"description\" content={description} />\n <PageMeta property=\"og:description\" content={description} />\n <PageMeta name=\"twitter:description\" content={description} />\n </>\n )}\n {keywords && <PageMeta name=\"keywords\" content={keywords} />}\n {socialImage && (\n <>\n <PageMeta property=\"og:image\" content={socialImage.publicUrl} />\n <PageMeta property=\"og:image:type\" content={socialImage.mimetype} />\n <PageMeta name=\"twitter:image\" content={socialImage.publicUrl} />\n <PageMeta name=\"twitter:card\" content=\"summary_large_image\" />\n </>\n )}\n {fontFamilyParamValue !== '' && (\n <PageLink\n precedence=\"medium\"\n rel=\"stylesheet\"\n href={`https://fonts.googleapis.com/css?family=${fontFamilyParamValue}&display=swap`}\n />\n )}\n {headSnippets.map(snippet => (\n <HeadSnippet key={snippet.id} snippet={snippet} />\n ))}\n </>\n )\n}\n\nfunction useCachedSite(siteId: string | null): Site | null {\n const client = useMakeswiftHostApiClient()\n const getSnapshot = () => (siteId == null ? null : client.readSite(siteId))\n\n const site = useSyncExternalStore(client.subscribe, getSnapshot, getSnapshot)\n\n return site\n}\n"],"mappings":"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","names":[]}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import { cx } from "@emotion/css";
3
4
  import {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components/shared/BackgroundsContainer/index.tsx"],"sourcesContent":["import { cx } from '@emotion/css'\nimport {\n Children,\n ComponentPropsWithoutRef,\n ElementType,\n forwardRef,\n ReactElement,\n Ref,\n} from 'react'\nimport { BackgroundsValue as BackgroundsPropControllerValue } from '../../../prop-controllers/descriptors'\nimport { useStyle } from '../../../runtimes/react/use-style'\nimport { useBackgrounds } from '../../hooks'\nimport Backgrounds from './components/Backgrounds'\n\ntype BaseProps = {\n backgrounds: BackgroundsPropControllerValue | null | undefined\n children: ReactElement<ElementType>\n}\n\ntype Props = BaseProps & Omit<ComponentPropsWithoutRef<'div'>, keyof BaseProps>\n\nexport default forwardRef<HTMLDivElement | null, Props>(function BackgroundsContainer(\n { backgrounds, children, className, ...restOfProps }: Props,\n ref: Ref<HTMLDivElement>,\n) {\n return (\n <div\n {...restOfProps}\n ref={ref}\n className={cx(\n useStyle({\n position: 'relative',\n width: '100%',\n margin: '0 auto',\n '> *': {\n borderRadius: 'inherit',\n height: 'inherit',\n },\n '> :last-child': {\n position: 'relative',\n },\n }),\n className,\n )}\n >\n <Backgrounds backgrounds={useBackgrounds(backgrounds)} />\n {Children.only(children)}\n </div>\n )\n})\n"],"mappings":"AA0BI,SAmBE,KAnBF;AA1BJ,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EAGA;AAAA,OAGK;AAEP,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,OAAO,iBAAiB;AASxB,IAAO,+BAAQ,WAAyC,SAAS,qBAC/D,EAAE,aAAa,UAAU,WAAW,GAAG,YAAY,GACnD,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO;AAAA,YACL,cAAc;AAAA,YACd,QAAQ;AAAA,UACV;AAAA,UACA,iBAAiB;AAAA,YACf,UAAU;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA;AAAA,4BAAC,eAAY,aAAa,eAAe,WAAW,GAAG;AAAA,QACtD,SAAS,KAAK,QAAQ;AAAA;AAAA;AAAA,EACzB;AAEJ,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components/shared/BackgroundsContainer/index.tsx"],"sourcesContent":["'use client'\n\nimport { cx } from '@emotion/css'\nimport {\n Children,\n ComponentPropsWithoutRef,\n ElementType,\n forwardRef,\n ReactElement,\n Ref,\n} from 'react'\nimport { BackgroundsValue as BackgroundsPropControllerValue } from '../../../prop-controllers/descriptors'\nimport { useStyle } from '../../../runtimes/react/use-style'\nimport { useBackgrounds } from '../../hooks'\nimport Backgrounds from './components/Backgrounds'\n\ntype BaseProps = {\n backgrounds: BackgroundsPropControllerValue | null | undefined\n children: ReactElement<ElementType>\n}\n\ntype Props = BaseProps & Omit<ComponentPropsWithoutRef<'div'>, keyof BaseProps>\n\nexport default forwardRef<HTMLDivElement | null, Props>(function BackgroundsContainer(\n { backgrounds, children, className, ...restOfProps }: Props,\n ref: Ref<HTMLDivElement>,\n) {\n return (\n <div\n {...restOfProps}\n ref={ref}\n className={cx(\n useStyle({\n position: 'relative',\n width: '100%',\n margin: '0 auto',\n '> *': {\n borderRadius: 'inherit',\n height: 'inherit',\n },\n '> :last-child': {\n position: 'relative',\n },\n }),\n className,\n )}\n >\n <Backgrounds backgrounds={useBackgrounds(backgrounds)} />\n {Children.only(children)}\n </div>\n )\n})\n"],"mappings":";AA4BI,SAmBE,KAnBF;AA1BJ,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EAGA;AAAA,OAGK;AAEP,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,OAAO,iBAAiB;AASxB,IAAO,+BAAQ,WAAyC,SAAS,qBAC/D,EAAE,aAAa,UAAU,WAAW,GAAG,YAAY,GACnD,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACT,SAAS;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO;AAAA,YACL,cAAc;AAAA,YACd,QAAQ;AAAA,UACV;AAAA,UACA,iBAAiB;AAAA,YACf,UAAU;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA;AAAA,4BAAC,eAAY,aAAa,eAAe,WAAW,GAAG;AAAA,QACtD,SAAS,KAAK,QAAQ;AAAA;AAAA;AAAA,EACzB;AAEJ,CAAC;","names":[]}
@@ -8,6 +8,7 @@ const Link = forwardRef(function Link2({ link, onClick = () => {
8
8
  }, ...restOfProps }, ref) {
9
9
  const pageId = link && link.type === "OPEN_PAGE" ? link.payload.pageId : null;
10
10
  const page = usePagePathnameSlice(pageId ?? null);
11
+ const hasLocalizedPathname = page?.localizedPathname != null;
11
12
  const elementKey = link?.type === "SCROLL_TO_ELEMENT" ? link.payload.elementIdConfig?.elementKey : null;
12
13
  const elementId = useElementId(elementKey);
13
14
  let useNextLink;
@@ -19,7 +20,7 @@ const Link = forwardRef(function Link2({ link, onClick = () => {
19
20
  case "OPEN_PAGE": {
20
21
  if (page) {
21
22
  useNextLink = true;
22
- href = `/${page.pathname}`;
23
+ href = `/${page.localizedPathname ?? page.pathname}`;
23
24
  }
24
25
  target = link.payload.openInNewTab ? "_blank" : "_self";
25
26
  break;
@@ -87,6 +88,9 @@ const Link = forwardRef(function Link2({ link, onClick = () => {
87
88
  target,
88
89
  onClick: handleClick,
89
90
  href,
91
+ ...hasLocalizedPathname && {
92
+ locale: false
93
+ },
90
94
  legacyBehavior: false
91
95
  }
92
96
  );