@atelier-disko/payload-lexical-react-renderer
TypeScript icon, indicating that this package has built-in type declarations

1.0.4 • Public • Published

@atelierdisko/payload-lexical-react-renderer

A react component for rendering the lexical editor state to jsx.

Installation

Install the latest version by running:

npm install @atelier-disko/payload-lexical-react-renderer

Usage

import {
  PayloadLexicalReactRenderer,
  PayloadLexicalReactRendererProps,
  PayloadLexicalReactRendererContent
} from "@atelier-disko/payload-lexical-react-renderer";

function MyBlog() {
  const content: PayloadLexicalReactRendererContent = await fetchLexicalEditorState();

  return (
    <div>
      <PayloadLexicalReactRenderer content={content} />
    </div>
  );
}

Get started by passing your Lexical rich text data to the component. It ships with default renderers that will only apply the most basic styling.

elementRenderers

In order to customize the rendered result, use the elementRenderers prop to override the default renderers:

import {
  PayloadLexicalReactRenderer,
  defaultElementRenderers,
} from "@atelier-disko/payload-lexical-react-renderer";

<PayloadLexicalReactRenderer
  content={content}
  elementRenderers={{
    ...defaultElementRenderers,
    heading: (props) => {
      const Component = props.tag;

      return (
        <Component style={{ color: "#0d26fc" }}>{props.children}</Component>
      );
    },
    paragraph: (props) => (
      <p className={/* Your style */}>{props.children}</p>
    );
  }}
/>;

Note: Make sure to assign a renderer for each element type being used in your editor.

renderMarks

To customize rendering of text marks like bold, italic etc., add your own renderMark function:

import { PayloadLexicalReactRenderer } from "@atelier-disko/payload-lexical-react-renderer";

<PayloadLexicalReactRenderer
  content={content}
  renderMark={(mark) => {
    if (mark.bold) {
      return <strong>{mark.text}</strong>;
    }

    if (mark.italic) {
      return <em>{mark.text}</em>;
    }

    // implement all other mark types

    return <>{mark.text}</>;
  }}
/>;

blockRenderers

Payload allows you to re-use your custom blocks in its Lexical rich text editor. If your CMS is not using the BlocksFeature inside the editor, you don't need to pass anything here. If you do, make sure to pass a renderer for each block you integrated into your editor.

import {
  BlockNode,
  PayloadLexicalReactRenderer,
} from "@atelier-disko/payload-lexical-react-renderer";

type Intro = {
  text: string;
  position: "left" | "right";
};

 <PayloadLexicalReactRenderer<{
    intro: Intro;
  }>
  content={content}
  blockRenderers={{
    intro: (props) => (
      <div
        style={{
          display: "flex",
          alignSelf:
            props.fields.data.position === "left"
              ? "flex-start"
              : "flex-end",
        }}
      >
        {props.fields.data.text}
      </div>
    ),
  }}
/>

Package Sidebar

Install

npm i @atelier-disko/payload-lexical-react-renderer

Weekly Downloads

462

Version

1.0.4

License

MIT

Unpacked Size

53.7 kB

Total Files

17

Last publish

Collaborators

  • 6mint
  • petrikoj
  • janjakubsasinka