@prismicio/next 2.1.0 → 2.1.1-pr.120.3fae0cb

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 (38) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4 -2
  3. package/dist/index.d.cts +4 -2
  4. package/dist/package.cjs +1 -1
  5. package/dist/pages.cjs +0 -2
  6. package/dist/pages.d.cts +1 -2
  7. package/dist/react-server.cjs +5 -0
  8. package/dist/react-server.d.cts +3 -0
  9. package/dist/simulator/SliceSimulator.cjs +45 -0
  10. package/dist/simulator/SliceSimulator.cjs.map +1 -0
  11. package/dist/simulator/SliceSimulator.d.cts +40 -0
  12. package/dist/simulator/SliceSimulatorWrapper.cjs +36 -0
  13. package/dist/simulator/SliceSimulatorWrapper.cjs.map +1 -0
  14. package/dist/simulator/getSlices.cjs +16 -0
  15. package/dist/simulator/getSlices.cjs.map +1 -0
  16. package/dist/simulator/getSlices.d.cts +15 -0
  17. package/dist/simulator/react-server/SliceSimulator.cjs +45 -0
  18. package/dist/simulator/react-server/SliceSimulator.cjs.map +1 -0
  19. package/dist/simulator/react-server/SliceSimulator.d.cts +12 -0
  20. package/dist/simulator/react-server/getSlices.cjs +12 -0
  21. package/dist/simulator/react-server/getSlices.cjs.map +1 -0
  22. package/dist/simulator/react-server/getSlices.d.cts +7 -0
  23. package/dist/simulator/types.d.cts +15 -0
  24. package/package.json +8 -9
  25. package/src/index.ts +6 -2
  26. package/src/pages/index.ts +0 -3
  27. package/src/simulator/SliceSimulator.tsx +112 -0
  28. package/src/simulator/SliceSimulatorWrapper.tsx +68 -0
  29. package/src/simulator/getSlices.ts +19 -0
  30. package/src/simulator/index.ts +8 -0
  31. package/src/simulator/react-server/SliceSimulator.tsx +86 -0
  32. package/src/simulator/react-server/getSlices.ts +13 -0
  33. package/src/simulator/react-server/index.ts +4 -0
  34. package/src/simulator/types.ts +11 -0
  35. package/dist/PrismicNextRichText.cjs +0 -34
  36. package/dist/PrismicNextRichText.cjs.map +0 -1
  37. package/dist/PrismicNextRichText.d.cts +0 -11
  38. package/src/PrismicNextRichText.tsx +0 -41
package/README.md CHANGED
@@ -81,8 +81,8 @@ For more clarity on this project and its structure you can also check out the de
81
81
  [npm-version-href]: https://npmjs.com/package/@prismicio/next
82
82
  [npm-downloads-src]: https://img.shields.io/npm/dm/@prismicio/next.svg
83
83
  [npm-downloads-href]: https://npmjs.com/package/@prismicio/next
84
- [github-actions-ci-src]: https://github.com/prismicio/prismic-next/workflows/ci/badge.svg
85
- [github-actions-ci-href]: https://github.com/prismicio/prismic-next/actions?query=workflow%3Aci
84
+ [github-actions-ci-src]: https://github.com/prismicio/prismic-next/workflows/validate/badge.svg
85
+ [github-actions-ci-href]: https://github.com/prismicio/prismic-next/actions?query=workflow%3Avalidate
86
86
  [codecov-src]: https://img.shields.io/codecov/c/github/prismicio/prismic-next.svg
87
87
  [codecov-href]: https://codecov.io/gh/prismicio/prismic-next
88
88
  [conventional-commits-src]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg
package/dist/index.cjs CHANGED
@@ -5,15 +5,17 @@ const require_enableAutoPreviews = require('./enableAutoPreviews.cjs');
5
5
  const require_redirectToPreviewURL = require('./redirectToPreviewURL.cjs');
6
6
  const require_imgixLoader = require('./imgixLoader.cjs');
7
7
  const require_PrismicNextImage = require('./PrismicNextImage.cjs');
8
- const require_PrismicNextRichText = require('./PrismicNextRichText.cjs');
8
+ const require_SliceSimulator = require('./simulator/SliceSimulator.cjs');
9
+ const require_getSlices = require('./simulator/getSlices.cjs');
9
10
  const require_createLocaleRedirect = require('./createLocaleRedirect.cjs');
10
11
 
11
12
  exports.PrismicNextImage = require_PrismicNextImage.PrismicNextImage;
12
13
  exports.PrismicNextLink = require_PrismicNextLink.PrismicNextLink;
13
- exports.PrismicNextRichText = require_PrismicNextRichText.PrismicNextRichText;
14
14
  exports.PrismicPreview = require_PrismicPreview.PrismicPreview;
15
+ exports.SliceSimulator = require_SliceSimulator.SliceSimulator;
15
16
  exports.createLocaleRedirect = require_createLocaleRedirect.createLocaleRedirect;
16
17
  exports.enableAutoPreviews = require_enableAutoPreviews.enableAutoPreviews;
17
18
  exports.exitPreview = require_exitPreview.exitPreview;
19
+ exports.getSlices = require_getSlices.getSlices;
18
20
  exports.imgixLoader = require_imgixLoader.imgixLoader;
19
21
  exports.redirectToPreviewURL = require_redirectToPreviewURL.redirectToPreviewURL;
package/dist/index.d.cts CHANGED
@@ -5,7 +5,9 @@ import { EnableAutoPreviewsConfig, enableAutoPreviews } from "./enableAutoPrevie
5
5
  import { CreateClientConfig } from "./types.cjs";
6
6
  import { RedirectToPreviewURLConfig, redirectToPreviewURL } from "./redirectToPreviewURL.cjs";
7
7
  import { PrismicNextImage, PrismicNextImageProps } from "./PrismicNextImage.cjs";
8
- import { PrismicNextRichText, PrismicNextRichTextProps } from "./PrismicNextRichText.cjs";
8
+ import { SliceSimulator, SliceSimulatorProps, SliceSimulatorSliceZoneProps } from "./simulator/SliceSimulator.cjs";
9
+ import { getSlices } from "./simulator/getSlices.cjs";
10
+ import { SliceSimulatorParams } from "./simulator/types.cjs";
9
11
  import { imgixLoader } from "./imgixLoader.cjs";
10
12
  import { CreateLocaleRedirectConfig, createLocaleRedirect } from "./createLocaleRedirect.cjs";
11
- export { type CreateClientConfig, type CreateLocaleRedirectConfig, type EnableAutoPreviewsConfig, PrismicNextImage, type PrismicNextImageProps, PrismicNextLink, type PrismicNextLinkProps, PrismicNextRichText, type PrismicNextRichTextProps, PrismicPreview, type PrismicPreviewProps, type RedirectToPreviewURLConfig, createLocaleRedirect, enableAutoPreviews, exitPreview, imgixLoader, redirectToPreviewURL };
13
+ export { type CreateClientConfig, type CreateLocaleRedirectConfig, type EnableAutoPreviewsConfig, PrismicNextImage, type PrismicNextImageProps, PrismicNextLink, type PrismicNextLinkProps, PrismicPreview, type PrismicPreviewProps, type RedirectToPreviewURLConfig, SliceSimulator, type SliceSimulatorParams, type SliceSimulatorProps, type SliceSimulatorSliceZoneProps, createLocaleRedirect, enableAutoPreviews, exitPreview, getSlices, imgixLoader, redirectToPreviewURL };
package/dist/package.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region package.json
3
- var version = "2.1.0";
3
+ var version = "2.1.1-pr.120.3fae0cb";
4
4
 
5
5
  //#endregion
6
6
  Object.defineProperty(exports, 'version', {
package/dist/pages.cjs CHANGED
@@ -1,7 +1,6 @@
1
1
  const require_PrismicNextLink = require('./PrismicNextLink.cjs');
2
2
  const require_imgixLoader = require('./imgixLoader.cjs');
3
3
  const require_PrismicNextImage = require('./PrismicNextImage.cjs');
4
- const require_PrismicNextRichText = require('./PrismicNextRichText.cjs');
5
4
  const require_createLocaleRedirect = require('./createLocaleRedirect.cjs');
6
5
  const require_PrismicPreview = require('./pages/PrismicPreview.cjs');
7
6
  const require_enableAutoPreviews = require('./pages/enableAutoPreviews.cjs');
@@ -11,7 +10,6 @@ const require_setPreviewData = require('./pages/setPreviewData.cjs');
11
10
 
12
11
  exports.PrismicNextImage = require_PrismicNextImage.PrismicNextImage;
13
12
  exports.PrismicNextLink = require_PrismicNextLink.PrismicNextLink;
14
- exports.PrismicNextRichText = require_PrismicNextRichText.PrismicNextRichText;
15
13
  exports.PrismicPreview = require_PrismicPreview.PrismicPreview;
16
14
  exports.createLocaleRedirect = require_createLocaleRedirect.createLocaleRedirect;
17
15
  exports.enableAutoPreviews = require_enableAutoPreviews.enableAutoPreviews;
package/dist/pages.d.cts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { PrismicNextLink, PrismicNextLinkProps } from "./PrismicNextLink.cjs";
2
2
  import { PrismicNextImage, PrismicNextImageProps } from "./PrismicNextImage.cjs";
3
- import { PrismicNextRichText, PrismicNextRichTextProps } from "./PrismicNextRichText.cjs";
4
3
  import { imgixLoader } from "./imgixLoader.cjs";
5
4
  import { CreateLocaleRedirectConfig, createLocaleRedirect } from "./createLocaleRedirect.cjs";
6
5
  import { PrismicPreview, PrismicPreviewProps } from "./pages/PrismicPreview.cjs";
@@ -9,4 +8,4 @@ import { EnableAutoPreviewsConfig, enableAutoPreviews } from "./pages/enableAuto
9
8
  import { RedirectToPreviewURLConfig, redirectToPreviewURL } from "./pages/redirectToPreviewURL.cjs";
10
9
  import { ExitPreviewAPIRouteConfig, exitPreview } from "./pages/exitPreview.cjs";
11
10
  import { SetPreviewDataConfig, setPreviewData } from "./pages/setPreviewData.cjs";
12
- export { type CreateClientConfig, type CreateLocaleRedirectConfig, type EnableAutoPreviewsConfig, type ExitPreviewAPIRouteConfig, PrismicNextImage, type PrismicNextImageProps, PrismicNextLink, type PrismicNextLinkProps, PrismicNextRichText, type PrismicNextRichTextProps, PrismicPreview, type PrismicPreviewProps, type RedirectToPreviewURLConfig, type SetPreviewDataConfig, createLocaleRedirect, enableAutoPreviews, exitPreview, imgixLoader, redirectToPreviewURL, setPreviewData };
11
+ export { type CreateClientConfig, type CreateLocaleRedirectConfig, type EnableAutoPreviewsConfig, type ExitPreviewAPIRouteConfig, PrismicNextImage, type PrismicNextImageProps, PrismicNextLink, type PrismicNextLinkProps, PrismicPreview, type PrismicPreviewProps, type RedirectToPreviewURLConfig, type SetPreviewDataConfig, createLocaleRedirect, enableAutoPreviews, exitPreview, imgixLoader, redirectToPreviewURL, setPreviewData };
@@ -0,0 +1,5 @@
1
+ const require_getSlices = require('./simulator/react-server/getSlices.cjs');
2
+ const require_SliceSimulator = require('./simulator/react-server/SliceSimulator.cjs');
3
+
4
+ exports.SliceSimulator = require_SliceSimulator.SliceSimulator;
5
+ exports.getSlices = require_getSlices.getSlices;
@@ -0,0 +1,3 @@
1
+ import { SliceSimulator } from "./simulator/react-server/SliceSimulator.cjs";
2
+ import { getSlices } from "./simulator/react-server/getSlices.cjs";
3
+ export { SliceSimulator, getSlices };
@@ -0,0 +1,45 @@
1
+ "use client";
2
+
3
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
4
+ const require_SliceSimulatorWrapper = require('./SliceSimulatorWrapper.cjs');
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let _prismicio_simulator_kit = require("@prismicio/simulator/kit");
8
+
9
+ //#region src/simulator/SliceSimulator.tsx
10
+ const simulatorManager = new _prismicio_simulator_kit.SimulatorManager();
11
+ /**
12
+ * Simulate slices in isolation. The slice simulator enables live slice
13
+ * development in Slice Machine and live previews in the Page Builder.
14
+ */
15
+ const SliceSimulator = ({ background, zIndex, className, ...restProps }) => {
16
+ if (!("sliceZone" in restProps)) throw new Error("A sliceZone prop must be provided when <SliceZone> is rendered in a Client Component. Add a sliceZone prop or convert your simulator to a Server Component with the getSlices helper.");
17
+ const [slices, setSlices] = (0, react.useState)(() => (0, _prismicio_simulator_kit.getDefaultSlices)());
18
+ const [message, setMessage] = (0, react.useState)(() => (0, _prismicio_simulator_kit.getDefaultMessage)());
19
+ (0, react.useEffect)(() => {
20
+ simulatorManager.state.on(_prismicio_simulator_kit.StateEventType.Slices, (_slices) => {
21
+ setSlices(_slices);
22
+ }, "simulator-slices");
23
+ simulatorManager.state.on(_prismicio_simulator_kit.StateEventType.Message, (_message) => {
24
+ setMessage(_message);
25
+ }, "simulator-message");
26
+ simulatorManager.init();
27
+ return () => {
28
+ simulatorManager.state.off(_prismicio_simulator_kit.StateEventType.Slices, "simulator-slices");
29
+ simulatorManager.state.off(_prismicio_simulator_kit.StateEventType.Message, "simulator-message");
30
+ };
31
+ }, []);
32
+ const SliceZoneComp = restProps.sliceZone;
33
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_SliceSimulatorWrapper.SliceSimulatorWrapper, {
34
+ message,
35
+ hasSlices: slices.length > 0,
36
+ background,
37
+ zIndex,
38
+ className,
39
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SliceZoneComp, { slices })
40
+ });
41
+ };
42
+
43
+ //#endregion
44
+ exports.SliceSimulator = SliceSimulator;
45
+ //# sourceMappingURL=SliceSimulator.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliceSimulator.cjs","names":["SimulatorManager","StateEventType","SliceSimulatorWrapper"],"sources":["../../src/simulator/SliceSimulator.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { ComponentType, FC } from \"react\";\n\nimport {\n\tSimulatorManager,\n\tStateEventType,\n\tgetDefaultMessage,\n\tgetDefaultSlices,\n} from \"@prismicio/simulator/kit\";\nimport type {\n\tSliceSimulatorProps as BaseSliceSimulatorProps,\n\tSliceSimulatorState,\n} from \"@prismicio/simulator/kit\";\n\nimport { SliceSimulatorWrapper } from \"./SliceSimulatorWrapper\";\n\nconst simulatorManager = new SimulatorManager();\n\nexport type SliceSimulatorSliceZoneProps = {\n\tslices: SliceSimulatorState[\"slices\"];\n};\n\nexport type SliceSimulatorProps = {\n\tclassName?: string;\n} & Omit<BaseSliceSimulatorProps, \"state\"> &\n\t(\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * React component to render simulated Slices.\n\t\t\t\t *\n\t\t\t\t * @example\n\t\t\t\t *\n\t\t\t\t * ```tsx\n\t\t\t\t * import { SliceSimulator } from \"@slicemachine/adapter-next/simulator\";\n\t\t\t\t * import { SliceZone } from \"@prismicio/react\";\n\t\t\t\t *\n\t\t\t\t * import { components } from \"../slices\";\n\t\t\t\t *\n\t\t\t\t * <SliceSimulator\n\t\t\t\t * \tsliceZone={({ slices }) => (\n\t\t\t\t * \t\t<SliceZone slices={slices} components={components} />\n\t\t\t\t * \t)}\n\t\t\t\t * />;\n\t\t\t\t * ```\n\t\t\t\t */\n\t\t\t\tsliceZone: ComponentType<SliceSimulatorSliceZoneProps>;\n\t\t }\n\t\t| {\n\t\t\t\tchildren: React.ReactNode;\n\t\t }\n\t);\n\n/**\n * Simulate slices in isolation. The slice simulator enables live slice\n * development in Slice Machine and live previews in the Page Builder.\n */\nexport const SliceSimulator: FC<SliceSimulatorProps> = ({\n\tbackground,\n\tzIndex,\n\tclassName,\n\t...restProps\n}) => {\n\tif (!(\"sliceZone\" in restProps)) {\n\t\tthrow new Error(\n\t\t\t\"A sliceZone prop must be provided when <SliceZone> is rendered in a Client Component. Add a sliceZone prop or convert your simulator to a Server Component with the getSlices helper.\",\n\t\t);\n\t}\n\n\tconst [slices, setSlices] = useState(() => getDefaultSlices());\n\tconst [message, setMessage] = useState(() => getDefaultMessage());\n\n\tuseEffect(() => {\n\t\tsimulatorManager.state.on(\n\t\t\tStateEventType.Slices,\n\t\t\t(_slices) => {\n\t\t\t\tsetSlices(_slices);\n\t\t\t},\n\t\t\t\"simulator-slices\",\n\t\t);\n\t\tsimulatorManager.state.on(\n\t\t\tStateEventType.Message,\n\t\t\t(_message) => {\n\t\t\t\tsetMessage(_message);\n\t\t\t},\n\t\t\t\"simulator-message\",\n\t\t);\n\n\t\tsimulatorManager.init();\n\n\t\treturn () => {\n\t\t\tsimulatorManager.state.off(StateEventType.Slices, \"simulator-slices\");\n\n\t\t\tsimulatorManager.state.off(StateEventType.Message, \"simulator-message\");\n\t\t};\n\t}, []);\n\n\tconst SliceZoneComp = restProps.sliceZone;\n\n\treturn (\n\t\t<SliceSimulatorWrapper\n\t\t\tmessage={message}\n\t\t\thasSlices={slices.length > 0}\n\t\t\tbackground={background}\n\t\t\tzIndex={zIndex}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t<SliceZoneComp slices={slices} />\n\t\t</SliceSimulatorWrapper>\n\t);\n};\n"],"mappings":";;;;;;;;;AAkBA,MAAM,mBAAmB,IAAIA,2CAAkB;;;;;AAwC/C,MAAa,kBAA2C,EACvD,YACA,QACA,WACA,GAAG,gBACE;AACL,KAAI,EAAE,eAAe,WACpB,OAAM,IAAI,MACT,wLACA;CAGF,MAAM,CAAC,QAAQ,uFAA8C,CAAC;CAC9D,MAAM,CAAC,SAAS,yFAAgD,CAAC;AAEjE,4BAAgB;AACf,mBAAiB,MAAM,GACtBC,wCAAe,SACd,YAAY;AACZ,aAAU,QAAQ;KAEnB,mBACA;AACD,mBAAiB,MAAM,GACtBA,wCAAe,UACd,aAAa;AACb,cAAW,SAAS;KAErB,oBACA;AAED,mBAAiB,MAAM;AAEvB,eAAa;AACZ,oBAAiB,MAAM,IAAIA,wCAAe,QAAQ,mBAAmB;AAErE,oBAAiB,MAAM,IAAIA,wCAAe,SAAS,oBAAoB;;IAEtE,EAAE,CAAC;CAEN,MAAM,gBAAgB,UAAU;AAEhC,QACC,2CAACC;EACS;EACT,WAAW,OAAO,SAAS;EACf;EACJ;EACG;YAEX,2CAAC,iBAAsB,SAAU;GACV"}
@@ -0,0 +1,40 @@
1
+ import { ComponentType, FC } from "react";
2
+ import { SliceSimulatorProps, SliceSimulatorState } from "@prismicio/simulator/kit";
3
+
4
+ //#region src/simulator/SliceSimulator.d.ts
5
+ type SliceSimulatorSliceZoneProps = {
6
+ slices: SliceSimulatorState["slices"];
7
+ };
8
+ type SliceSimulatorProps$1 = {
9
+ className?: string;
10
+ } & Omit<SliceSimulatorProps, "state"> & ({
11
+ /**
12
+ * React component to render simulated Slices.
13
+ *
14
+ * @example
15
+ *
16
+ * ```tsx
17
+ * import { SliceSimulator } from "@slicemachine/adapter-next/simulator";
18
+ * import { SliceZone } from "@prismicio/react";
19
+ *
20
+ * import { components } from "../slices";
21
+ *
22
+ * <SliceSimulator
23
+ * sliceZone={({ slices }) => (
24
+ * <SliceZone slices={slices} components={components} />
25
+ * )}
26
+ * />;
27
+ * ```
28
+ */
29
+ sliceZone: ComponentType<SliceSimulatorSliceZoneProps>;
30
+ } | {
31
+ children: React.ReactNode;
32
+ });
33
+ /**
34
+ * Simulate slices in isolation. The slice simulator enables live slice
35
+ * development in Slice Machine and live previews in the Page Builder.
36
+ */
37
+ declare const SliceSimulator: FC<SliceSimulatorProps$1>;
38
+ //#endregion
39
+ export { SliceSimulator, SliceSimulatorProps$1 as SliceSimulatorProps, SliceSimulatorSliceZoneProps };
40
+ //# sourceMappingURL=SliceSimulator.d.cts.map
@@ -0,0 +1,36 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ let react_jsx_runtime = require("react/jsx-runtime");
3
+ let _prismicio_simulator_kit = require("@prismicio/simulator/kit");
4
+
5
+ //#region src/simulator/SliceSimulatorWrapper.tsx
6
+ /**
7
+ * A wrapper for the slice simulator that isolates the given children from the
8
+ * page's layout.
9
+ */
10
+ const SliceSimulatorWrapper = ({ className, children, zIndex, background, message, hasSlices }) => {
11
+ const defaultProps = (0, _prismicio_simulator_kit.getDefaultProps)();
12
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13
+ className: [_prismicio_simulator_kit.simulatorClass, className].filter(Boolean).join(" "),
14
+ style: {
15
+ zIndex: typeof zIndex === "undefined" ? defaultProps.zIndex : zIndex ?? void 0,
16
+ position: "fixed",
17
+ top: 0,
18
+ left: 0,
19
+ width: "100%",
20
+ height: "100vh",
21
+ overflow: "auto",
22
+ background: typeof background === "undefined" ? defaultProps.background : background ?? void 0
23
+ },
24
+ children: message ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("article", { dangerouslySetInnerHTML: { __html: message } }) : hasSlices ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
25
+ id: "root",
26
+ className: _prismicio_simulator_kit.simulatorRootClass,
27
+ onClickCapture: _prismicio_simulator_kit.onClickHandler,
28
+ onSubmitCapture: _prismicio_simulator_kit.disableEventHandler,
29
+ children
30
+ }) : null
31
+ });
32
+ };
33
+
34
+ //#endregion
35
+ exports.SliceSimulatorWrapper = SliceSimulatorWrapper;
36
+ //# sourceMappingURL=SliceSimulatorWrapper.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliceSimulatorWrapper.cjs","names":["simulatorClass","simulatorRootClass","onClickHandler","disableEventHandler"],"sources":["../../src/simulator/SliceSimulatorWrapper.tsx"],"sourcesContent":["import type { FC, ReactNode } from \"react\";\nimport {\n\tdisableEventHandler,\n\tgetDefaultProps,\n\tonClickHandler,\n\tsimulatorClass,\n\tsimulatorRootClass,\n} from \"@prismicio/simulator/kit\";\nimport type { SliceSimulatorProps } from \"./SliceSimulator\";\n\ntype SliceSimulatorWrapperProps = {\n\tchildren: ReactNode;\n\tclassName?: string;\n\tmessage?: string;\n\thasSlices: boolean;\n} & Omit<SliceSimulatorProps, \"state\">;\n\n/**\n * A wrapper for the slice simulator that isolates the given children from the\n * page's layout.\n */\nexport const SliceSimulatorWrapper: FC<SliceSimulatorWrapperProps> = ({\n\tclassName,\n\tchildren,\n\tzIndex,\n\tbackground,\n\tmessage,\n\thasSlices,\n}) => {\n\tconst defaultProps = getDefaultProps();\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[simulatorClass, className].filter(Boolean).join(\" \")}\n\t\t\tstyle={{\n\t\t\t\tzIndex:\n\t\t\t\t\ttypeof zIndex === \"undefined\"\n\t\t\t\t\t\t? defaultProps.zIndex\n\t\t\t\t\t\t: zIndex ?? undefined,\n\t\t\t\tposition: \"fixed\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: \"100vh\",\n\t\t\t\toverflow: \"auto\",\n\t\t\t\tbackground:\n\t\t\t\t\ttypeof background === \"undefined\"\n\t\t\t\t\t\t? defaultProps.background\n\t\t\t\t\t\t: background ?? undefined,\n\t\t\t}}\n\t\t>\n\t\t\t{message ? (\n\t\t\t\t<article dangerouslySetInnerHTML={{ __html: message }} />\n\t\t\t) : hasSlices ? (\n\t\t\t\t<div\n\t\t\t\t\tid=\"root\"\n\t\t\t\t\tclassName={simulatorRootClass}\n\t\t\t\t\tonClickCapture={onClickHandler as unknown as React.MouseEventHandler}\n\t\t\t\t\tonSubmitCapture={\n\t\t\t\t\t\tdisableEventHandler as unknown as React.FormEventHandler\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t);\n};\n"],"mappings":";;;;;;;;;AAqBA,MAAa,yBAAyD,EACrE,WACA,UACA,QACA,YACA,SACA,gBACK;CACL,MAAM,8DAAgC;AAEtC,QACC,2CAAC;EACA,WAAW,CAACA,yCAAgB,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EAChE,OAAO;GACN,QACC,OAAO,WAAW,cACf,aAAa,SACb,UAAU;GACd,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,UAAU;GACV,YACC,OAAO,eAAe,cACnB,aAAa,aACb,cAAc;GAClB;YAEA,UACA,2CAAC,aAAQ,yBAAyB,EAAE,QAAQ,SAAS,GAAI,GACtD,YACH,2CAAC;GACA,IAAG;GACH,WAAWC;GACX,gBAAgBC;GAChB,iBACCC;GAGA;IACI,GACH;GACC"}
@@ -0,0 +1,16 @@
1
+
2
+ //#region src/simulator/getSlices.ts
3
+ /**
4
+ * Returns the simulator's slices from the page's `searchParams.state` value.
5
+ * The `state` value is set by `<SliceSimulator>`.
6
+ *
7
+ * **Note**: `getSlices` should only be used in the App Router with a Server
8
+ * Component.
9
+ */
10
+ const getSlices = (state) => {
11
+ throw new Error("getSlices is designed only for Server Components. Convert your simulator page to a Server Component or remove the function from your Client Component.");
12
+ };
13
+
14
+ //#endregion
15
+ exports.getSlices = getSlices;
16
+ //# sourceMappingURL=getSlices.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSlices.cjs","names":[],"sources":["../../src/simulator/getSlices.ts"],"sourcesContent":["import type { StateEvents, StateEventType } from \"@prismicio/simulator/kit\";\n\n/**\n * Returns the simulator's slices from the page's `searchParams.state` value.\n * The `state` value is set by `<SliceSimulator>`.\n *\n * **Note**: `getSlices` should only be used in the App Router with a Server\n * Component.\n */\nexport const getSlices = (\n\tstate: string | null | undefined,\n): StateEvents[StateEventType.Slices] => {\n\t// Prevent tsserver + eslint warnings about unused vars.\n\tstate;\n\n\tthrow new Error(\n\t\t\"getSlices is designed only for Server Components. Convert your simulator page to a Server Component or remove the function from your Client Component.\",\n\t);\n};\n"],"mappings":";;;;;;;;;AASA,MAAa,aACZ,UACwC;AAIxC,OAAM,IAAI,MACT,yJACA"}
@@ -0,0 +1,15 @@
1
+ import { StateEventType, StateEvents } from "@prismicio/simulator/kit";
2
+
3
+ //#region src/simulator/getSlices.d.ts
4
+
5
+ /**
6
+ * Returns the simulator's slices from the page's `searchParams.state` value.
7
+ * The `state` value is set by `<SliceSimulator>`.
8
+ *
9
+ * **Note**: `getSlices` should only be used in the App Router with a Server
10
+ * Component.
11
+ */
12
+ declare const getSlices: (state: string | null | undefined) => StateEvents[StateEventType.Slices];
13
+ //#endregion
14
+ export { getSlices };
15
+ //# sourceMappingURL=getSlices.d.cts.map
@@ -0,0 +1,45 @@
1
+ "use client";
2
+
3
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
4
+ const require_SliceSimulatorWrapper = require('../SliceSimulatorWrapper.cjs');
5
+ const require_getSlices = require('./getSlices.cjs');
6
+ let next_navigation = require("next/navigation");
7
+ let react = require("react");
8
+ let react_jsx_runtime = require("react/jsx-runtime");
9
+ let _prismicio_simulator_kit = require("@prismicio/simulator/kit");
10
+ let lz_string = require("lz-string");
11
+
12
+ //#region src/simulator/react-server/SliceSimulator.tsx
13
+ const STATE_PARAMS_KEY = "state";
14
+ const simulatorManager = new _prismicio_simulator_kit.SimulatorManager();
15
+ const SliceSimulator = ({ children, background, zIndex, className }) => {
16
+ const [message, setMessage] = (0, react.useState)(() => (0, _prismicio_simulator_kit.getDefaultMessage)());
17
+ const router = (0, next_navigation.useRouter)();
18
+ const hasSlices = require_getSlices.getSlices(typeof window !== "undefined" ? new URL(window.location.href).searchParams.get(STATE_PARAMS_KEY) : void 0).length > 0;
19
+ (0, react.useEffect)(() => {
20
+ simulatorManager.state.on(_prismicio_simulator_kit.StateEventType.Slices, (newSlices) => {
21
+ const url = new URL(window.location.href);
22
+ url.searchParams.set(STATE_PARAMS_KEY, (0, lz_string.compressToEncodedURIComponent)(JSON.stringify(newSlices)));
23
+ window.history.replaceState(null, "", url);
24
+ setTimeout(() => router.refresh(), 0);
25
+ }, "simulator-slices");
26
+ simulatorManager.state.on(_prismicio_simulator_kit.StateEventType.Message, (newMessage) => setMessage(newMessage), "simulator-message");
27
+ simulatorManager.init();
28
+ return () => {
29
+ simulatorManager.state.off(_prismicio_simulator_kit.StateEventType.Slices, "simulator-slices");
30
+ simulatorManager.state.off(_prismicio_simulator_kit.StateEventType.Message, "simulator-message");
31
+ };
32
+ }, []);
33
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_SliceSimulatorWrapper.SliceSimulatorWrapper, {
34
+ message,
35
+ hasSlices,
36
+ background,
37
+ zIndex,
38
+ className,
39
+ children
40
+ });
41
+ };
42
+
43
+ //#endregion
44
+ exports.SliceSimulator = SliceSimulator;
45
+ //# sourceMappingURL=SliceSimulator.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliceSimulator.cjs","names":["SimulatorManager","getSlices","StateEventType","SliceSimulatorWrapper"],"sources":["../../../src/simulator/react-server/SliceSimulator.tsx"],"sourcesContent":["// This `<SliceSimulator>` is only accessible from Server Components.\n\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { FC } from \"react\";\n\nimport { useRouter } from \"next/navigation\";\nimport {\n\tSimulatorManager,\n\tStateEventType,\n\tgetDefaultMessage,\n} from \"@prismicio/simulator/kit\";\nimport type { SliceSimulatorProps as BaseSliceSimulatorProps } from \"@prismicio/simulator/kit\";\nimport { compressToEncodedURIComponent } from \"lz-string\";\n\nimport { SliceSimulatorWrapper } from \"../SliceSimulatorWrapper\";\nimport { getSlices } from \"./getSlices\";\n\nconst STATE_PARAMS_KEY = \"state\";\n\nconst simulatorManager = new SimulatorManager();\n\nexport type SliceSimulatorProps = Omit<BaseSliceSimulatorProps, \"state\"> & {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n};\n\nexport const SliceSimulator: FC<SliceSimulatorProps> = ({\n\tchildren,\n\tbackground,\n\tzIndex,\n\tclassName,\n}) => {\n\tconst [message, setMessage] = useState(() => getDefaultMessage());\n\tconst router = useRouter();\n\n\tconst state =\n\t\ttypeof window !== \"undefined\"\n\t\t\t? new URL(window.location.href).searchParams.get(STATE_PARAMS_KEY)\n\t\t\t: undefined;\n\tconst hasSlices = getSlices(state).length > 0;\n\n\tuseEffect(() => {\n\t\tsimulatorManager.state.on(\n\t\t\tStateEventType.Slices,\n\t\t\t(newSlices) => {\n\t\t\t\tconst url = new URL(window.location.href);\n\t\t\t\turl.searchParams.set(\n\t\t\t\t\tSTATE_PARAMS_KEY,\n\t\t\t\t\tcompressToEncodedURIComponent(JSON.stringify(newSlices)),\n\t\t\t\t);\n\n\t\t\t\twindow.history.replaceState(null, \"\", url);\n\t\t\t\t// Wait until the next tick to prevent URL state race conditions.\n\t\t\t\tsetTimeout(() => router.refresh(), 0);\n\t\t\t},\n\t\t\t\"simulator-slices\",\n\t\t);\n\t\tsimulatorManager.state.on(\n\t\t\tStateEventType.Message,\n\t\t\t(newMessage) => setMessage(newMessage),\n\t\t\t\"simulator-message\",\n\t\t);\n\n\t\tsimulatorManager.init();\n\n\t\treturn () => {\n\t\t\tsimulatorManager.state.off(StateEventType.Slices, \"simulator-slices\");\n\n\t\t\tsimulatorManager.state.off(StateEventType.Message, \"simulator-message\");\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t<SliceSimulatorWrapper\n\t\t\tmessage={message}\n\t\t\thasSlices={hasSlices}\n\t\t\tbackground={background}\n\t\t\tzIndex={zIndex}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{children}\n\t\t</SliceSimulatorWrapper>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;AAmBA,MAAM,mBAAmB;AAEzB,MAAM,mBAAmB,IAAIA,2CAAkB;AAO/C,MAAa,kBAA2C,EACvD,UACA,YACA,QACA,gBACK;CACL,MAAM,CAAC,SAAS,yFAAgD,CAAC;CACjE,MAAM,yCAAoB;CAM1B,MAAM,YAAYC,4BAHjB,OAAO,WAAW,cACf,IAAI,IAAI,OAAO,SAAS,KAAK,CAAC,aAAa,IAAI,iBAAiB,GAChE,OAC8B,CAAC,SAAS;AAE5C,4BAAgB;AACf,mBAAiB,MAAM,GACtBC,wCAAe,SACd,cAAc;GACd,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,KAAK;AACzC,OAAI,aAAa,IAChB,+DAC8B,KAAK,UAAU,UAAU,CAAC,CACxD;AAED,UAAO,QAAQ,aAAa,MAAM,IAAI,IAAI;AAE1C,oBAAiB,OAAO,SAAS,EAAE,EAAE;KAEtC,mBACA;AACD,mBAAiB,MAAM,GACtBA,wCAAe,UACd,eAAe,WAAW,WAAW,EACtC,oBACA;AAED,mBAAiB,MAAM;AAEvB,eAAa;AACZ,oBAAiB,MAAM,IAAIA,wCAAe,QAAQ,mBAAmB;AAErE,oBAAiB,MAAM,IAAIA,wCAAe,SAAS,oBAAoB;;IAEtE,EAAE,CAAC;AAEN,QACC,2CAACC;EACS;EACE;EACC;EACJ;EACG;EAEV;GACsB"}
@@ -0,0 +1,12 @@
1
+ import { FC } from "react";
2
+ import { SliceSimulatorProps } from "@prismicio/simulator/kit";
3
+
4
+ //#region src/simulator/react-server/SliceSimulator.d.ts
5
+ type SliceSimulatorProps$1 = Omit<SliceSimulatorProps, "state"> & {
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ };
9
+ declare const SliceSimulator: FC<SliceSimulatorProps$1>;
10
+ //#endregion
11
+ export { SliceSimulator };
12
+ //# sourceMappingURL=SliceSimulator.d.cts.map
@@ -0,0 +1,12 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ let _prismicio_simulator_kit = require("@prismicio/simulator/kit");
3
+ let lz_string = require("lz-string");
4
+
5
+ //#region src/simulator/react-server/getSlices.ts
6
+ const getSlices = (state) => {
7
+ return state ? JSON.parse((0, lz_string.decompressFromEncodedURIComponent)(state)) : (0, _prismicio_simulator_kit.getDefaultSlices)();
8
+ };
9
+
10
+ //#endregion
11
+ exports.getSlices = getSlices;
12
+ //# sourceMappingURL=getSlices.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSlices.cjs","names":[],"sources":["../../../src/simulator/react-server/getSlices.ts"],"sourcesContent":["// This `getSlices` is only accessible from Server Components.\n\nimport { getDefaultSlices } from \"@prismicio/simulator/kit\";\nimport type { StateEvents, StateEventType } from \"@prismicio/simulator/kit\";\nimport { decompressFromEncodedURIComponent } from \"lz-string\";\n\nexport const getSlices = (\n\tstate: string | null | undefined,\n): StateEvents[StateEventType.Slices] => {\n\treturn state\n\t\t? JSON.parse(decompressFromEncodedURIComponent(state))\n\t\t: getDefaultSlices();\n};\n"],"mappings":";;;;;AAMA,MAAa,aACZ,UACwC;AACxC,QAAO,QACJ,KAAK,uDAAwC,MAAM,CAAC,mDAClC"}
@@ -0,0 +1,7 @@
1
+ import { StateEventType, StateEvents } from "@prismicio/simulator/kit";
2
+
3
+ //#region src/simulator/react-server/getSlices.d.ts
4
+ declare const getSlices: (state: string | null | undefined) => StateEvents[StateEventType.Slices];
5
+ //#endregion
6
+ export { getSlices };
7
+ //# sourceMappingURL=getSlices.d.cts.map
@@ -0,0 +1,15 @@
1
+ //#region src/simulator/types.d.ts
2
+ /**
3
+ * Parameters provided to the Slice Simulator page.
4
+ *
5
+ * **Note**: `SliceSimulatorParams` should only be used in the App Router with a
6
+ * Server Component.
7
+ */
8
+ type SliceSimulatorParams = {
9
+ searchParams: Promise<{
10
+ state?: string;
11
+ }>;
12
+ };
13
+ //#endregion
14
+ export { SliceSimulatorParams };
15
+ //# sourceMappingURL=types.d.cts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prismicio/next",
3
- "version": "2.1.0",
3
+ "version": "2.1.1-pr.120.3fae0cb",
4
4
  "description": "Helpers to integrate Prismic into Next.js apps",
5
5
  "keywords": [
6
6
  "typescript",
@@ -20,6 +20,7 @@
20
20
  "exports": {
21
21
  ".": "./dist/index.cjs",
22
22
  "./pages": "./dist/pages.cjs",
23
+ "./react-server": "./dist/react-server.cjs",
23
24
  "./package.json": "./package.json"
24
25
  },
25
26
  "main": "./dist/index.cjs",
@@ -32,6 +33,9 @@
32
33
  ],
33
34
  "pages": [
34
35
  "./dist/pages/index.d.ts"
36
+ ],
37
+ "react-server": [
38
+ "./dist/react-server/index.d.ts"
35
39
  ]
36
40
  }
37
41
  },
@@ -55,12 +59,13 @@
55
59
  "types": "tsc --noEmit"
56
60
  },
57
61
  "dependencies": {
58
- "imgix-url-builder": "^0.0.5"
62
+ "@prismicio/simulator": "^0.1.4",
63
+ "imgix-url-builder": "^0.0.5",
64
+ "lz-string": "^1.5.0"
59
65
  },
60
66
  "devDependencies": {
61
67
  "@playwright/test": "^1.49.1",
62
68
  "@prismicio/client": "^7.12.0",
63
- "@prismicio/react": "^3.2.2",
64
69
  "@trivago/prettier-plugin-sort-imports": "^6.0.2",
65
70
  "@types/node": "^22.10.2",
66
71
  "@types/react": "^19.2.3",
@@ -76,15 +81,9 @@
76
81
  },
77
82
  "peerDependencies": {
78
83
  "@prismicio/client": "^7",
79
- "@prismicio/react": "^3",
80
84
  "next": "^13.4.5 || ^14 || ^15 || ^16",
81
85
  "react": "^18 || ^19"
82
86
  },
83
- "peerDependenciesMeta": {
84
- "@prismicio/react": {
85
- "optional": true
86
- }
87
- },
88
87
  "engines": {
89
88
  "node": ">=20"
90
89
  },
package/src/index.ts CHANGED
@@ -15,8 +15,12 @@ export type { RedirectToPreviewURLConfig } from "./redirectToPreviewURL";
15
15
  export { PrismicNextImage } from "./PrismicNextImage";
16
16
  export type { PrismicNextImageProps } from "./PrismicNextImage";
17
17
 
18
- export { PrismicNextRichText } from "./PrismicNextRichText";
19
- export type { PrismicNextRichTextProps } from "./PrismicNextRichText";
18
+ export { SliceSimulator, getSlices } from "./simulator";
19
+ export type {
20
+ SliceSimulatorProps,
21
+ SliceSimulatorSliceZoneProps,
22
+ SliceSimulatorParams,
23
+ } from "./simulator";
20
24
 
21
25
  export { imgixLoader } from "./imgixLoader";
22
26
 
@@ -4,9 +4,6 @@ export { type PrismicNextLinkProps } from "../PrismicNextLink";
4
4
  export { PrismicNextImage } from "../PrismicNextImage";
5
5
  export { type PrismicNextImageProps } from "../PrismicNextImage";
6
6
 
7
- export { PrismicNextRichText } from "../PrismicNextRichText";
8
- export { type PrismicNextRichTextProps } from "../PrismicNextRichText";
9
-
10
7
  export { imgixLoader } from "../imgixLoader";
11
8
 
12
9
  export { PrismicPreview } from "./PrismicPreview";
@@ -0,0 +1,112 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import type { ComponentType, FC } from "react";
5
+
6
+ import {
7
+ SimulatorManager,
8
+ StateEventType,
9
+ getDefaultMessage,
10
+ getDefaultSlices,
11
+ } from "@prismicio/simulator/kit";
12
+ import type {
13
+ SliceSimulatorProps as BaseSliceSimulatorProps,
14
+ SliceSimulatorState,
15
+ } from "@prismicio/simulator/kit";
16
+
17
+ import { SliceSimulatorWrapper } from "./SliceSimulatorWrapper";
18
+
19
+ const simulatorManager = new SimulatorManager();
20
+
21
+ export type SliceSimulatorSliceZoneProps = {
22
+ slices: SliceSimulatorState["slices"];
23
+ };
24
+
25
+ export type SliceSimulatorProps = {
26
+ className?: string;
27
+ } & Omit<BaseSliceSimulatorProps, "state"> &
28
+ (
29
+ | {
30
+ /**
31
+ * React component to render simulated Slices.
32
+ *
33
+ * @example
34
+ *
35
+ * ```tsx
36
+ * import { SliceSimulator } from "@slicemachine/adapter-next/simulator";
37
+ * import { SliceZone } from "@prismicio/react";
38
+ *
39
+ * import { components } from "../slices";
40
+ *
41
+ * <SliceSimulator
42
+ * sliceZone={({ slices }) => (
43
+ * <SliceZone slices={slices} components={components} />
44
+ * )}
45
+ * />;
46
+ * ```
47
+ */
48
+ sliceZone: ComponentType<SliceSimulatorSliceZoneProps>;
49
+ }
50
+ | {
51
+ children: React.ReactNode;
52
+ }
53
+ );
54
+
55
+ /**
56
+ * Simulate slices in isolation. The slice simulator enables live slice
57
+ * development in Slice Machine and live previews in the Page Builder.
58
+ */
59
+ export const SliceSimulator: FC<SliceSimulatorProps> = ({
60
+ background,
61
+ zIndex,
62
+ className,
63
+ ...restProps
64
+ }) => {
65
+ if (!("sliceZone" in restProps)) {
66
+ throw new Error(
67
+ "A sliceZone prop must be provided when <SliceZone> is rendered in a Client Component. Add a sliceZone prop or convert your simulator to a Server Component with the getSlices helper.",
68
+ );
69
+ }
70
+
71
+ const [slices, setSlices] = useState(() => getDefaultSlices());
72
+ const [message, setMessage] = useState(() => getDefaultMessage());
73
+
74
+ useEffect(() => {
75
+ simulatorManager.state.on(
76
+ StateEventType.Slices,
77
+ (_slices) => {
78
+ setSlices(_slices);
79
+ },
80
+ "simulator-slices",
81
+ );
82
+ simulatorManager.state.on(
83
+ StateEventType.Message,
84
+ (_message) => {
85
+ setMessage(_message);
86
+ },
87
+ "simulator-message",
88
+ );
89
+
90
+ simulatorManager.init();
91
+
92
+ return () => {
93
+ simulatorManager.state.off(StateEventType.Slices, "simulator-slices");
94
+
95
+ simulatorManager.state.off(StateEventType.Message, "simulator-message");
96
+ };
97
+ }, []);
98
+
99
+ const SliceZoneComp = restProps.sliceZone;
100
+
101
+ return (
102
+ <SliceSimulatorWrapper
103
+ message={message}
104
+ hasSlices={slices.length > 0}
105
+ background={background}
106
+ zIndex={zIndex}
107
+ className={className}
108
+ >
109
+ <SliceZoneComp slices={slices} />
110
+ </SliceSimulatorWrapper>
111
+ );
112
+ };
@@ -0,0 +1,68 @@
1
+ import type { FC, ReactNode } from "react";
2
+ import {
3
+ disableEventHandler,
4
+ getDefaultProps,
5
+ onClickHandler,
6
+ simulatorClass,
7
+ simulatorRootClass,
8
+ } from "@prismicio/simulator/kit";
9
+ import type { SliceSimulatorProps } from "./SliceSimulator";
10
+
11
+ type SliceSimulatorWrapperProps = {
12
+ children: ReactNode;
13
+ className?: string;
14
+ message?: string;
15
+ hasSlices: boolean;
16
+ } & Omit<SliceSimulatorProps, "state">;
17
+
18
+ /**
19
+ * A wrapper for the slice simulator that isolates the given children from the
20
+ * page's layout.
21
+ */
22
+ export const SliceSimulatorWrapper: FC<SliceSimulatorWrapperProps> = ({
23
+ className,
24
+ children,
25
+ zIndex,
26
+ background,
27
+ message,
28
+ hasSlices,
29
+ }) => {
30
+ const defaultProps = getDefaultProps();
31
+
32
+ return (
33
+ <div
34
+ className={[simulatorClass, className].filter(Boolean).join(" ")}
35
+ style={{
36
+ zIndex:
37
+ typeof zIndex === "undefined"
38
+ ? defaultProps.zIndex
39
+ : zIndex ?? undefined,
40
+ position: "fixed",
41
+ top: 0,
42
+ left: 0,
43
+ width: "100%",
44
+ height: "100vh",
45
+ overflow: "auto",
46
+ background:
47
+ typeof background === "undefined"
48
+ ? defaultProps.background
49
+ : background ?? undefined,
50
+ }}
51
+ >
52
+ {message ? (
53
+ <article dangerouslySetInnerHTML={{ __html: message }} />
54
+ ) : hasSlices ? (
55
+ <div
56
+ id="root"
57
+ className={simulatorRootClass}
58
+ onClickCapture={onClickHandler as unknown as React.MouseEventHandler}
59
+ onSubmitCapture={
60
+ disableEventHandler as unknown as React.FormEventHandler
61
+ }
62
+ >
63
+ {children}
64
+ </div>
65
+ ) : null}
66
+ </div>
67
+ );
68
+ };
@@ -0,0 +1,19 @@
1
+ import type { StateEvents, StateEventType } from "@prismicio/simulator/kit";
2
+
3
+ /**
4
+ * Returns the simulator's slices from the page's `searchParams.state` value.
5
+ * The `state` value is set by `<SliceSimulator>`.
6
+ *
7
+ * **Note**: `getSlices` should only be used in the App Router with a Server
8
+ * Component.
9
+ */
10
+ export const getSlices = (
11
+ state: string | null | undefined,
12
+ ): StateEvents[StateEventType.Slices] => {
13
+ // Prevent tsserver + eslint warnings about unused vars.
14
+ state;
15
+
16
+ throw new Error(
17
+ "getSlices is designed only for Server Components. Convert your simulator page to a Server Component or remove the function from your Client Component.",
18
+ );
19
+ };
@@ -0,0 +1,8 @@
1
+ export { SliceSimulator } from "./SliceSimulator";
2
+ export type {
3
+ SliceSimulatorProps,
4
+ SliceSimulatorSliceZoneProps,
5
+ } from "./SliceSimulator";
6
+
7
+ export { getSlices } from "./getSlices";
8
+ export type { SliceSimulatorParams } from "./types";
@@ -0,0 +1,86 @@
1
+ // This `<SliceSimulator>` is only accessible from Server Components.
2
+
3
+ "use client";
4
+
5
+ import { useEffect, useState } from "react";
6
+ import type { FC } from "react";
7
+
8
+ import { useRouter } from "next/navigation";
9
+ import {
10
+ SimulatorManager,
11
+ StateEventType,
12
+ getDefaultMessage,
13
+ } from "@prismicio/simulator/kit";
14
+ import type { SliceSimulatorProps as BaseSliceSimulatorProps } from "@prismicio/simulator/kit";
15
+ import { compressToEncodedURIComponent } from "lz-string";
16
+
17
+ import { SliceSimulatorWrapper } from "../SliceSimulatorWrapper";
18
+ import { getSlices } from "./getSlices";
19
+
20
+ const STATE_PARAMS_KEY = "state";
21
+
22
+ const simulatorManager = new SimulatorManager();
23
+
24
+ export type SliceSimulatorProps = Omit<BaseSliceSimulatorProps, "state"> & {
25
+ children: React.ReactNode;
26
+ className?: string;
27
+ };
28
+
29
+ export const SliceSimulator: FC<SliceSimulatorProps> = ({
30
+ children,
31
+ background,
32
+ zIndex,
33
+ className,
34
+ }) => {
35
+ const [message, setMessage] = useState(() => getDefaultMessage());
36
+ const router = useRouter();
37
+
38
+ const state =
39
+ typeof window !== "undefined"
40
+ ? new URL(window.location.href).searchParams.get(STATE_PARAMS_KEY)
41
+ : undefined;
42
+ const hasSlices = getSlices(state).length > 0;
43
+
44
+ useEffect(() => {
45
+ simulatorManager.state.on(
46
+ StateEventType.Slices,
47
+ (newSlices) => {
48
+ const url = new URL(window.location.href);
49
+ url.searchParams.set(
50
+ STATE_PARAMS_KEY,
51
+ compressToEncodedURIComponent(JSON.stringify(newSlices)),
52
+ );
53
+
54
+ window.history.replaceState(null, "", url);
55
+ // Wait until the next tick to prevent URL state race conditions.
56
+ setTimeout(() => router.refresh(), 0);
57
+ },
58
+ "simulator-slices",
59
+ );
60
+ simulatorManager.state.on(
61
+ StateEventType.Message,
62
+ (newMessage) => setMessage(newMessage),
63
+ "simulator-message",
64
+ );
65
+
66
+ simulatorManager.init();
67
+
68
+ return () => {
69
+ simulatorManager.state.off(StateEventType.Slices, "simulator-slices");
70
+
71
+ simulatorManager.state.off(StateEventType.Message, "simulator-message");
72
+ };
73
+ }, []);
74
+
75
+ return (
76
+ <SliceSimulatorWrapper
77
+ message={message}
78
+ hasSlices={hasSlices}
79
+ background={background}
80
+ zIndex={zIndex}
81
+ className={className}
82
+ >
83
+ {children}
84
+ </SliceSimulatorWrapper>
85
+ );
86
+ };
@@ -0,0 +1,13 @@
1
+ // This `getSlices` is only accessible from Server Components.
2
+
3
+ import { getDefaultSlices } from "@prismicio/simulator/kit";
4
+ import type { StateEvents, StateEventType } from "@prismicio/simulator/kit";
5
+ import { decompressFromEncodedURIComponent } from "lz-string";
6
+
7
+ export const getSlices = (
8
+ state: string | null | undefined,
9
+ ): StateEvents[StateEventType.Slices] => {
10
+ return state
11
+ ? JSON.parse(decompressFromEncodedURIComponent(state))
12
+ : getDefaultSlices();
13
+ };
@@ -0,0 +1,4 @@
1
+ // These exports are only accessible from Server Components.
2
+
3
+ export { SliceSimulator } from "./SliceSimulator";
4
+ export { getSlices } from "./getSlices";
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Parameters provided to the Slice Simulator page.
3
+ *
4
+ * **Note**: `SliceSimulatorParams` should only be used in the App Router with a
5
+ * Server Component.
6
+ */
7
+ export type SliceSimulatorParams = {
8
+ searchParams: Promise<{
9
+ state?: string;
10
+ }>;
11
+ };
@@ -1,34 +0,0 @@
1
- const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
- const require_PrismicNextLink = require('./PrismicNextLink.cjs');
3
- const require_PrismicNextImage = require('./PrismicNextImage.cjs');
4
- let react_jsx_runtime = require("react/jsx-runtime");
5
- let _prismicio_react = require("@prismicio/react");
6
-
7
- //#region src/PrismicNextRichText.tsx
8
- const defaultComponents = {
9
- image: ({ node }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10
- className: "block-img",
11
- children: node.linkTo ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PrismicNextLink.PrismicNextLink, {
12
- field: node.linkTo,
13
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PrismicNextImage.PrismicNextImage, { field: node })
14
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PrismicNextImage.PrismicNextImage, { field: node })
15
- }),
16
- hyperlink: ({ node, children }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PrismicNextLink.PrismicNextLink, {
17
- field: node.data,
18
- children
19
- })
20
- };
21
- const PrismicNextRichText = (props) => {
22
- const { components, ...restProps } = props;
23
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_prismicio_react.PrismicRichText, {
24
- components: {
25
- ...defaultComponents,
26
- ...components
27
- },
28
- ...restProps
29
- });
30
- };
31
-
32
- //#endregion
33
- exports.PrismicNextRichText = PrismicNextRichText;
34
- //# sourceMappingURL=PrismicNextRichText.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PrismicNextRichText.cjs","names":["PrismicNextLink","PrismicNextImage","PrismicRichText"],"sources":["../src/PrismicNextRichText.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { PrismicRichText } from \"@prismicio/react\";\nimport type { PrismicRichTextProps, JSXMapSerializer } from \"@prismicio/react\";\n\nimport { PrismicNextImage } from \"./PrismicNextImage\";\nimport { PrismicNextLink } from \"./PrismicNextLink\";\n\nexport type PrismicNextRichTextProps = Omit<\n\tPrismicRichTextProps,\n\t\"components\"\n> & {\n\tcomponents?: JSXMapSerializer;\n};\n\nconst defaultComponents: JSXMapSerializer = {\n\timage: ({ node }) => (\n\t\t<p className=\"block-img\">\n\t\t\t{node.linkTo ? (\n\t\t\t\t<PrismicNextLink field={node.linkTo}>\n\t\t\t\t\t<PrismicNextImage field={node} />\n\t\t\t\t</PrismicNextLink>\n\t\t\t) : (\n\t\t\t\t<PrismicNextImage field={node} />\n\t\t\t)}\n\t\t</p>\n\t),\n\thyperlink: ({ node, children }) => (\n\t\t<PrismicNextLink field={node.data}>{children}</PrismicNextLink>\n\t),\n};\n\nexport const PrismicNextRichText: FC<PrismicNextRichTextProps> = (props) => {\n\tconst { components, ...restProps } = props;\n\n\treturn (\n\t\t<PrismicRichText\n\t\t\tcomponents={{ ...defaultComponents, ...components }}\n\t\t\t{...restProps}\n\t\t/>\n\t);\n};\n"],"mappings":";;;;;;;AAcA,MAAM,oBAAsC;CAC3C,QAAQ,EAAE,WACT,2CAAC;EAAE,WAAU;YACX,KAAK,SACL,2CAACA;GAAgB,OAAO,KAAK;aAC5B,2CAACC,6CAAiB,OAAO,OAAQ;IAChB,GAElB,2CAACA,6CAAiB,OAAO,OAAQ;GAE/B;CAEL,YAAY,EAAE,MAAM,eACnB,2CAACD;EAAgB,OAAO,KAAK;EAAO;GAA2B;CAEhE;AAED,MAAa,uBAAqD,UAAU;CAC3E,MAAM,EAAE,YAAY,GAAG,cAAc;AAErC,QACC,2CAACE;EACA,YAAY;GAAE,GAAG;GAAmB,GAAG;GAAY;EACnD,GAAI;GACH"}
@@ -1,11 +0,0 @@
1
- import { FC } from "react";
2
- import { JSXMapSerializer, PrismicRichTextProps } from "@prismicio/react";
3
-
4
- //#region src/PrismicNextRichText.d.ts
5
- type PrismicNextRichTextProps = Omit<PrismicRichTextProps, "components"> & {
6
- components?: JSXMapSerializer;
7
- };
8
- declare const PrismicNextRichText: FC<PrismicNextRichTextProps>;
9
- //#endregion
10
- export { PrismicNextRichText, PrismicNextRichTextProps };
11
- //# sourceMappingURL=PrismicNextRichText.d.cts.map
@@ -1,41 +0,0 @@
1
- import type { FC } from "react";
2
- import { PrismicRichText } from "@prismicio/react";
3
- import type { PrismicRichTextProps, JSXMapSerializer } from "@prismicio/react";
4
-
5
- import { PrismicNextImage } from "./PrismicNextImage";
6
- import { PrismicNextLink } from "./PrismicNextLink";
7
-
8
- export type PrismicNextRichTextProps = Omit<
9
- PrismicRichTextProps,
10
- "components"
11
- > & {
12
- components?: JSXMapSerializer;
13
- };
14
-
15
- const defaultComponents: JSXMapSerializer = {
16
- image: ({ node }) => (
17
- <p className="block-img">
18
- {node.linkTo ? (
19
- <PrismicNextLink field={node.linkTo}>
20
- <PrismicNextImage field={node} />
21
- </PrismicNextLink>
22
- ) : (
23
- <PrismicNextImage field={node} />
24
- )}
25
- </p>
26
- ),
27
- hyperlink: ({ node, children }) => (
28
- <PrismicNextLink field={node.data}>{children}</PrismicNextLink>
29
- ),
30
- };
31
-
32
- export const PrismicNextRichText: FC<PrismicNextRichTextProps> = (props) => {
33
- const { components, ...restProps } = props;
34
-
35
- return (
36
- <PrismicRichText
37
- components={{ ...defaultComponents, ...components }}
38
- {...restProps}
39
- />
40
- );
41
- };