Security News
RubyGems.org Adds New Maintainer Role
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
react-portable-text
Advanced tools
An easy way to render Portable Text block content in React applications.
An easy way to render Portable Text block content in React applications.
yarn add react-portable-text
import PortableText from "react-portable-text"
const YourComponent = ({ portableTextContent }) => (
<div>
<PortableText
// Pass in block content straight from Sanity.io
content={portableTextContent}
// Optionally override marks, decorators, blocks, etc. in a flat
// structure without doing any gymnastics
serializers={{
h1: (props) => <h1 style={{ color: "red" }} {...props} />,
li: ({ children }) => <li className="special-list-item">{children}</li>,
someCustomType: YourComponent,
}}
/>
</div>
)
I found it difficult to create abstractions on top of
@sanity/block-content-to-react.
Remembering whether a serializer needed to be codified as a type
, a mark
, or
as something under block
was challenging, and the special treatment for lists
and list items was confusing. Further, the props being wrapped in an object
under the node
property, or extraneous props for mark
types meant I was
creating intermediate component types just to avoid passing invalid props to the
React elements (otherwise they render in the DOM).
React Portable Text uses @sanity/block-content-to-react
under the hood, but
maps each of these types to the correct place in the serializers for you and
normalizing props to match the fields supplied by users in your Sanity Studio,
simplifying the cognitive load required to author new ones.
React Portable Text maps the following types explicitly, and treats all other
properties of the serializers
object as custom types. Custom types are used
for both type
and block
blocks (i.e. custom marks as well as custom
block-level insertion types).
Serializer | Notes |
---|---|
Marks | |
link | All link marks used for anchor links |
strong | Bold/strong text |
em | Emphasized/italic text |
underline | Underlined text |
del | Text with strikethrough styles |
code | Inline text with code styling |
Lists | |
ul | Unordered lists |
ol | Ordered lists |
li | List items for any type of list |
Blocks | |
h1 | Heading level 1 |
h2 | Heading level 2 |
h3 | Heading level 3 |
h4 | Heading level 4 |
h5 | Heading level 5 |
h6 | Heading level 6 |
normal | Paragraph styles |
blockquote | Blockquote styles |
Special Types | |
container | Override the component wrapping the blocks |
block | Override the default block serializer (not recommended) |
span | Override the default span serializer (not recommended) |
hardBreak | Serializer for newlines; defaults to br ; pass false to preserve newlines |
unknownType | Fallback for blocks of unknown type, if ignoreUnknownTypes is set to false (default) |
unknownMark | Fallback for marks of unknown type; defaults to a plain span |
Additional props are passed through to @sanity/block-content-to-react
, so if
you want to configure imageOptions
or set the projectId
and dataset
options you can just pass them directly to React Portable Text:
<PortableText
content={blockContent}
projectId={process.env.SANITY_PROJECT_ID}
dataset={process.env.SANITY_DATASET}
/>
As a bonus, react-portable-text
offers a function that will render your
portable text content to a plaintext string. This is often useful for previews
and such in the Studio and for ancillary uses of content in contexts where
formatting is not supported (e.g. calendar invite descriptions, meta tags,
etc.).
import { blockContentToPlainText } from "react-portable-text"
const MetaDescription = ({ content }) => (
<meta name="description" content={blockContentToPlainText(content)} />
)
Did I miss something? Is something not compatible with your setup? Open an issue with details, and if possible, a CodeSandbox reproduction. Pull requests are also welcomed!
Copyright ©2022 Corey Ward. Available under the MIT License.
FAQs
An easy way to render Portable Text block content in React applications.
The npm package react-portable-text receives a total of 1,426 weekly downloads. As such, react-portable-text popularity was classified as popular.
We found that react-portable-text demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.
Security News
Research
Socket's threat research team has detected five malicious npm packages targeting Roblox developers, deploying malware to steal credentials and personal data.