@01.software/sdk 0.22.0 → 0.24.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/README.md +101 -71
- package/dist/analytics.cjs.map +1 -1
- package/dist/analytics.js.map +1 -1
- package/dist/const-CMdmNgEs.d.ts +34 -0
- package/dist/const-Cgd4op4V.d.cts +34 -0
- package/dist/index.cjs +50 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/{payload-types-DeLBmtzd.d.cts → payload-types-D8-G1PiT.d.cts} +129 -8
- package/dist/{payload-types-DeLBmtzd.d.ts → payload-types-D8-G1PiT.d.ts} +129 -8
- package/dist/realtime.cjs.map +1 -1
- package/dist/realtime.d.cts +2 -2
- package/dist/realtime.d.ts +2 -2
- package/dist/realtime.js.map +1 -1
- package/dist/{server-BARh_6zH.d.ts → server-D7FcHj7J.d.ts} +35 -12
- package/dist/{server-BcQr-nGn.d.cts → server-DJcDyOmM.d.cts} +35 -12
- package/dist/server.cjs +9 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +4 -4
- package/dist/server.d.ts +4 -4
- package/dist/server.js +9 -1
- package/dist/server.js.map +1 -1
- package/dist/{types-D7iFEsPc.d.cts → types-BQqfXbB2.d.ts} +18 -2
- package/dist/{types-KkuKwsli.d.ts → types-C_kwEIvY.d.cts} +18 -2
- package/dist/ui/code-block.cjs.map +1 -1
- package/dist/ui/code-block.js.map +1 -1
- package/dist/ui/form.d.cts +1 -1
- package/dist/ui/form.d.ts +1 -1
- package/dist/ui/rich-text.cjs +170 -10
- package/dist/ui/rich-text.cjs.map +1 -1
- package/dist/ui/rich-text.d.cts +22 -3
- package/dist/ui/rich-text.d.ts +22 -3
- package/dist/ui/rich-text.js +165 -5
- package/dist/ui/rich-text.js.map +1 -1
- package/dist/ui/video.d.cts +1 -1
- package/dist/ui/video.d.ts +1 -1
- package/dist/webhook.d.cts +3 -3
- package/dist/webhook.d.ts +3 -3
- package/package.json +5 -4
- package/dist/const-CfcjPbOu.d.ts +0 -24
- package/dist/const-DraU44bA.d.cts +0 -24
|
@@ -1,9 +1,24 @@
|
|
|
1
|
-
import { C as CustomerProfile, P as Post,
|
|
1
|
+
import { C as CustomerProfile, a as CustomerProfileList, P as Post, b as Comment, R as Reaction, c as Config } from './payload-types-D8-G1PiT.js';
|
|
2
2
|
|
|
3
3
|
type PublicCustomerProfile = Omit<CustomerProfile, 'tenant' | 'customer' | 'isPublic' | 'anonymizedAt' | 'metadata'>;
|
|
4
4
|
type PublicProfileRelation = string | PublicCustomerProfile;
|
|
5
|
+
type PublicCustomerProfileListEntry = {
|
|
6
|
+
profile: PublicCustomerProfile;
|
|
7
|
+
rank: number;
|
|
8
|
+
label?: string | null;
|
|
9
|
+
caption?: string | null;
|
|
10
|
+
score?: number | null;
|
|
11
|
+
badgeColor?: string | null;
|
|
12
|
+
badgeImage?: CustomerProfileList['entries'] extends Array<infer Entry> ? Entry extends {
|
|
13
|
+
badgeImage?: infer Image;
|
|
14
|
+
} ? Image : unknown : unknown;
|
|
15
|
+
publicMetadata?: unknown;
|
|
16
|
+
};
|
|
17
|
+
type PublicCustomerProfileList = Omit<CustomerProfileList, 'tenant' | 'visibility' | 'metadata' | 'entries'> & {
|
|
18
|
+
entries?: PublicCustomerProfileListEntry[] | null;
|
|
19
|
+
};
|
|
5
20
|
type PublicPost = Omit<Post, 'authorProfile' | 'lastCommentByProfile'> & {
|
|
6
|
-
authorProfile
|
|
21
|
+
authorProfile?: PublicProfileRelation | null;
|
|
7
22
|
lastCommentByProfile?: PublicProfileRelation | null;
|
|
8
23
|
};
|
|
9
24
|
type PublicComment = Omit<Comment, 'authorProfile'> & {
|
|
@@ -14,6 +29,7 @@ type PublicReaction = Omit<Reaction, 'actorProfile'> & {
|
|
|
14
29
|
};
|
|
15
30
|
type PublicCollectionOverrides = {
|
|
16
31
|
'customer-profiles': PublicCustomerProfile;
|
|
32
|
+
'customer-profile-lists': PublicCustomerProfileList;
|
|
17
33
|
posts: PublicPost;
|
|
18
34
|
comments: PublicComment;
|
|
19
35
|
reactions: PublicReaction;
|
|
@@ -1,9 +1,24 @@
|
|
|
1
|
-
import { C as CustomerProfile, P as Post,
|
|
1
|
+
import { C as CustomerProfile, a as CustomerProfileList, P as Post, b as Comment, R as Reaction, c as Config } from './payload-types-D8-G1PiT.cjs';
|
|
2
2
|
|
|
3
3
|
type PublicCustomerProfile = Omit<CustomerProfile, 'tenant' | 'customer' | 'isPublic' | 'anonymizedAt' | 'metadata'>;
|
|
4
4
|
type PublicProfileRelation = string | PublicCustomerProfile;
|
|
5
|
+
type PublicCustomerProfileListEntry = {
|
|
6
|
+
profile: PublicCustomerProfile;
|
|
7
|
+
rank: number;
|
|
8
|
+
label?: string | null;
|
|
9
|
+
caption?: string | null;
|
|
10
|
+
score?: number | null;
|
|
11
|
+
badgeColor?: string | null;
|
|
12
|
+
badgeImage?: CustomerProfileList['entries'] extends Array<infer Entry> ? Entry extends {
|
|
13
|
+
badgeImage?: infer Image;
|
|
14
|
+
} ? Image : unknown : unknown;
|
|
15
|
+
publicMetadata?: unknown;
|
|
16
|
+
};
|
|
17
|
+
type PublicCustomerProfileList = Omit<CustomerProfileList, 'tenant' | 'visibility' | 'metadata' | 'entries'> & {
|
|
18
|
+
entries?: PublicCustomerProfileListEntry[] | null;
|
|
19
|
+
};
|
|
5
20
|
type PublicPost = Omit<Post, 'authorProfile' | 'lastCommentByProfile'> & {
|
|
6
|
-
authorProfile
|
|
21
|
+
authorProfile?: PublicProfileRelation | null;
|
|
7
22
|
lastCommentByProfile?: PublicProfileRelation | null;
|
|
8
23
|
};
|
|
9
24
|
type PublicComment = Omit<Comment, 'authorProfile'> & {
|
|
@@ -14,6 +29,7 @@ type PublicReaction = Omit<Reaction, 'actorProfile'> & {
|
|
|
14
29
|
};
|
|
15
30
|
type PublicCollectionOverrides = {
|
|
16
31
|
'customer-profiles': PublicCustomerProfile;
|
|
32
|
+
'customer-profile-lists': PublicCustomerProfileList;
|
|
17
33
|
posts: PublicPost;
|
|
18
34
|
comments: PublicComment;
|
|
19
35
|
reactions: PublicReaction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/CodeBlock/index.tsx","../../src/ui/CodeBlock/highlight.ts"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useRef, useState, type JSX } from 'react'\nimport { highlight, type BundledTheme } from './highlight'\n\nexport type { BundledTheme }\nexport { highlight }\n\nexport interface CodeBlockProps {\n /** Code string to highlight */\n code: string\n /** Language identifier (e.g. 'typescript', 'js', 'python') */\n language?: string\n /** Shiki theme name. Default: 'github-dark' */\n theme?: BundledTheme\n /** CSS class for the wrapper */\n className?: string\n /** Pre-rendered JSX from server component via `highlight()` */\n initial?: JSX.Element\n /** Show line numbers. Default: false */\n showLineNumbers?: boolean\n /** Show copy button. Default: true */\n showCopyButton?: boolean\n}\n\n/**\n * Syntax-highlighted code block using shiki.\n *\n * @example Basic usage\n * ```tsx\n * <CodeBlock code=\"const x = 1\" language=\"typescript\" />\n * ```\n *\n * @example With server pre-rendering (Next.js)\n * ```tsx\n * // Server Component\n * const initial = await highlight(code, 'typescript')\n * return <CodeBlock code={code} language=\"typescript\" initial={initial} />\n * ```\n *\n * @example As RichTextContent block renderer\n * ```tsx\n * <RichTextContent\n * data={data}\n * blocks={{\n * Code: ({ node }) => (\n * <CodeBlock code={node.fields.code} language={node.fields.language} />\n * ),\n * }}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n theme = 'github-dark',\n className,\n initial,\n showLineNumbers = false,\n showCopyButton = true,\n}: CodeBlockProps) {\n const [nodes, setNodes] = useState<JSX.Element | undefined>(initial)\n const [copied, setCopied] = useState(false)\n const initialCodeRef = useRef(code)\n const initialNodesRef = useRef(initial)\n\n useEffect(() => {\n // Skip re-highlighting if server pre-rendered and code hasn't changed\n if (initial && code === initialCodeRef.current && initialNodesRef.current === initial) {\n initialNodesRef.current = undefined\n return\n }\n\n let cancelled = false\n void highlight(code, language, theme).then((el) => {\n if (!cancelled) setNodes(el)\n })\n return () => {\n cancelled = true\n }\n }, [code, language, theme, initial])\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code).then(\n () => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n },\n () => {},\n )\n }\n\n return (\n <div className={className} style={{ position: 'relative' }}>\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 1,\n padding: '4px 8px',\n fontSize: 12,\n lineHeight: 1,\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: 4,\n background: 'rgba(0,0,0,0.3)',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n }}\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n {showLineNumbers && nodes ? (\n <div style={{ display: 'flex' }}>\n <div\n aria-hidden\n style={{\n padding: '1em 0.5em 1em 1em',\n textAlign: 'right',\n userSelect: 'none',\n color: 'rgba(255,255,255,0.3)',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n {code.split('\\n').map((_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>{nodes}</div>\n </div>\n ) : (\n (nodes ?? (\n <pre\n style={{\n margin: 0,\n padding: '1em',\n overflow: 'auto',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n <code>{code}</code>\n </pre>\n ))\n )}\n </div>\n )\n}\n","import type { JSX } from 'react'\nimport { Fragment } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { codeToHast, type
|
|
1
|
+
{"version":3,"sources":["../../src/ui/CodeBlock/index.tsx","../../src/ui/CodeBlock/highlight.ts"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useRef, useState, type JSX } from 'react'\nimport { highlight, type BundledTheme } from './highlight'\n\nexport type { BundledTheme }\nexport { highlight }\n\nexport interface CodeBlockProps {\n /** Code string to highlight */\n code: string\n /** Language identifier (e.g. 'typescript', 'js', 'python') */\n language?: string\n /** Shiki theme name. Default: 'github-dark' */\n theme?: BundledTheme\n /** CSS class for the wrapper */\n className?: string\n /** Pre-rendered JSX from server component via `highlight()` */\n initial?: JSX.Element\n /** Show line numbers. Default: false */\n showLineNumbers?: boolean\n /** Show copy button. Default: true */\n showCopyButton?: boolean\n}\n\n/**\n * Syntax-highlighted code block using shiki.\n *\n * @example Basic usage\n * ```tsx\n * <CodeBlock code=\"const x = 1\" language=\"typescript\" />\n * ```\n *\n * @example With server pre-rendering (Next.js)\n * ```tsx\n * // Server Component\n * const initial = await highlight(code, 'typescript')\n * return <CodeBlock code={code} language=\"typescript\" initial={initial} />\n * ```\n *\n * @example As RichTextContent block renderer\n * ```tsx\n * <RichTextContent\n * data={data}\n * blocks={{\n * Code: ({ node }) => (\n * <CodeBlock code={node.fields.code} language={node.fields.language} />\n * ),\n * }}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n theme = 'github-dark',\n className,\n initial,\n showLineNumbers = false,\n showCopyButton = true,\n}: CodeBlockProps) {\n const [nodes, setNodes] = useState<JSX.Element | undefined>(initial)\n const [copied, setCopied] = useState(false)\n const initialCodeRef = useRef(code)\n const initialNodesRef = useRef(initial)\n\n useEffect(() => {\n // Skip re-highlighting if server pre-rendered and code hasn't changed\n if (initial && code === initialCodeRef.current && initialNodesRef.current === initial) {\n initialNodesRef.current = undefined\n return\n }\n\n let cancelled = false\n void highlight(code, language, theme).then((el) => {\n if (!cancelled) setNodes(el)\n })\n return () => {\n cancelled = true\n }\n }, [code, language, theme, initial])\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code).then(\n () => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n },\n () => {},\n )\n }\n\n return (\n <div className={className} style={{ position: 'relative' }}>\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 1,\n padding: '4px 8px',\n fontSize: 12,\n lineHeight: 1,\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: 4,\n background: 'rgba(0,0,0,0.3)',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n }}\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n {showLineNumbers && nodes ? (\n <div style={{ display: 'flex' }}>\n <div\n aria-hidden\n style={{\n padding: '1em 0.5em 1em 1em',\n textAlign: 'right',\n userSelect: 'none',\n color: 'rgba(255,255,255,0.3)',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n {code.split('\\n').map((_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>{nodes}</div>\n </div>\n ) : (\n (nodes ?? (\n <pre\n style={{\n margin: 0,\n padding: '1em',\n overflow: 'auto',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n <code>{code}</code>\n </pre>\n ))\n )}\n </div>\n )\n}\n","import type { JSX } from 'react'\nimport { Fragment } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { codeToHast, type BundledTheme } from 'shiki'\n\nexport type { BundledLanguage, BundledTheme } from 'shiki'\n\ntype CodeToHastOptions = Parameters<typeof codeToHast>[1]\ntype HighlightLanguage = CodeToHastOptions['lang']\n\n/** Normalize language aliases to shiki-compatible language IDs */\nconst LANGUAGE_ALIASES: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n py: 'python',\n rb: 'ruby',\n plaintext: 'text',\n}\n\nfunction normalizeLanguage(lang: string): string {\n return LANGUAGE_ALIASES[lang] || lang\n}\n\n/**\n * Highlight code to JSX using shiki.\n * Works in both Server and Client components.\n *\n * @example Server Component\n * ```tsx\n * const highlighted = await highlight('const x = 1', 'typescript')\n * return <div>{highlighted}</div>\n * ```\n */\nexport async function highlight(\n code: string,\n lang: string,\n theme: BundledTheme = 'github-dark',\n): Promise<JSX.Element> {\n const normalized = normalizeLanguage(lang)\n try {\n const hast = await codeToHast(code, {\n lang: normalized as HighlightLanguage,\n theme,\n })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n } catch {\n // Fallback to plain text if language is not supported\n const hast = await codeToHast(code, { lang: 'text', theme })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n }\n}\n"],"mappings":"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","names":["import_react","React"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/CodeBlock/index.tsx","../../src/ui/CodeBlock/highlight.ts"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useRef, useState, type JSX } from 'react'\nimport { highlight, type BundledTheme } from './highlight'\n\nexport type { BundledTheme }\nexport { highlight }\n\nexport interface CodeBlockProps {\n /** Code string to highlight */\n code: string\n /** Language identifier (e.g. 'typescript', 'js', 'python') */\n language?: string\n /** Shiki theme name. Default: 'github-dark' */\n theme?: BundledTheme\n /** CSS class for the wrapper */\n className?: string\n /** Pre-rendered JSX from server component via `highlight()` */\n initial?: JSX.Element\n /** Show line numbers. Default: false */\n showLineNumbers?: boolean\n /** Show copy button. Default: true */\n showCopyButton?: boolean\n}\n\n/**\n * Syntax-highlighted code block using shiki.\n *\n * @example Basic usage\n * ```tsx\n * <CodeBlock code=\"const x = 1\" language=\"typescript\" />\n * ```\n *\n * @example With server pre-rendering (Next.js)\n * ```tsx\n * // Server Component\n * const initial = await highlight(code, 'typescript')\n * return <CodeBlock code={code} language=\"typescript\" initial={initial} />\n * ```\n *\n * @example As RichTextContent block renderer\n * ```tsx\n * <RichTextContent\n * data={data}\n * blocks={{\n * Code: ({ node }) => (\n * <CodeBlock code={node.fields.code} language={node.fields.language} />\n * ),\n * }}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n theme = 'github-dark',\n className,\n initial,\n showLineNumbers = false,\n showCopyButton = true,\n}: CodeBlockProps) {\n const [nodes, setNodes] = useState<JSX.Element | undefined>(initial)\n const [copied, setCopied] = useState(false)\n const initialCodeRef = useRef(code)\n const initialNodesRef = useRef(initial)\n\n useEffect(() => {\n // Skip re-highlighting if server pre-rendered and code hasn't changed\n if (initial && code === initialCodeRef.current && initialNodesRef.current === initial) {\n initialNodesRef.current = undefined\n return\n }\n\n let cancelled = false\n void highlight(code, language, theme).then((el) => {\n if (!cancelled) setNodes(el)\n })\n return () => {\n cancelled = true\n }\n }, [code, language, theme, initial])\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code).then(\n () => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n },\n () => {},\n )\n }\n\n return (\n <div className={className} style={{ position: 'relative' }}>\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 1,\n padding: '4px 8px',\n fontSize: 12,\n lineHeight: 1,\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: 4,\n background: 'rgba(0,0,0,0.3)',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n }}\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n {showLineNumbers && nodes ? (\n <div style={{ display: 'flex' }}>\n <div\n aria-hidden\n style={{\n padding: '1em 0.5em 1em 1em',\n textAlign: 'right',\n userSelect: 'none',\n color: 'rgba(255,255,255,0.3)',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n {code.split('\\n').map((_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>{nodes}</div>\n </div>\n ) : (\n (nodes ?? (\n <pre\n style={{\n margin: 0,\n padding: '1em',\n overflow: 'auto',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n <code>{code}</code>\n </pre>\n ))\n )}\n </div>\n )\n}\n","import type { JSX } from 'react'\nimport { Fragment } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { codeToHast, type
|
|
1
|
+
{"version":3,"sources":["../../src/ui/CodeBlock/index.tsx","../../src/ui/CodeBlock/highlight.ts"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useRef, useState, type JSX } from 'react'\nimport { highlight, type BundledTheme } from './highlight'\n\nexport type { BundledTheme }\nexport { highlight }\n\nexport interface CodeBlockProps {\n /** Code string to highlight */\n code: string\n /** Language identifier (e.g. 'typescript', 'js', 'python') */\n language?: string\n /** Shiki theme name. Default: 'github-dark' */\n theme?: BundledTheme\n /** CSS class for the wrapper */\n className?: string\n /** Pre-rendered JSX from server component via `highlight()` */\n initial?: JSX.Element\n /** Show line numbers. Default: false */\n showLineNumbers?: boolean\n /** Show copy button. Default: true */\n showCopyButton?: boolean\n}\n\n/**\n * Syntax-highlighted code block using shiki.\n *\n * @example Basic usage\n * ```tsx\n * <CodeBlock code=\"const x = 1\" language=\"typescript\" />\n * ```\n *\n * @example With server pre-rendering (Next.js)\n * ```tsx\n * // Server Component\n * const initial = await highlight(code, 'typescript')\n * return <CodeBlock code={code} language=\"typescript\" initial={initial} />\n * ```\n *\n * @example As RichTextContent block renderer\n * ```tsx\n * <RichTextContent\n * data={data}\n * blocks={{\n * Code: ({ node }) => (\n * <CodeBlock code={node.fields.code} language={node.fields.language} />\n * ),\n * }}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n theme = 'github-dark',\n className,\n initial,\n showLineNumbers = false,\n showCopyButton = true,\n}: CodeBlockProps) {\n const [nodes, setNodes] = useState<JSX.Element | undefined>(initial)\n const [copied, setCopied] = useState(false)\n const initialCodeRef = useRef(code)\n const initialNodesRef = useRef(initial)\n\n useEffect(() => {\n // Skip re-highlighting if server pre-rendered and code hasn't changed\n if (initial && code === initialCodeRef.current && initialNodesRef.current === initial) {\n initialNodesRef.current = undefined\n return\n }\n\n let cancelled = false\n void highlight(code, language, theme).then((el) => {\n if (!cancelled) setNodes(el)\n })\n return () => {\n cancelled = true\n }\n }, [code, language, theme, initial])\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code).then(\n () => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n },\n () => {},\n )\n }\n\n return (\n <div className={className} style={{ position: 'relative' }}>\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 1,\n padding: '4px 8px',\n fontSize: 12,\n lineHeight: 1,\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: 4,\n background: 'rgba(0,0,0,0.3)',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n }}\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n {showLineNumbers && nodes ? (\n <div style={{ display: 'flex' }}>\n <div\n aria-hidden\n style={{\n padding: '1em 0.5em 1em 1em',\n textAlign: 'right',\n userSelect: 'none',\n color: 'rgba(255,255,255,0.3)',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n {code.split('\\n').map((_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>{nodes}</div>\n </div>\n ) : (\n (nodes ?? (\n <pre\n style={{\n margin: 0,\n padding: '1em',\n overflow: 'auto',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n <code>{code}</code>\n </pre>\n ))\n )}\n </div>\n )\n}\n","import type { JSX } from 'react'\nimport { Fragment } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { codeToHast, type BundledTheme } from 'shiki'\n\nexport type { BundledLanguage, BundledTheme } from 'shiki'\n\ntype CodeToHastOptions = Parameters<typeof codeToHast>[1]\ntype HighlightLanguage = CodeToHastOptions['lang']\n\n/** Normalize language aliases to shiki-compatible language IDs */\nconst LANGUAGE_ALIASES: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n py: 'python',\n rb: 'ruby',\n plaintext: 'text',\n}\n\nfunction normalizeLanguage(lang: string): string {\n return LANGUAGE_ALIASES[lang] || lang\n}\n\n/**\n * Highlight code to JSX using shiki.\n * Works in both Server and Client components.\n *\n * @example Server Component\n * ```tsx\n * const highlighted = await highlight('const x = 1', 'typescript')\n * return <div>{highlighted}</div>\n * ```\n */\nexport async function highlight(\n code: string,\n lang: string,\n theme: BundledTheme = 'github-dark',\n): Promise<JSX.Element> {\n const normalized = normalizeLanguage(lang)\n try {\n const hast = await codeToHast(code, {\n lang: normalized as HighlightLanguage,\n theme,\n })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n } catch {\n // Fallback to plain text if language is not supported\n const hast = await codeToHast(code, { lang: 'text', theme })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/ui/form.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { F as Form } from '../payload-types-
|
|
2
|
+
import { F as Form } from '../payload-types-D8-G1PiT.cjs';
|
|
3
3
|
import { RichTextData } from './rich-text.cjs';
|
|
4
4
|
import '@payloadcms/richtext-lexical';
|
|
5
5
|
import '@payloadcms/richtext-lexical/lexical';
|
package/dist/ui/form.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { F as Form } from '../payload-types-
|
|
2
|
+
import { F as Form } from '../payload-types-D8-G1PiT.js';
|
|
3
3
|
import { RichTextData } from './rich-text.js';
|
|
4
4
|
import '@payloadcms/richtext-lexical';
|
|
5
5
|
import '@payloadcms/richtext-lexical/lexical';
|
package/dist/ui/rich-text.cjs
CHANGED
|
@@ -32,11 +32,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
32
32
|
var RichText_exports = {};
|
|
33
33
|
__export(RichText_exports, {
|
|
34
34
|
RichTextContent: () => RichTextContent,
|
|
35
|
-
StyledRichTextContent: () => StyledRichTextContent
|
|
35
|
+
StyledRichTextContent: () => StyledRichTextContent,
|
|
36
|
+
richTextNodeMap: () => richTextNodeMap,
|
|
37
|
+
richTextTextState: () => richTextTextState,
|
|
38
|
+
richTextViewMap: () => richTextViewMap
|
|
36
39
|
});
|
|
37
40
|
module.exports = __toCommonJS(RichText_exports);
|
|
38
|
-
var
|
|
39
|
-
var
|
|
41
|
+
var import_react3 = __toESM(require("react"), 1);
|
|
42
|
+
var import_react4 = require("@payloadcms/richtext-lexical/react");
|
|
40
43
|
|
|
41
44
|
// src/ui/RichText/styled.tsx
|
|
42
45
|
var import_react = __toESM(require("react"), 1);
|
|
@@ -177,12 +180,167 @@ function StyledRichTextContent({
|
|
|
177
180
|
);
|
|
178
181
|
}
|
|
179
182
|
|
|
183
|
+
// src/ui/RichText/views.tsx
|
|
184
|
+
var import_react2 = __toESM(require("react"), 1);
|
|
185
|
+
function getBlockFields(props) {
|
|
186
|
+
return props.formData;
|
|
187
|
+
}
|
|
188
|
+
function CodeView(props) {
|
|
189
|
+
const fields = getBlockFields(props);
|
|
190
|
+
const code = fields.code ?? "";
|
|
191
|
+
const language = fields.language ?? "plaintext";
|
|
192
|
+
if (props.isEditor) {
|
|
193
|
+
const { BlockCollapsible } = props.useBlockComponentContext();
|
|
194
|
+
return /* @__PURE__ */ import_react2.default.createElement(BlockCollapsible, { className: props.className }, /* @__PURE__ */ import_react2.default.createElement("pre", { style: { margin: 0, overflow: "auto", whiteSpace: "pre-wrap" } }, /* @__PURE__ */ import_react2.default.createElement("code", { "data-language": language }, code)));
|
|
195
|
+
}
|
|
196
|
+
return /* @__PURE__ */ import_react2.default.createElement("pre", { style: { overflow: "auto", whiteSpace: "pre-wrap" } }, /* @__PURE__ */ import_react2.default.createElement("code", { "data-language": language }, code));
|
|
197
|
+
}
|
|
198
|
+
function IframeView(props) {
|
|
199
|
+
const fields = getBlockFields(props);
|
|
200
|
+
const url = fields.url ?? "";
|
|
201
|
+
const width = fields.width ?? void 0;
|
|
202
|
+
const height = fields.height ?? void 0;
|
|
203
|
+
if (!url) return null;
|
|
204
|
+
if (props.isEditor) {
|
|
205
|
+
const { BlockCollapsible } = props.useBlockComponentContext();
|
|
206
|
+
return /* @__PURE__ */ import_react2.default.createElement(BlockCollapsible, { className: props.className }, /* @__PURE__ */ import_react2.default.createElement(
|
|
207
|
+
"iframe",
|
|
208
|
+
{
|
|
209
|
+
src: url,
|
|
210
|
+
title: fields.blockName ?? "Embedded content",
|
|
211
|
+
width,
|
|
212
|
+
height,
|
|
213
|
+
style: {
|
|
214
|
+
aspectRatio: width && height ? `${width} / ${height}` : "16 / 9",
|
|
215
|
+
width: "100%"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
));
|
|
219
|
+
}
|
|
220
|
+
return /* @__PURE__ */ import_react2.default.createElement(
|
|
221
|
+
"iframe",
|
|
222
|
+
{
|
|
223
|
+
src: url,
|
|
224
|
+
title: fields.blockName ?? "Embedded content",
|
|
225
|
+
width,
|
|
226
|
+
height,
|
|
227
|
+
style: {
|
|
228
|
+
aspectRatio: width && height ? `${width} / ${height}` : "16 / 9",
|
|
229
|
+
width: "100%"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
var richTextTextState = {
|
|
235
|
+
color: {
|
|
236
|
+
"text-red": {
|
|
237
|
+
css: {
|
|
238
|
+
color: "light-dark(oklch(0.577 0.245 27.325), oklch(0.704 0.191 22.216))"
|
|
239
|
+
},
|
|
240
|
+
label: "Red"
|
|
241
|
+
},
|
|
242
|
+
"text-orange": {
|
|
243
|
+
css: {
|
|
244
|
+
color: "light-dark(oklch(0.646 0.222 41.116), oklch(0.75 0.183 55.934))"
|
|
245
|
+
},
|
|
246
|
+
label: "Orange"
|
|
247
|
+
},
|
|
248
|
+
"text-yellow": {
|
|
249
|
+
css: {
|
|
250
|
+
color: "light-dark(oklch(0.554 0.135 66.442), oklch(0.905 0.182 98.111))"
|
|
251
|
+
},
|
|
252
|
+
label: "Yellow"
|
|
253
|
+
},
|
|
254
|
+
"text-green": {
|
|
255
|
+
css: {
|
|
256
|
+
color: "light-dark(oklch(0.527 0.154 150.069), oklch(0.792 0.209 151.711))"
|
|
257
|
+
},
|
|
258
|
+
label: "Green"
|
|
259
|
+
},
|
|
260
|
+
"text-blue": {
|
|
261
|
+
css: {
|
|
262
|
+
color: "light-dark(oklch(0.546 0.245 262.881), oklch(0.707 0.165 254.624))"
|
|
263
|
+
},
|
|
264
|
+
label: "Blue"
|
|
265
|
+
},
|
|
266
|
+
"text-purple": {
|
|
267
|
+
css: {
|
|
268
|
+
color: "light-dark(oklch(0.558 0.288 302.321), oklch(0.714 0.203 305.504))"
|
|
269
|
+
},
|
|
270
|
+
label: "Purple"
|
|
271
|
+
},
|
|
272
|
+
"text-pink": {
|
|
273
|
+
css: {
|
|
274
|
+
color: "light-dark(oklch(0.592 0.249 0.584), oklch(0.718 0.202 349.761))"
|
|
275
|
+
},
|
|
276
|
+
label: "Pink"
|
|
277
|
+
},
|
|
278
|
+
"bg-red": {
|
|
279
|
+
css: {
|
|
280
|
+
"background-color": "light-dark(oklch(0.704 0.191 22.216), oklch(0.577 0.245 27.325))"
|
|
281
|
+
},
|
|
282
|
+
label: "Red"
|
|
283
|
+
},
|
|
284
|
+
"bg-orange": {
|
|
285
|
+
css: {
|
|
286
|
+
"background-color": "light-dark(oklch(0.75 0.183 55.934), oklch(0.646 0.222 41.116))"
|
|
287
|
+
},
|
|
288
|
+
label: "Orange"
|
|
289
|
+
},
|
|
290
|
+
"bg-yellow": {
|
|
291
|
+
css: {
|
|
292
|
+
"background-color": "light-dark(oklch(0.905 0.182 98.111), oklch(0.554 0.135 66.442))"
|
|
293
|
+
},
|
|
294
|
+
label: "Yellow"
|
|
295
|
+
},
|
|
296
|
+
"bg-green": {
|
|
297
|
+
css: {
|
|
298
|
+
"background-color": "light-dark(oklch(0.792 0.209 151.711), oklch(0.527 0.154 150.069))"
|
|
299
|
+
},
|
|
300
|
+
label: "Green"
|
|
301
|
+
},
|
|
302
|
+
"bg-blue": {
|
|
303
|
+
css: {
|
|
304
|
+
"background-color": "light-dark(oklch(0.707 0.165 254.624), oklch(0.546 0.245 262.881))"
|
|
305
|
+
},
|
|
306
|
+
label: "Blue"
|
|
307
|
+
},
|
|
308
|
+
"bg-purple": {
|
|
309
|
+
css: {
|
|
310
|
+
"background-color": "light-dark(oklch(0.714 0.203 305.504), oklch(0.558 0.288 302.321))"
|
|
311
|
+
},
|
|
312
|
+
label: "Purple"
|
|
313
|
+
},
|
|
314
|
+
"bg-pink": {
|
|
315
|
+
css: {
|
|
316
|
+
"background-color": "light-dark(oklch(0.718 0.202 349.761), oklch(0.592 0.249 0.584))"
|
|
317
|
+
},
|
|
318
|
+
label: "Pink"
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
var richTextNodeMap = {
|
|
323
|
+
blocks: {
|
|
324
|
+
Code: {
|
|
325
|
+
Block: CodeView
|
|
326
|
+
},
|
|
327
|
+
Iframe: {
|
|
328
|
+
Block: IframeView
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
var richTextViewMap = {
|
|
333
|
+
default: {
|
|
334
|
+
nodes: richTextNodeMap
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
180
338
|
// src/ui/RichText/index.tsx
|
|
181
339
|
function hyphenToCamel(str) {
|
|
182
340
|
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
183
341
|
}
|
|
184
342
|
function createTextStateConverter(state) {
|
|
185
|
-
const defaultTextConverter =
|
|
343
|
+
const defaultTextConverter = import_react4.TextJSXConverter.text;
|
|
186
344
|
return ({ node, ...rest }) => {
|
|
187
345
|
const base = defaultTextConverter({ node, ...rest });
|
|
188
346
|
const nodeState = node.$;
|
|
@@ -200,7 +358,7 @@ function createTextStateConverter(state) {
|
|
|
200
358
|
}
|
|
201
359
|
}
|
|
202
360
|
if (Object.keys(style).length === 0) return base;
|
|
203
|
-
return /* @__PURE__ */
|
|
361
|
+
return /* @__PURE__ */ import_react3.default.createElement("span", { style }, base);
|
|
204
362
|
};
|
|
205
363
|
}
|
|
206
364
|
function RichTextContent({
|
|
@@ -210,21 +368,23 @@ function RichTextContent({
|
|
|
210
368
|
converters,
|
|
211
369
|
blocks,
|
|
212
370
|
disableDefaultConverters,
|
|
371
|
+
nodeMap,
|
|
213
372
|
textState
|
|
214
373
|
}) {
|
|
215
374
|
const baseConverters = {
|
|
216
|
-
...disableDefaultConverters ? {} :
|
|
217
|
-
...(0,
|
|
375
|
+
...disableDefaultConverters ? {} : import_react4.defaultJSXConverters,
|
|
376
|
+
...(0, import_react4.LinkJSXConverter)({ internalDocToHref }),
|
|
218
377
|
...textState ? { text: createTextStateConverter(textState) } : {},
|
|
219
378
|
...converters,
|
|
220
379
|
...blocks ? { blocks } : {}
|
|
221
380
|
};
|
|
222
|
-
return /* @__PURE__ */
|
|
223
|
-
|
|
381
|
+
return /* @__PURE__ */ import_react3.default.createElement(
|
|
382
|
+
import_react4.RichText,
|
|
224
383
|
{
|
|
225
384
|
data,
|
|
226
385
|
className,
|
|
227
|
-
converters: baseConverters
|
|
386
|
+
converters: baseConverters,
|
|
387
|
+
nodeMap
|
|
228
388
|
}
|
|
229
389
|
);
|
|
230
390
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/RichText/index.tsx","../../src/ui/RichText/styled.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport {\n SerializedBlockNode,\n SerializedLinkNode,\n} from '@payloadcms/richtext-lexical'\nimport {\n SerializedEditorState,\n SerializedLexicalNode,\n} from '@payloadcms/richtext-lexical/lexical'\nimport {\n defaultJSXConverters,\n JSXConverter,\n JSXConverters,\n LinkJSXConverter,\n RichText,\n TextJSXConverter,\n} from '@payloadcms/richtext-lexical/react'\n\n/**\n * Accepts both Lexical's strict `SerializedEditorState` and Payload's generated\n * richText type (which includes index signatures like `[k: string]: unknown`).\n */\nexport type RichTextData = SerializedEditorState<SerializedLexicalNode> | {\n root: {\n type: string\n children: { type: string; version: number; [k: string]: unknown }[]\n direction: string | null\n format: string\n indent: number\n version: number\n [k: string]: unknown\n }\n [k: string]: unknown\n}\n\nexport type TextStateConfig = {\n [stateKey: string]: {\n [stateValue: string]: {\n css: Record<string, string>\n label: string\n }\n }\n}\n\nexport interface RichTextContentProps {\n data: RichTextData\n className?: string\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n converters?: Partial<JSXConverters>\n blocks?: Record<string, JSXConverter<SerializedBlockNode>>\n disableDefaultConverters?: boolean\n textState?: TextStateConfig\n}\n\nexport { StyledRichTextContent } from './styled'\nexport type {\n RichTextComponents,\n StyledRichTextContentProps,\n HeadingSlotProps,\n ParagraphSlotProps,\n BlockquoteSlotProps,\n ListSlotProps,\n ListItemSlotProps,\n LinkSlotProps,\n HorizontalRuleSlotProps,\n UploadSlotProps,\n TableSlotProps,\n TableRowSlotProps,\n TableCellSlotProps,\n} from './styled'\n\nfunction hyphenToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction createTextStateConverter(\n state: TextStateConfig,\n): JSXConverters['text'] {\n const defaultTextConverter = TextJSXConverter.text\n // eslint-disable-next-line react/display-name\n return ({ node, ...rest }) => {\n const base = (\n defaultTextConverter as (...args: unknown[]) => React.ReactNode\n )({ node, ...rest })\n const nodeState = (node as Record<string, unknown>).$ as\n | Record<string, string>\n | undefined\n if (!nodeState || typeof nodeState !== 'object') return base\n\n const style: Record<string, string> = {}\n for (const stateKey in nodeState) {\n const stateValue = nodeState[stateKey]\n if (!stateValue) continue\n const css = state[stateKey]?.[stateValue]?.css\n if (css) {\n for (const prop in css) {\n const val = css[prop]\n if (val) style[hyphenToCamel(prop)] = val\n }\n }\n }\n\n if (Object.keys(style).length === 0) return base\n return <span style={style}>{base}</span>\n }\n}\n\nexport function RichTextContent({\n data,\n className,\n internalDocToHref,\n converters,\n blocks,\n disableDefaultConverters,\n textState,\n}: RichTextContentProps) {\n const baseConverters: JSXConverters = {\n ...(disableDefaultConverters ? {} : defaultJSXConverters),\n ...LinkJSXConverter({ internalDocToHref }),\n ...(textState ? { text: createTextStateConverter(textState) } : {}),\n ...converters,\n ...(blocks ? { blocks } : {}),\n }\n\n return (\n <RichText\n data={data as SerializedEditorState<SerializedLexicalNode>}\n className={className}\n converters={baseConverters}\n />\n )\n}\n","'use client'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from 'react'\nimport { SerializedLinkNode } from '@payloadcms/richtext-lexical'\nimport { JSXConverters } from '@payloadcms/richtext-lexical/react'\nimport { RichTextContent, RichTextContentProps } from './index'\n\n// --- Slot prop types (each slot gets structured data + raw node) ---\n\nexport interface HeadingSlotProps {\n tag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n children: React.ReactNode\n node: any\n}\n\nexport interface ParagraphSlotProps {\n children: React.ReactNode\n isEmpty: boolean\n node: any\n}\n\nexport interface BlockquoteSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface ListSlotProps {\n tag: 'ul' | 'ol'\n listType: string\n children: React.ReactNode\n node: any\n}\n\nexport interface ListItemSlotProps {\n children: React.ReactNode\n hasSubLists: boolean\n checked?: boolean\n value?: number\n node: any\n}\n\nexport interface LinkSlotProps {\n href: string\n target?: string\n rel?: string\n children: React.ReactNode\n node: any\n}\n\nexport interface HorizontalRuleSlotProps {\n node?: any\n}\n\nexport interface UploadSlotProps {\n src: string\n alt: string\n width?: number\n height?: number\n mimeType: string\n filename: string\n sizes?: Record<string, any>\n node: any\n}\n\nexport interface TableSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableRowSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableCellSlotProps {\n tag: 'th' | 'td'\n children: React.ReactNode\n colSpan?: number\n rowSpan?: number\n backgroundColor?: string\n node: any\n}\n\n// --- Components map ---\n\nexport interface RichTextComponents {\n Heading?: React.ComponentType<HeadingSlotProps>\n Paragraph?: React.ComponentType<ParagraphSlotProps>\n Blockquote?: React.ComponentType<BlockquoteSlotProps>\n List?: React.ComponentType<ListSlotProps>\n ListItem?: React.ComponentType<ListItemSlotProps>\n Link?: React.ComponentType<LinkSlotProps>\n HorizontalRule?: React.ComponentType<HorizontalRuleSlotProps>\n Upload?: React.ComponentType<UploadSlotProps>\n Table?: React.ComponentType<TableSlotProps>\n TableRow?: React.ComponentType<TableRowSlotProps>\n TableCell?: React.ComponentType<TableCellSlotProps>\n}\n\nexport interface StyledRichTextContentProps extends Omit<\n RichTextContentProps,\n 'converters' | 'disableDefaultConverters'\n> {\n components?: RichTextComponents\n}\n\nfunction createComponentConverters(\n components: RichTextComponents,\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string,\n): Partial<JSXConverters> {\n const converters: Partial<JSXConverters> = {}\n\n if (components.Heading) {\n const Heading = components.Heading\n converters.heading = ({ node, nodesToJSX }) => (\n <Heading tag={node.tag} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Heading>\n )\n }\n\n if (components.Paragraph) {\n const Paragraph = components.Paragraph\n converters.paragraph = ({ node, nodesToJSX }) => {\n const children = nodesToJSX({ nodes: node.children })\n return (\n <Paragraph isEmpty={!children?.length} node={node}>\n {children?.length ? children : <br />}\n </Paragraph>\n )\n }\n }\n\n if (components.Blockquote) {\n const Blockquote = components.Blockquote\n converters.quote = ({ node, nodesToJSX }) => (\n <Blockquote node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Blockquote>\n )\n }\n\n if (components.List) {\n const List = components.List\n converters.list = ({ node, nodesToJSX }) => (\n <List tag={node.tag} listType={node.listType} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </List>\n )\n }\n\n if (components.ListItem) {\n const ListItem = components.ListItem\n converters.listitem = ({ node, nodesToJSX }) => {\n const hasSubLists = node.children.some(\n (child: { type: string }) => child.type === 'list',\n )\n return (\n <ListItem\n hasSubLists={hasSubLists}\n checked={node.checked}\n value={node.value}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </ListItem>\n )\n }\n }\n\n if (components.Link) {\n const Link = components.Link\n\n const resolveHref = (node: any): string => {\n if (node.fields.linkType === 'internal') {\n return internalDocToHref ? internalDocToHref({ linkNode: node }) : '#'\n }\n return node.fields.url ?? ''\n }\n\n converters.link = ({ node, nodesToJSX }) => (\n <Link\n href={resolveHref(node)}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n\n converters.autolink = ({ node, nodesToJSX }) => (\n <Link\n href={node.fields.url ?? ''}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n }\n\n if (components.HorizontalRule) {\n const HorizontalRule = components.HorizontalRule\n converters.horizontalrule = <HorizontalRule />\n }\n\n if (components.Upload) {\n const Upload = components.Upload\n converters.upload = ({ node }) => {\n const uploadNode = node as any\n if (typeof uploadNode.value !== 'object') return null\n const doc = uploadNode.value\n return (\n <Upload\n src={doc.url}\n alt={uploadNode.fields?.alt || doc?.alt || ''}\n width={doc.width}\n height={doc.height}\n mimeType={doc.mimeType}\n filename={doc.filename}\n sizes={doc.sizes}\n node={node}\n />\n )\n }\n }\n\n if (components.Table) {\n const Table = components.Table\n converters.table = ({ node, nodesToJSX }) => (\n <Table node={node}>{nodesToJSX({ nodes: node.children })}</Table>\n )\n }\n\n if (components.TableRow) {\n const TableRow = components.TableRow\n converters.tablerow = ({ node, nodesToJSX }) => (\n <TableRow node={node}>{nodesToJSX({ nodes: node.children })}</TableRow>\n )\n }\n\n if (components.TableCell) {\n const TableCell = components.TableCell\n converters.tablecell = ({ node, nodesToJSX }) => (\n <TableCell\n tag={node.headerState > 0 ? 'th' : 'td'}\n colSpan={node.colSpan > 1 ? node.colSpan : undefined}\n rowSpan={node.rowSpan > 1 ? node.rowSpan : undefined}\n backgroundColor={node.backgroundColor || undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </TableCell>\n )\n }\n\n return converters\n}\n\nexport function StyledRichTextContent({\n components = {},\n internalDocToHref,\n blocks,\n textState,\n ...props\n}: StyledRichTextContentProps) {\n const converters = createComponentConverters(components, internalDocToHref)\n\n return (\n <RichTextContent\n {...props}\n internalDocToHref={internalDocToHref}\n converters={converters}\n blocks={blocks}\n textState={textState}\n />\n )\n}\n"],"mappings":"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","names":["import_react","React","React"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/RichText/index.tsx","../../src/ui/RichText/styled.tsx","../../src/ui/RichText/views.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport type {\n LexicalEditorNodeMap,\n SerializedBlockNode,\n SerializedLinkNode,\n} from '@payloadcms/richtext-lexical'\nimport type {\n SerializedEditorState,\n SerializedLexicalNode,\n} from '@payloadcms/richtext-lexical/lexical'\nimport {\n defaultJSXConverters,\n LinkJSXConverter,\n RichText,\n TextJSXConverter,\n} from '@payloadcms/richtext-lexical/react'\nimport type {\n JSXConverter,\n JSXConverters,\n} from '@payloadcms/richtext-lexical/react'\n\n/**\n * Accepts both Lexical's strict `SerializedEditorState` and Payload's generated\n * richText type (which includes index signatures like `[k: string]: unknown`).\n */\nexport type RichTextData =\n | SerializedEditorState<SerializedLexicalNode>\n | {\n root: {\n type: string\n children: { type: string; version: number; [k: string]: unknown }[]\n direction: string | null\n format: string\n indent: number\n version: number\n [k: string]: unknown\n }\n [k: string]: unknown\n }\n\nexport type TextStateConfig = {\n [stateKey: string]: {\n [stateValue: string]: {\n css: Record<string, string>\n label: string\n }\n }\n}\n\nexport interface RichTextContentProps {\n data: RichTextData\n className?: string\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n converters?: Partial<JSXConverters>\n blocks?: Record<string, JSXConverter<SerializedBlockNode>>\n disableDefaultConverters?: boolean\n nodeMap?: LexicalEditorNodeMap\n textState?: TextStateConfig\n}\n\nexport { StyledRichTextContent } from './styled'\nexport { richTextNodeMap, richTextTextState, richTextViewMap } from './views'\nexport type {\n RichTextComponents,\n StyledRichTextContentProps,\n HeadingSlotProps,\n ParagraphSlotProps,\n BlockquoteSlotProps,\n ListSlotProps,\n ListItemSlotProps,\n LinkSlotProps,\n HorizontalRuleSlotProps,\n UploadSlotProps,\n TableSlotProps,\n TableRowSlotProps,\n TableCellSlotProps,\n} from './styled'\n\nfunction hyphenToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction createTextStateConverter(\n state: TextStateConfig,\n): JSXConverters['text'] {\n const defaultTextConverter = TextJSXConverter.text\n // eslint-disable-next-line react/display-name\n return ({ node, ...rest }) => {\n const base = (\n defaultTextConverter as (...args: unknown[]) => React.ReactNode\n )({ node, ...rest })\n const nodeState = (node as Record<string, unknown>).$ as\n | Record<string, string>\n | undefined\n if (!nodeState || typeof nodeState !== 'object') return base\n\n const style: Record<string, string> = {}\n for (const stateKey in nodeState) {\n const stateValue = nodeState[stateKey]\n if (!stateValue) continue\n const css = state[stateKey]?.[stateValue]?.css\n if (css) {\n for (const prop in css) {\n const val = css[prop]\n if (val) style[hyphenToCamel(prop)] = val\n }\n }\n }\n\n if (Object.keys(style).length === 0) return base\n return <span style={style}>{base}</span>\n }\n}\n\nexport function RichTextContent({\n data,\n className,\n internalDocToHref,\n converters,\n blocks,\n disableDefaultConverters,\n nodeMap,\n textState,\n}: RichTextContentProps) {\n const baseConverters: JSXConverters = {\n ...(disableDefaultConverters ? {} : defaultJSXConverters),\n ...LinkJSXConverter({ internalDocToHref }),\n ...(textState ? { text: createTextStateConverter(textState) } : {}),\n ...converters,\n ...(blocks ? { blocks } : {}),\n }\n\n return (\n <RichText\n data={data as SerializedEditorState<SerializedLexicalNode>}\n className={className}\n converters={baseConverters}\n nodeMap={nodeMap}\n />\n )\n}\n","'use client'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from 'react'\nimport { SerializedLinkNode } from '@payloadcms/richtext-lexical'\nimport { JSXConverters } from '@payloadcms/richtext-lexical/react'\nimport { RichTextContent, RichTextContentProps } from './index'\n\n// --- Slot prop types (each slot gets structured data + raw node) ---\n\nexport interface HeadingSlotProps {\n tag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n children: React.ReactNode\n node: any\n}\n\nexport interface ParagraphSlotProps {\n children: React.ReactNode\n isEmpty: boolean\n node: any\n}\n\nexport interface BlockquoteSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface ListSlotProps {\n tag: 'ul' | 'ol'\n listType: string\n children: React.ReactNode\n node: any\n}\n\nexport interface ListItemSlotProps {\n children: React.ReactNode\n hasSubLists: boolean\n checked?: boolean\n value?: number\n node: any\n}\n\nexport interface LinkSlotProps {\n href: string\n target?: string\n rel?: string\n children: React.ReactNode\n node: any\n}\n\nexport interface HorizontalRuleSlotProps {\n node?: any\n}\n\nexport interface UploadSlotProps {\n src: string\n alt: string\n width?: number\n height?: number\n mimeType: string\n filename: string\n sizes?: Record<string, any>\n node: any\n}\n\nexport interface TableSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableRowSlotProps {\n children: React.ReactNode\n node: any\n}\n\nexport interface TableCellSlotProps {\n tag: 'th' | 'td'\n children: React.ReactNode\n colSpan?: number\n rowSpan?: number\n backgroundColor?: string\n node: any\n}\n\n// --- Components map ---\n\nexport interface RichTextComponents {\n Heading?: React.ComponentType<HeadingSlotProps>\n Paragraph?: React.ComponentType<ParagraphSlotProps>\n Blockquote?: React.ComponentType<BlockquoteSlotProps>\n List?: React.ComponentType<ListSlotProps>\n ListItem?: React.ComponentType<ListItemSlotProps>\n Link?: React.ComponentType<LinkSlotProps>\n HorizontalRule?: React.ComponentType<HorizontalRuleSlotProps>\n Upload?: React.ComponentType<UploadSlotProps>\n Table?: React.ComponentType<TableSlotProps>\n TableRow?: React.ComponentType<TableRowSlotProps>\n TableCell?: React.ComponentType<TableCellSlotProps>\n}\n\nexport interface StyledRichTextContentProps extends Omit<\n RichTextContentProps,\n 'converters' | 'disableDefaultConverters'\n> {\n components?: RichTextComponents\n}\n\nfunction createComponentConverters(\n components: RichTextComponents,\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string,\n): Partial<JSXConverters> {\n const converters: Partial<JSXConverters> = {}\n\n if (components.Heading) {\n const Heading = components.Heading\n converters.heading = ({ node, nodesToJSX }) => (\n <Heading tag={node.tag} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Heading>\n )\n }\n\n if (components.Paragraph) {\n const Paragraph = components.Paragraph\n converters.paragraph = ({ node, nodesToJSX }) => {\n const children = nodesToJSX({ nodes: node.children })\n return (\n <Paragraph isEmpty={!children?.length} node={node}>\n {children?.length ? children : <br />}\n </Paragraph>\n )\n }\n }\n\n if (components.Blockquote) {\n const Blockquote = components.Blockquote\n converters.quote = ({ node, nodesToJSX }) => (\n <Blockquote node={node}>\n {nodesToJSX({ nodes: node.children })}\n </Blockquote>\n )\n }\n\n if (components.List) {\n const List = components.List\n converters.list = ({ node, nodesToJSX }) => (\n <List tag={node.tag} listType={node.listType} node={node}>\n {nodesToJSX({ nodes: node.children })}\n </List>\n )\n }\n\n if (components.ListItem) {\n const ListItem = components.ListItem\n converters.listitem = ({ node, nodesToJSX }) => {\n const hasSubLists = node.children.some(\n (child: { type: string }) => child.type === 'list',\n )\n return (\n <ListItem\n hasSubLists={hasSubLists}\n checked={node.checked}\n value={node.value}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </ListItem>\n )\n }\n }\n\n if (components.Link) {\n const Link = components.Link\n\n const resolveHref = (node: any): string => {\n if (node.fields.linkType === 'internal') {\n return internalDocToHref ? internalDocToHref({ linkNode: node }) : '#'\n }\n return node.fields.url ?? ''\n }\n\n converters.link = ({ node, nodesToJSX }) => (\n <Link\n href={resolveHref(node)}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n\n converters.autolink = ({ node, nodesToJSX }) => (\n <Link\n href={node.fields.url ?? ''}\n rel={node.fields.newTab ? 'noopener noreferrer' : undefined}\n target={node.fields.newTab ? '_blank' : undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </Link>\n )\n }\n\n if (components.HorizontalRule) {\n const HorizontalRule = components.HorizontalRule\n converters.horizontalrule = <HorizontalRule />\n }\n\n if (components.Upload) {\n const Upload = components.Upload\n converters.upload = ({ node }) => {\n const uploadNode = node as any\n if (typeof uploadNode.value !== 'object') return null\n const doc = uploadNode.value\n return (\n <Upload\n src={doc.url}\n alt={uploadNode.fields?.alt || doc?.alt || ''}\n width={doc.width}\n height={doc.height}\n mimeType={doc.mimeType}\n filename={doc.filename}\n sizes={doc.sizes}\n node={node}\n />\n )\n }\n }\n\n if (components.Table) {\n const Table = components.Table\n converters.table = ({ node, nodesToJSX }) => (\n <Table node={node}>{nodesToJSX({ nodes: node.children })}</Table>\n )\n }\n\n if (components.TableRow) {\n const TableRow = components.TableRow\n converters.tablerow = ({ node, nodesToJSX }) => (\n <TableRow node={node}>{nodesToJSX({ nodes: node.children })}</TableRow>\n )\n }\n\n if (components.TableCell) {\n const TableCell = components.TableCell\n converters.tablecell = ({ node, nodesToJSX }) => (\n <TableCell\n tag={node.headerState > 0 ? 'th' : 'td'}\n colSpan={node.colSpan > 1 ? node.colSpan : undefined}\n rowSpan={node.rowSpan > 1 ? node.rowSpan : undefined}\n backgroundColor={node.backgroundColor || undefined}\n node={node}\n >\n {nodesToJSX({ nodes: node.children })}\n </TableCell>\n )\n }\n\n return converters\n}\n\nexport function StyledRichTextContent({\n components = {},\n internalDocToHref,\n blocks,\n textState,\n ...props\n}: StyledRichTextContentProps) {\n const converters = createComponentConverters(components, internalDocToHref)\n\n return (\n <RichTextContent\n {...props}\n internalDocToHref={internalDocToHref}\n converters={converters}\n blocks={blocks}\n textState={textState}\n />\n )\n}\n","'use client'\n\nimport React from 'react'\nimport type {\n LexicalEditorNodeMap,\n LexicalEditorViewMap,\n SerializedBlockNode,\n ViewMapBlockComponentProps,\n} from '@payloadcms/richtext-lexical'\nimport type { TextStateConfig } from './index'\n\ntype CodeBlockFields = {\n blockName?: null | string\n blockType: 'Code'\n code?: string | null\n language?: string | null\n}\n\ntype IframeBlockFields = {\n blockName?: null | string\n blockType: 'Iframe'\n height?: number | null\n url?: string | null\n width?: number | null\n}\n\ntype SupportedRichTextBlockNode =\n | SerializedBlockNode<CodeBlockFields>\n | SerializedBlockNode<IframeBlockFields>\n\ntype RichTextBlockProps<TFields extends CodeBlockFields | IframeBlockFields> =\n ViewMapBlockComponentProps<SerializedBlockNode<TFields>>\n\nfunction getBlockFields<TFields extends CodeBlockFields | IframeBlockFields>(\n props: RichTextBlockProps<TFields>,\n): TFields {\n return props.formData as TFields\n}\n\nfunction CodeView(props: RichTextBlockProps<CodeBlockFields>) {\n const fields = getBlockFields(props)\n const code = fields.code ?? ''\n const language = fields.language ?? 'plaintext'\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n\n return (\n <BlockCollapsible className={props.className}>\n <pre style={{ margin: 0, overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n <code data-language={language}>{code}</code>\n </pre>\n </BlockCollapsible>\n )\n }\n\n return (\n <pre style={{ overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n <code data-language={language}>{code}</code>\n </pre>\n )\n}\n\nfunction IframeView(props: RichTextBlockProps<IframeBlockFields>) {\n const fields = getBlockFields(props)\n const url = fields.url ?? ''\n const width = fields.width ?? undefined\n const height = fields.height ?? undefined\n\n if (!url) return null\n\n if (props.isEditor) {\n const { BlockCollapsible } = props.useBlockComponentContext()\n\n return (\n <BlockCollapsible className={props.className}>\n <iframe\n src={url}\n title={fields.blockName ?? 'Embedded content'}\n width={width}\n height={height}\n style={{\n aspectRatio: width && height ? `${width} / ${height}` : '16 / 9',\n width: '100%',\n }}\n />\n </BlockCollapsible>\n )\n }\n\n return (\n <iframe\n src={url}\n title={fields.blockName ?? 'Embedded content'}\n width={width}\n height={height}\n style={{\n aspectRatio: width && height ? `${width} / ${height}` : '16 / 9',\n width: '100%',\n }}\n />\n )\n}\n\nexport const richTextTextState: TextStateConfig = {\n color: {\n 'text-red': {\n css: {\n color:\n 'light-dark(oklch(0.577 0.245 27.325), oklch(0.704 0.191 22.216))',\n },\n label: 'Red',\n },\n 'text-orange': {\n css: {\n color:\n 'light-dark(oklch(0.646 0.222 41.116), oklch(0.75 0.183 55.934))',\n },\n label: 'Orange',\n },\n 'text-yellow': {\n css: {\n color:\n 'light-dark(oklch(0.554 0.135 66.442), oklch(0.905 0.182 98.111))',\n },\n label: 'Yellow',\n },\n 'text-green': {\n css: {\n color:\n 'light-dark(oklch(0.527 0.154 150.069), oklch(0.792 0.209 151.711))',\n },\n label: 'Green',\n },\n 'text-blue': {\n css: {\n color:\n 'light-dark(oklch(0.546 0.245 262.881), oklch(0.707 0.165 254.624))',\n },\n label: 'Blue',\n },\n 'text-purple': {\n css: {\n color:\n 'light-dark(oklch(0.558 0.288 302.321), oklch(0.714 0.203 305.504))',\n },\n label: 'Purple',\n },\n 'text-pink': {\n css: {\n color:\n 'light-dark(oklch(0.592 0.249 0.584), oklch(0.718 0.202 349.761))',\n },\n label: 'Pink',\n },\n 'bg-red': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.704 0.191 22.216), oklch(0.577 0.245 27.325))',\n },\n label: 'Red',\n },\n 'bg-orange': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.75 0.183 55.934), oklch(0.646 0.222 41.116))',\n },\n label: 'Orange',\n },\n 'bg-yellow': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.905 0.182 98.111), oklch(0.554 0.135 66.442))',\n },\n label: 'Yellow',\n },\n 'bg-green': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.792 0.209 151.711), oklch(0.527 0.154 150.069))',\n },\n label: 'Green',\n },\n 'bg-blue': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.707 0.165 254.624), oklch(0.546 0.245 262.881))',\n },\n label: 'Blue',\n },\n 'bg-purple': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.714 0.203 305.504), oklch(0.558 0.288 302.321))',\n },\n label: 'Purple',\n },\n 'bg-pink': {\n css: {\n 'background-color':\n 'light-dark(oklch(0.718 0.202 349.761), oklch(0.592 0.249 0.584))',\n },\n label: 'Pink',\n },\n },\n}\n\nexport const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode> =\n {\n blocks: {\n Code: {\n Block: CodeView,\n },\n Iframe: {\n Block: IframeView,\n },\n },\n }\n\nexport const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode> =\n {\n default: {\n nodes: richTextNodeMap,\n },\n }\n"],"mappings":"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","names":["import_react","React","import_react","React","React"]}
|
package/dist/ui/rich-text.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { LexicalEditorNodeMap, SerializedBlockNode, LexicalEditorViewMap, SerializedLinkNode } from '@payloadcms/richtext-lexical';
|
|
3
3
|
import { SerializedEditorState, SerializedLexicalNode } from '@payloadcms/richtext-lexical/lexical';
|
|
4
4
|
import { JSXConverters, JSXConverter } from '@payloadcms/richtext-lexical/react';
|
|
5
5
|
|
|
@@ -84,6 +84,24 @@ interface StyledRichTextContentProps extends Omit<RichTextContentProps, 'convert
|
|
|
84
84
|
}
|
|
85
85
|
declare function StyledRichTextContent({ components, internalDocToHref, blocks, textState, ...props }: StyledRichTextContentProps): React.JSX.Element;
|
|
86
86
|
|
|
87
|
+
type CodeBlockFields = {
|
|
88
|
+
blockName?: null | string;
|
|
89
|
+
blockType: 'Code';
|
|
90
|
+
code?: string | null;
|
|
91
|
+
language?: string | null;
|
|
92
|
+
};
|
|
93
|
+
type IframeBlockFields = {
|
|
94
|
+
blockName?: null | string;
|
|
95
|
+
blockType: 'Iframe';
|
|
96
|
+
height?: number | null;
|
|
97
|
+
url?: string | null;
|
|
98
|
+
width?: number | null;
|
|
99
|
+
};
|
|
100
|
+
type SupportedRichTextBlockNode = SerializedBlockNode<CodeBlockFields> | SerializedBlockNode<IframeBlockFields>;
|
|
101
|
+
declare const richTextTextState: TextStateConfig;
|
|
102
|
+
declare const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode>;
|
|
103
|
+
declare const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode>;
|
|
104
|
+
|
|
87
105
|
/**
|
|
88
106
|
* Accepts both Lexical's strict `SerializedEditorState` and Payload's generated
|
|
89
107
|
* richText type (which includes index signatures like `[k: string]: unknown`).
|
|
@@ -121,9 +139,10 @@ interface RichTextContentProps {
|
|
|
121
139
|
converters?: Partial<JSXConverters>;
|
|
122
140
|
blocks?: Record<string, JSXConverter<SerializedBlockNode>>;
|
|
123
141
|
disableDefaultConverters?: boolean;
|
|
142
|
+
nodeMap?: LexicalEditorNodeMap;
|
|
124
143
|
textState?: TextStateConfig;
|
|
125
144
|
}
|
|
126
145
|
|
|
127
|
-
declare function RichTextContent({ data, className, internalDocToHref, converters, blocks, disableDefaultConverters, textState, }: RichTextContentProps): React.JSX.Element;
|
|
146
|
+
declare function RichTextContent({ data, className, internalDocToHref, converters, blocks, disableDefaultConverters, nodeMap, textState, }: RichTextContentProps): React.JSX.Element;
|
|
128
147
|
|
|
129
|
-
export { type BlockquoteSlotProps, type HeadingSlotProps, type HorizontalRuleSlotProps, type LinkSlotProps, type ListItemSlotProps, type ListSlotProps, type ParagraphSlotProps, type RichTextComponents, RichTextContent, type RichTextContentProps, type RichTextData, StyledRichTextContent, type StyledRichTextContentProps, type TableCellSlotProps, type TableRowSlotProps, type TableSlotProps, type TextStateConfig, type UploadSlotProps };
|
|
148
|
+
export { type BlockquoteSlotProps, type HeadingSlotProps, type HorizontalRuleSlotProps, type LinkSlotProps, type ListItemSlotProps, type ListSlotProps, type ParagraphSlotProps, type RichTextComponents, RichTextContent, type RichTextContentProps, type RichTextData, StyledRichTextContent, type StyledRichTextContentProps, type TableCellSlotProps, type TableRowSlotProps, type TableSlotProps, type TextStateConfig, type UploadSlotProps, richTextNodeMap, richTextTextState, richTextViewMap };
|
package/dist/ui/rich-text.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { LexicalEditorNodeMap, SerializedBlockNode, LexicalEditorViewMap, SerializedLinkNode } from '@payloadcms/richtext-lexical';
|
|
3
3
|
import { SerializedEditorState, SerializedLexicalNode } from '@payloadcms/richtext-lexical/lexical';
|
|
4
4
|
import { JSXConverters, JSXConverter } from '@payloadcms/richtext-lexical/react';
|
|
5
5
|
|
|
@@ -84,6 +84,24 @@ interface StyledRichTextContentProps extends Omit<RichTextContentProps, 'convert
|
|
|
84
84
|
}
|
|
85
85
|
declare function StyledRichTextContent({ components, internalDocToHref, blocks, textState, ...props }: StyledRichTextContentProps): React.JSX.Element;
|
|
86
86
|
|
|
87
|
+
type CodeBlockFields = {
|
|
88
|
+
blockName?: null | string;
|
|
89
|
+
blockType: 'Code';
|
|
90
|
+
code?: string | null;
|
|
91
|
+
language?: string | null;
|
|
92
|
+
};
|
|
93
|
+
type IframeBlockFields = {
|
|
94
|
+
blockName?: null | string;
|
|
95
|
+
blockType: 'Iframe';
|
|
96
|
+
height?: number | null;
|
|
97
|
+
url?: string | null;
|
|
98
|
+
width?: number | null;
|
|
99
|
+
};
|
|
100
|
+
type SupportedRichTextBlockNode = SerializedBlockNode<CodeBlockFields> | SerializedBlockNode<IframeBlockFields>;
|
|
101
|
+
declare const richTextTextState: TextStateConfig;
|
|
102
|
+
declare const richTextNodeMap: LexicalEditorNodeMap<SupportedRichTextBlockNode>;
|
|
103
|
+
declare const richTextViewMap: LexicalEditorViewMap<SupportedRichTextBlockNode>;
|
|
104
|
+
|
|
87
105
|
/**
|
|
88
106
|
* Accepts both Lexical's strict `SerializedEditorState` and Payload's generated
|
|
89
107
|
* richText type (which includes index signatures like `[k: string]: unknown`).
|
|
@@ -121,9 +139,10 @@ interface RichTextContentProps {
|
|
|
121
139
|
converters?: Partial<JSXConverters>;
|
|
122
140
|
blocks?: Record<string, JSXConverter<SerializedBlockNode>>;
|
|
123
141
|
disableDefaultConverters?: boolean;
|
|
142
|
+
nodeMap?: LexicalEditorNodeMap;
|
|
124
143
|
textState?: TextStateConfig;
|
|
125
144
|
}
|
|
126
145
|
|
|
127
|
-
declare function RichTextContent({ data, className, internalDocToHref, converters, blocks, disableDefaultConverters, textState, }: RichTextContentProps): React.JSX.Element;
|
|
146
|
+
declare function RichTextContent({ data, className, internalDocToHref, converters, blocks, disableDefaultConverters, nodeMap, textState, }: RichTextContentProps): React.JSX.Element;
|
|
128
147
|
|
|
129
|
-
export { type BlockquoteSlotProps, type HeadingSlotProps, type HorizontalRuleSlotProps, type LinkSlotProps, type ListItemSlotProps, type ListSlotProps, type ParagraphSlotProps, type RichTextComponents, RichTextContent, type RichTextContentProps, type RichTextData, StyledRichTextContent, type StyledRichTextContentProps, type TableCellSlotProps, type TableRowSlotProps, type TableSlotProps, type TextStateConfig, type UploadSlotProps };
|
|
148
|
+
export { type BlockquoteSlotProps, type HeadingSlotProps, type HorizontalRuleSlotProps, type LinkSlotProps, type ListItemSlotProps, type ListSlotProps, type ParagraphSlotProps, type RichTextComponents, RichTextContent, type RichTextContentProps, type RichTextData, StyledRichTextContent, type StyledRichTextContentProps, type TableCellSlotProps, type TableRowSlotProps, type TableSlotProps, type TextStateConfig, type UploadSlotProps, richTextNodeMap, richTextTextState, richTextViewMap };
|