UNPKG

@prismicio/react

Version:

React components and hooks to fetch and present Prismic content

80 lines (79 loc) 4.32 kB
import { jsx, Fragment } from "react/jsx-runtime"; import { isValidElement, cloneElement, Fragment as Fragment$1 } from "react"; import { isFilled } from "@prismicio/client"; import { composeSerializers, wrapMapSerializer, serialize } from "@prismicio/client/richtext"; import { DEV } from "esm-env"; import { devMsg } from "./lib/devMsg.js"; import { PrismicLink } from "./PrismicLink.js"; const getDir = (node) => { if ("direction" in node && node.direction === "rtl") { return "rtl"; } }; const createDefaultSerializer = (args) => wrapMapSerializer({ heading1: ({ node, children, key }) => jsx("h1", { dir: getDir(node), children }, key), heading2: ({ node, children, key }) => jsx("h2", { dir: getDir(node), children }, key), heading3: ({ node, children, key }) => jsx("h3", { dir: getDir(node), children }, key), heading4: ({ node, children, key }) => jsx("h4", { dir: getDir(node), children }, key), heading5: ({ node, children, key }) => jsx("h5", { dir: getDir(node), children }, key), heading6: ({ node, children, key }) => jsx("h6", { dir: getDir(node), children }, key), paragraph: ({ node, children, key }) => jsx("p", { dir: getDir(node), children }, key), preformatted: ({ node, key }) => jsx("pre", { children: node.text }, key), strong: ({ children, key }) => jsx("strong", { children }, key), em: ({ children, key }) => jsx("em", { children }, key), listItem: ({ node, children, key }) => jsx("li", { dir: getDir(node), children }, key), oListItem: ({ node, children, key }) => jsx("li", { dir: getDir(node), children }, key), list: ({ children, key }) => jsx("ul", { children }, key), oList: ({ children, key }) => jsx("ol", { children }, key), image: ({ node, key }) => { const img = jsx("img", { src: node.url, alt: node.alt ?? void 0, "data-copyright": node.copyright ? node.copyright : void 0 }); return jsx("p", { className: "block-img", children: node.linkTo ? jsx(PrismicLink, { linkResolver: args.linkResolver, internalComponent: args.internalLinkComponent, externalComponent: args.externalLinkComponent, field: node.linkTo, children: img }) : img }, key); }, embed: ({ node, key }) => jsx("div", { "data-oembed": node.oembed.embed_url, "data-oembed-type": node.oembed.type, "data-oembed-provider": node.oembed.provider_name, dangerouslySetInnerHTML: { __html: node.oembed.html ?? "" } }, key), hyperlink: ({ node, children, key }) => jsx(PrismicLink, { field: node.data, linkResolver: args.linkResolver, internalComponent: args.internalLinkComponent, externalComponent: args.externalLinkComponent, children }, key), label: ({ node, children, key }) => jsx("span", { className: node.data.label, children }, key), span: ({ text, key }) => { const result = []; let i = 0; for (const line of text.split("\n")) { if (i > 0) { result.push(jsx("br", {}, `${i}__break`)); } result.push(jsx(Fragment$1, { children: line }, `${i}__line`)); i++; } return jsx(Fragment$1, { children: result }, key); } }); const PrismicRichText = (props) => { const { linkResolver, field, fallback, components, externalLinkComponent, internalLinkComponent, ...restProps } = props; if (DEV) { if ("className" in restProps) { console.warn(`[PrismicRichText] className cannot be passed to <PrismicRichText> since it renders an array without a wrapping component. For more details, see ${devMsg("classname-is-not-a-valid-prop")}.`, field); } } if (!isFilled.richText(field)) { return fallback != null ? jsx(Fragment, { children: fallback }) : null; } const serializer = composeSerializers(typeof components === "object" ? wrapMapSerializer(components) : components, createDefaultSerializer({ linkResolver, internalLinkComponent, externalLinkComponent })); const serialized = serialize(field, (type, node, text, children, key) => { const result = serializer(type, node, text, children, key); if (isValidElement(result) && result.key == null) { return cloneElement(result, { key }); } else { return result; } }); if (!serialized) { return fallback != null ? jsx(Fragment, { children: fallback }) : null; } return jsx(Fragment, { children: serialized }); }; export { PrismicRichText }; //# sourceMappingURL=PrismicRichText.js.map