@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.
- package/dist/cjs/api/react.js +3 -17
- package/dist/cjs/api/react.js.map +1 -1
- package/dist/cjs/api/resource-types.js +24 -0
- package/dist/cjs/api/resource-types.js.map +1 -0
- package/dist/cjs/components/builtin/Box/Box.js +1 -0
- package/dist/cjs/components/builtin/Box/Box.js.map +1 -1
- package/dist/cjs/components/builtin/Box/animations.js +1 -0
- package/dist/cjs/components/builtin/Box/animations.js.map +1 -1
- package/dist/cjs/components/builtin/Box/register.js +2 -3
- package/dist/cjs/components/builtin/Box/register.js.map +1 -1
- package/dist/cjs/components/builtin/Button/register.js +2 -3
- package/dist/cjs/components/builtin/Button/register.js.map +1 -1
- package/dist/cjs/components/builtin/Carousel/Carousel.js +1 -0
- package/dist/cjs/components/builtin/Carousel/Carousel.js.map +1 -1
- package/dist/cjs/components/builtin/Carousel/register.js +2 -3
- package/dist/cjs/components/builtin/Carousel/register.js.map +1 -1
- package/dist/cjs/components/builtin/Countdown/Countdown.js +1 -0
- package/dist/cjs/components/builtin/Countdown/Countdown.js.map +1 -1
- package/dist/cjs/components/builtin/Countdown/register.js +2 -3
- package/dist/cjs/components/builtin/Countdown/register.js.map +1 -1
- package/dist/cjs/components/builtin/Divider/register.js +2 -3
- package/dist/cjs/components/builtin/Divider/register.js.map +1 -1
- package/dist/cjs/components/builtin/Embed/Embed.js +1 -0
- package/dist/cjs/components/builtin/Embed/Embed.js.map +1 -1
- package/dist/cjs/components/builtin/Embed/register.js +2 -3
- package/dist/cjs/components/builtin/Embed/register.js.map +1 -1
- package/dist/cjs/components/builtin/Form/Form.js +3 -2
- package/dist/cjs/components/builtin/Form/Form.js.map +1 -1
- package/dist/cjs/components/builtin/Form/context/FormContext.js +1 -0
- package/dist/cjs/components/builtin/Form/context/FormContext.js.map +1 -1
- package/dist/cjs/components/builtin/Form/register.js +2 -3
- package/dist/cjs/components/builtin/Form/register.js.map +1 -1
- package/dist/cjs/components/builtin/Image/Image.js +1 -0
- package/dist/cjs/components/builtin/Image/Image.js.map +1 -1
- package/dist/cjs/components/builtin/Image/register.js +2 -3
- package/dist/cjs/components/builtin/Image/register.js.map +1 -1
- package/dist/cjs/components/builtin/Navigation/Navigation.js +1 -0
- package/dist/cjs/components/builtin/Navigation/Navigation.js.map +1 -1
- package/dist/cjs/components/builtin/Navigation/register.js +2 -3
- package/dist/cjs/components/builtin/Navigation/register.js.map +1 -1
- package/dist/cjs/components/builtin/Root/register.js +2 -3
- package/dist/cjs/components/builtin/Root/register.js.map +1 -1
- package/dist/cjs/components/builtin/SocialLinks/register.js +2 -3
- package/dist/cjs/components/builtin/SocialLinks/register.js.map +1 -1
- package/dist/cjs/components/builtin/Text/register.js +2 -3
- package/dist/cjs/components/builtin/Text/register.js.map +1 -1
- package/dist/cjs/components/builtin/Video/Video.js +1 -0
- package/dist/cjs/components/builtin/Video/Video.js.map +1 -1
- package/dist/cjs/components/builtin/Video/register.js +2 -3
- package/dist/cjs/components/builtin/Video/register.js.map +1 -1
- package/dist/cjs/components/hooks/usePageSnippets.js +93 -0
- package/dist/cjs/components/hooks/usePageSnippets.js.map +1 -0
- package/dist/cjs/components/hooks/useRouterLocaleSync.js +49 -0
- package/dist/cjs/components/hooks/useRouterLocaleSync.js.map +1 -0
- package/dist/cjs/components/page/BodySnippet.js +1 -1
- package/dist/cjs/components/page/BodySnippet.js.map +1 -1
- package/dist/cjs/components/page/HeadSnippet.js +134 -0
- package/dist/cjs/components/page/HeadSnippet.js.map +1 -0
- package/dist/cjs/components/page/Page.js +9 -178
- package/dist/cjs/components/page/Page.js.map +1 -1
- package/dist/cjs/components/page/PageHead.js +109 -0
- package/dist/cjs/components/page/PageHead.js.map +1 -0
- package/dist/cjs/components/shared/BackgroundsContainer/index.js +1 -0
- package/dist/cjs/components/shared/BackgroundsContainer/index.js.map +1 -1
- package/dist/cjs/components/shared/Link/index.js +5 -1
- package/dist/cjs/components/shared/Link/index.js.map +1 -1
- package/dist/cjs/index.js +0 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/element-tree.js +17 -8
- package/dist/cjs/next/api-handler/handlers/element-tree.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/fonts.js +7 -2
- package/dist/cjs/next/api-handler/handlers/fonts.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/manifest.js +20 -8
- package/dist/cjs/next/api-handler/handlers/manifest.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/merge-translated-data.js +17 -6
- package/dist/cjs/next/api-handler/handlers/merge-translated-data.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/proxy-draft-mode.js +69 -0
- package/dist/cjs/next/api-handler/handlers/proxy-draft-mode.js.map +1 -0
- package/dist/cjs/next/api-handler/handlers/proxy-preview-mode.js +55 -44
- package/dist/cjs/next/api-handler/handlers/proxy-preview-mode.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/revalidate.js +27 -16
- package/dist/cjs/next/api-handler/handlers/revalidate.js.map +1 -1
- package/dist/cjs/next/api-handler/handlers/translatable-data.js +16 -5
- package/dist/cjs/next/api-handler/handlers/translatable-data.js.map +1 -1
- package/dist/cjs/next/api-handler/index.js +68 -34
- package/dist/cjs/next/api-handler/index.js.map +1 -1
- package/dist/cjs/next/client.js +3 -2
- package/dist/cjs/next/client.js.map +1 -1
- package/dist/cjs/next/components/head-tags.js +77 -0
- package/dist/cjs/next/components/head-tags.js.map +1 -0
- package/dist/cjs/next/components/page.js +56 -0
- package/dist/cjs/next/components/page.js.map +1 -0
- package/dist/cjs/next/context/makeswift-host-api-client.js +46 -0
- package/dist/cjs/next/context/makeswift-host-api-client.js.map +1 -0
- package/dist/cjs/next/context/react-runtime.js +44 -0
- package/dist/cjs/next/context/react-runtime.js.map +1 -0
- package/dist/cjs/next/draft-mode/draft-mode-script.js +123 -0
- package/dist/cjs/next/draft-mode/draft-mode-script.js.map +1 -0
- package/dist/cjs/next/draft-mode/index.js +56 -0
- package/dist/cjs/next/draft-mode/index.js.map +1 -0
- package/dist/cjs/next/hooks/use-is-pages-router.js +37 -0
- package/dist/cjs/next/hooks/use-is-pages-router.js.map +1 -0
- package/dist/cjs/next/index.js +10 -36
- package/dist/cjs/next/index.js.map +1 -1
- package/dist/cjs/next/preview-mode.js +4 -2
- package/dist/cjs/next/preview-mode.js.map +1 -1
- package/dist/cjs/next/root-style-registry.js +90 -0
- package/dist/cjs/next/root-style-registry.js.map +1 -0
- package/dist/cjs/next/server.js +8 -2
- package/dist/cjs/next/server.js.map +1 -1
- package/dist/cjs/runtimes/react/components/Element.js +1 -0
- package/dist/cjs/runtimes/react/components/Element.js.map +1 -1
- package/dist/cjs/runtimes/react/components/LiveProvider.js +6 -13
- package/dist/cjs/runtimes/react/components/LiveProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/components/PreviewProvider.js +6 -8
- package/dist/cjs/runtimes/react/components/PreviewProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/components/RuntimeProvider.js +3 -3
- package/dist/cjs/runtimes/react/components/RuntimeProvider.js.map +1 -1
- package/dist/cjs/runtimes/react/controls/link.js +1 -1
- package/dist/cjs/runtimes/react/controls/link.js.map +1 -1
- package/dist/cjs/runtimes/react/controls/rich-text/rich-text.js +2 -4
- package/dist/cjs/runtimes/react/controls/rich-text/rich-text.js.map +1 -1
- package/dist/cjs/runtimes/react/controls/rich-text-v2/rich-text-v2.js +4 -11
- package/dist/cjs/runtimes/react/controls/rich-text-v2/rich-text-v2.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/makeswift-api.js +11 -10
- package/dist/cjs/runtimes/react/hooks/makeswift-api.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-document-key.js +1 -0
- package/dist/cjs/runtimes/react/hooks/use-document-key.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-page-id.js +1 -0
- package/dist/cjs/runtimes/react/hooks/use-page-id.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/use-store.js +1 -0
- package/dist/cjs/runtimes/react/hooks/use-store.js.map +1 -1
- package/dist/cjs/runtimes/react/use-global-style.js +15 -10
- package/dist/cjs/runtimes/react/use-global-style.js.map +1 -1
- package/dist/cjs/runtimes/react/use-style.js +7 -6
- package/dist/cjs/runtimes/react/use-style.js.map +1 -1
- package/dist/cjs/state/actions.js +0 -25
- package/dist/cjs/state/actions.js.map +1 -1
- package/dist/cjs/state/react-builder-preview.js +1 -24
- package/dist/cjs/state/react-builder-preview.js.map +1 -1
- package/dist/esm/api/react.js +2 -14
- package/dist/esm/api/react.js.map +1 -1
- package/dist/esm/api/resource-types.js +8 -0
- package/dist/esm/api/resource-types.js.map +1 -0
- package/dist/esm/components/builtin/Box/Box.js +1 -0
- package/dist/esm/components/builtin/Box/Box.js.map +1 -1
- package/dist/esm/components/builtin/Box/animations.js +1 -0
- package/dist/esm/components/builtin/Box/animations.js.map +1 -1
- package/dist/esm/components/builtin/Box/register.js +2 -3
- package/dist/esm/components/builtin/Box/register.js.map +1 -1
- package/dist/esm/components/builtin/Button/register.js +2 -3
- package/dist/esm/components/builtin/Button/register.js.map +1 -1
- package/dist/esm/components/builtin/Carousel/Carousel.js +1 -0
- package/dist/esm/components/builtin/Carousel/Carousel.js.map +1 -1
- package/dist/esm/components/builtin/Carousel/register.js +2 -3
- package/dist/esm/components/builtin/Carousel/register.js.map +1 -1
- package/dist/esm/components/builtin/Countdown/Countdown.js +1 -0
- package/dist/esm/components/builtin/Countdown/Countdown.js.map +1 -1
- package/dist/esm/components/builtin/Countdown/register.js +2 -3
- package/dist/esm/components/builtin/Countdown/register.js.map +1 -1
- package/dist/esm/components/builtin/Divider/register.js +2 -3
- package/dist/esm/components/builtin/Divider/register.js.map +1 -1
- package/dist/esm/components/builtin/Embed/Embed.js +1 -0
- package/dist/esm/components/builtin/Embed/Embed.js.map +1 -1
- package/dist/esm/components/builtin/Embed/register.js +2 -3
- package/dist/esm/components/builtin/Embed/register.js.map +1 -1
- package/dist/esm/components/builtin/Form/Form.js +3 -2
- package/dist/esm/components/builtin/Form/Form.js.map +1 -1
- package/dist/esm/components/builtin/Form/context/FormContext.js +1 -0
- package/dist/esm/components/builtin/Form/context/FormContext.js.map +1 -1
- package/dist/esm/components/builtin/Form/register.js +2 -3
- package/dist/esm/components/builtin/Form/register.js.map +1 -1
- package/dist/esm/components/builtin/Image/Image.js +1 -0
- package/dist/esm/components/builtin/Image/Image.js.map +1 -1
- package/dist/esm/components/builtin/Image/register.js +2 -3
- package/dist/esm/components/builtin/Image/register.js.map +1 -1
- package/dist/esm/components/builtin/Navigation/Navigation.js +1 -0
- package/dist/esm/components/builtin/Navigation/Navigation.js.map +1 -1
- package/dist/esm/components/builtin/Navigation/register.js +2 -3
- package/dist/esm/components/builtin/Navigation/register.js.map +1 -1
- package/dist/esm/components/builtin/Root/register.js +2 -3
- package/dist/esm/components/builtin/Root/register.js.map +1 -1
- package/dist/esm/components/builtin/SocialLinks/register.js +2 -3
- package/dist/esm/components/builtin/SocialLinks/register.js.map +1 -1
- package/dist/esm/components/builtin/Text/register.js +2 -3
- package/dist/esm/components/builtin/Text/register.js.map +1 -1
- package/dist/esm/components/builtin/Video/Video.js +1 -0
- package/dist/esm/components/builtin/Video/Video.js.map +1 -1
- package/dist/esm/components/builtin/Video/register.js +2 -3
- package/dist/esm/components/builtin/Video/register.js.map +1 -1
- package/dist/esm/components/hooks/usePageSnippets.js +59 -0
- package/dist/esm/components/hooks/usePageSnippets.js.map +1 -0
- package/dist/esm/components/hooks/useRouterLocaleSync.js +25 -0
- package/dist/esm/components/hooks/useRouterLocaleSync.js.map +1 -0
- package/dist/esm/components/page/BodySnippet.js +1 -1
- package/dist/esm/components/page/BodySnippet.js.map +1 -1
- package/dist/esm/components/page/HeadSnippet.js +100 -0
- package/dist/esm/components/page/HeadSnippet.js.map +1 -0
- package/dist/esm/components/page/Page.js +7 -166
- package/dist/esm/components/page/Page.js.map +1 -1
- package/dist/esm/components/page/PageHead.js +85 -0
- package/dist/esm/components/page/PageHead.js.map +1 -0
- package/dist/esm/components/shared/BackgroundsContainer/index.js +1 -0
- package/dist/esm/components/shared/BackgroundsContainer/index.js.map +1 -1
- package/dist/esm/components/shared/Link/index.js +5 -1
- package/dist/esm/components/shared/Link/index.js.map +1 -1
- package/dist/esm/index.js +0 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/element-tree.js +17 -8
- package/dist/esm/next/api-handler/handlers/element-tree.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/fonts.js +7 -2
- package/dist/esm/next/api-handler/handlers/fonts.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/manifest.js +20 -8
- package/dist/esm/next/api-handler/handlers/manifest.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/merge-translated-data.js +17 -6
- package/dist/esm/next/api-handler/handlers/merge-translated-data.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/proxy-draft-mode.js +49 -0
- package/dist/esm/next/api-handler/handlers/proxy-draft-mode.js.map +1 -0
- package/dist/esm/next/api-handler/handlers/proxy-preview-mode.js +55 -44
- package/dist/esm/next/api-handler/handlers/proxy-preview-mode.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/revalidate.js +27 -16
- package/dist/esm/next/api-handler/handlers/revalidate.js.map +1 -1
- package/dist/esm/next/api-handler/handlers/translatable-data.js +16 -5
- package/dist/esm/next/api-handler/handlers/translatable-data.js.map +1 -1
- package/dist/esm/next/api-handler/index.js +68 -34
- package/dist/esm/next/api-handler/index.js.map +1 -1
- package/dist/esm/next/client.js +3 -2
- package/dist/esm/next/client.js.map +1 -1
- package/dist/esm/next/components/head-tags.js +40 -0
- package/dist/esm/next/components/head-tags.js.map +1 -0
- package/dist/esm/next/components/page.js +32 -0
- package/dist/esm/next/components/page.js.map +1 -0
- package/dist/esm/next/context/makeswift-host-api-client.js +21 -0
- package/dist/esm/next/context/makeswift-host-api-client.js.map +1 -0
- package/dist/esm/next/context/react-runtime.js +19 -0
- package/dist/esm/next/context/react-runtime.js.map +1 -0
- package/dist/esm/next/draft-mode/draft-mode-script.js +99 -0
- package/dist/esm/next/draft-mode/draft-mode-script.js.map +1 -0
- package/dist/esm/next/draft-mode/index.js +30 -0
- package/dist/esm/next/draft-mode/index.js.map +1 -0
- package/dist/esm/next/hooks/use-is-pages-router.js +13 -0
- package/dist/esm/next/hooks/use-is-pages-router.js.map +1 -0
- package/dist/esm/next/index.js +5 -32
- package/dist/esm/next/index.js.map +1 -1
- package/dist/esm/next/preview-mode.js +2 -1
- package/dist/esm/next/preview-mode.js.map +1 -1
- package/dist/esm/next/root-style-registry.js +55 -0
- package/dist/esm/next/root-style-registry.js.map +1 -0
- package/dist/esm/next/server.js +5 -1
- package/dist/esm/next/server.js.map +1 -1
- package/dist/esm/runtimes/react/components/Element.js +1 -0
- package/dist/esm/runtimes/react/components/Element.js.map +1 -1
- package/dist/esm/runtimes/react/components/LiveProvider.js +6 -13
- package/dist/esm/runtimes/react/components/LiveProvider.js.map +1 -1
- package/dist/esm/runtimes/react/components/PreviewProvider.js +6 -8
- package/dist/esm/runtimes/react/components/PreviewProvider.js.map +1 -1
- package/dist/esm/runtimes/react/components/RuntimeProvider.js +3 -3
- package/dist/esm/runtimes/react/components/RuntimeProvider.js.map +1 -1
- package/dist/esm/runtimes/react/controls/link.js +1 -1
- package/dist/esm/runtimes/react/controls/link.js.map +1 -1
- package/dist/esm/runtimes/react/controls/rich-text/rich-text.js +3 -5
- package/dist/esm/runtimes/react/controls/rich-text/rich-text.js.map +1 -1
- package/dist/esm/runtimes/react/controls/rich-text-v2/rich-text-v2.js +4 -11
- package/dist/esm/runtimes/react/controls/rich-text-v2/rich-text-v2.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/makeswift-api.js +11 -10
- package/dist/esm/runtimes/react/hooks/makeswift-api.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-document-key.js +1 -0
- package/dist/esm/runtimes/react/hooks/use-document-key.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-page-id.js +1 -0
- package/dist/esm/runtimes/react/hooks/use-page-id.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-store.js +1 -0
- package/dist/esm/runtimes/react/hooks/use-store.js.map +1 -1
- package/dist/esm/runtimes/react/use-global-style.js +8 -3
- package/dist/esm/runtimes/react/use-global-style.js.map +1 -1
- package/dist/esm/runtimes/react/use-style.js +2 -1
- package/dist/esm/runtimes/react/use-style.js.map +1 -1
- package/dist/esm/state/actions.js +0 -22
- package/dist/esm/state/actions.js.map +1 -1
- package/dist/esm/state/react-builder-preview.js +2 -28
- package/dist/esm/state/react-builder-preview.js.map +1 -1
- package/dist/types/api/react.d.ts +1 -9
- package/dist/types/api/react.d.ts.map +1 -1
- package/dist/types/api/resource-types.d.ts +20 -0
- package/dist/types/api/resource-types.d.ts.map +1 -0
- package/dist/types/components/builtin/Box/Box.d.ts.map +1 -1
- package/dist/types/components/builtin/Box/animations.d.ts.map +1 -1
- package/dist/types/components/builtin/Box/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Button/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Carousel/Carousel.d.ts.map +1 -1
- package/dist/types/components/builtin/Carousel/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Countdown/Countdown.d.ts.map +1 -1
- package/dist/types/components/builtin/Countdown/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Divider/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Embed/Embed.d.ts.map +1 -1
- package/dist/types/components/builtin/Embed/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Form/Form.d.ts.map +1 -1
- package/dist/types/components/builtin/Form/components/Field/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/builtin/Form/context/FormContext.d.ts.map +1 -1
- package/dist/types/components/builtin/Form/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Image/Image.d.ts.map +1 -1
- package/dist/types/components/builtin/Image/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Navigation/Navigation.d.ts.map +1 -1
- package/dist/types/components/builtin/Navigation/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Root/register.d.ts.map +1 -1
- package/dist/types/components/builtin/SocialLinks/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Text/register.d.ts.map +1 -1
- package/dist/types/components/builtin/Video/Video.d.ts.map +1 -1
- package/dist/types/components/builtin/Video/register.d.ts.map +1 -1
- package/dist/types/components/hooks/usePageSnippets.d.ts +36 -0
- package/dist/types/components/hooks/usePageSnippets.d.ts.map +1 -0
- package/dist/types/components/hooks/useRouterLocaleSync.d.ts +2 -0
- package/dist/types/components/hooks/useRouterLocaleSync.d.ts.map +1 -0
- package/dist/types/components/page/BodySnippet.d.ts.map +1 -1
- package/dist/types/components/page/HeadSnippet.d.ts +7 -0
- package/dist/types/components/page/HeadSnippet.d.ts.map +1 -0
- package/dist/types/components/page/Page.d.ts.map +1 -1
- package/dist/types/components/page/PageHead.d.ts +8 -0
- package/dist/types/components/page/PageHead.d.ts.map +1 -0
- package/dist/types/components/shared/BackgroundsContainer/index.d.ts.map +1 -1
- package/dist/types/components/shared/Link/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/element-tree.d.ts +9 -1
- package/dist/types/next/api-handler/handlers/element-tree.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/fonts.d.ts +10 -1
- package/dist/types/next/api-handler/handlers/fonts.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/manifest.d.ts +9 -0
- package/dist/types/next/api-handler/handlers/manifest.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/merge-translated-data.d.ts +7 -0
- package/dist/types/next/api-handler/handlers/merge-translated-data.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/proxy-draft-mode.d.ts +20 -0
- package/dist/types/next/api-handler/handlers/proxy-draft-mode.d.ts.map +1 -0
- package/dist/types/next/api-handler/handlers/proxy-preview-mode.d.ts +14 -2
- package/dist/types/next/api-handler/handlers/proxy-preview-mode.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/revalidate.d.ts +9 -0
- package/dist/types/next/api-handler/handlers/revalidate.d.ts.map +1 -1
- package/dist/types/next/api-handler/handlers/translatable-data.d.ts +7 -0
- package/dist/types/next/api-handler/handlers/translatable-data.d.ts.map +1 -1
- package/dist/types/next/api-handler/index.d.ts +11 -3
- package/dist/types/next/api-handler/index.d.ts.map +1 -1
- package/dist/types/next/client.d.ts.map +1 -1
- package/dist/types/next/components/head-tags.d.ts +19 -0
- package/dist/types/next/components/head-tags.d.ts.map +1 -0
- package/dist/types/next/components/page.d.ts +7 -0
- package/dist/types/next/components/page.d.ts.map +1 -0
- package/dist/types/next/context/makeswift-host-api-client.d.ts +8 -0
- package/dist/types/next/context/makeswift-host-api-client.d.ts.map +1 -0
- package/dist/types/next/context/react-runtime.d.ts +8 -0
- package/dist/types/next/context/react-runtime.d.ts.map +1 -0
- package/dist/types/next/draft-mode/draft-mode-script.d.ts +6 -0
- package/dist/types/next/draft-mode/draft-mode-script.d.ts.map +1 -0
- package/dist/types/next/draft-mode/index.d.ts +15 -0
- package/dist/types/next/draft-mode/index.d.ts.map +1 -0
- package/dist/types/next/hooks/use-is-pages-router.d.ts +2 -0
- package/dist/types/next/hooks/use-is-pages-router.d.ts.map +1 -0
- package/dist/types/next/index.d.ts +4 -9
- package/dist/types/next/index.d.ts.map +1 -1
- package/dist/types/next/preview-mode.d.ts +1 -1
- package/dist/types/next/preview-mode.d.ts.map +1 -1
- package/dist/types/next/root-style-registry.d.ts +7 -0
- package/dist/types/next/root-style-registry.d.ts.map +1 -0
- package/dist/types/next/server.d.ts +2 -0
- package/dist/types/next/server.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/Element.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/LiveProvider.d.ts +3 -5
- package/dist/types/runtimes/react/components/LiveProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/PreviewProvider.d.ts +3 -5
- package/dist/types/runtimes/react/components/PreviewProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/components/RuntimeProvider.d.ts +2 -2
- package/dist/types/runtimes/react/components/RuntimeProvider.d.ts.map +1 -1
- package/dist/types/runtimes/react/controls/link.d.ts.map +1 -1
- package/dist/types/runtimes/react/controls/rich-text/rich-text.d.ts.map +1 -1
- package/dist/types/runtimes/react/controls/rich-text-v2/rich-text-v2.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/makeswift-api.d.ts +2 -1
- package/dist/types/runtimes/react/hooks/makeswift-api.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-document-key.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-page-id.d.ts.map +1 -1
- package/dist/types/runtimes/react/hooks/use-store.d.ts.map +1 -1
- package/dist/types/runtimes/react/use-global-style.d.ts.map +1 -1
- package/dist/types/runtimes/react/use-style.d.ts.map +1 -1
- package/dist/types/state/actions.d.ts +1 -19
- package/dist/types/state/actions.d.ts.map +1 -1
- package/dist/types/state/react-builder-preview.d.ts +3 -3
- package/dist/types/state/react-builder-preview.d.ts.map +1 -1
- package/next/plugin/package.json +1 -0
- package/package.json +6 -10
- package/slate/package.json +1 -1
- package/dist/cjs/next/dynamic.js +0 -52
- package/dist/cjs/next/dynamic.js.map +0 -1
- package/dist/esm/next/dynamic.js +0 -31
- package/dist/esm/next/dynamic.js.map +0 -1
- package/dist/types/next/dynamic.d.ts +0 -13
- package/dist/types/next/dynamic.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/builtin/Video/register.ts"],"sourcesContent":["import
|
|
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":[]}
|
|
@@ -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
|
|
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 {
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
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
|
|
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__ */
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/shared/BackgroundsContainer/index.tsx"],"sourcesContent":["
|
|
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
|
);
|