{"version":3,"file":"renderRichTextNodes.utils.cjs","sources":["../../../../../src/components/data-display/rich-text-renderer/utils/renderRichTextNodes.utils.tsx"],"sourcesContent":["import { type ReactNode } from 'react'\r\n\r\nimport { extractTextFromReactNode } from '@components/data-display/_shared/utils/extractText.utils.ts'\r\nimport { Typography } from '@components/foundation/typography'\r\nimport { Link } from '@components/navigation/link'\r\nimport type {\r\n    RichTextMark,\r\n    RichTextNode,\r\n    RichTextTextNode,\r\n} from '@components/forms/rich-text-editor/types/RichTextEditor.types.ts'\r\nimport {\r\n    normalizeRichTextColorValue,\r\n    normalizeRichTextFontSizeValue,\r\n    normalizeRichTextUrl,\r\n} from '@components/forms/rich-text-editor/utils/richText.utils.ts'\r\n\r\nconst renderMarks = (content: ReactNode, marks: RichTextMark[] = []): ReactNode =>\r\n    marks.reduceRight<ReactNode>((children, mark) => {\r\n        switch (mark.type) {\r\n            case 'bold':\r\n                return (\r\n                    <Typography\r\n                        as={'strong'}\r\n                        variant={'strong'}\r\n                    >\r\n                        {children}\r\n                    </Typography>\r\n                )\r\n            case 'italic':\r\n                return (\r\n                    <Typography\r\n                        as={'em'}\r\n                        variant={'em'}\r\n                    >\r\n                        {children}\r\n                    </Typography>\r\n                )\r\n            case 'underline':\r\n                return <u>{children}</u>\r\n            case 'strike':\r\n                return <s>{children}</s>\r\n            case 'code':\r\n                return <code>{children}</code>\r\n            case 'textStyle': {\r\n                const color = normalizeRichTextColorValue(mark.attrs.color)\r\n                const fontSize = normalizeRichTextFontSizeValue(mark.attrs.fontSize)\r\n\r\n                return color || fontSize\r\n                    ? <span style={{ color, fontSize }}>{children}</span>\r\n                    : children\r\n            }\r\n            case 'link': {\r\n                const href = normalizeRichTextUrl(mark.attrs.href)\r\n                const label = extractTextFromReactNode(children)\r\n\r\n                return href && label ? (\r\n                    <Link\r\n                        href={href}\r\n                        label={label}\r\n                        target={'_blank'}\r\n                        rel={'noopener noreferrer'}\r\n                    />\r\n                ) : children\r\n            }\r\n        }\r\n    }, content)\r\n\r\nconst renderTextNode = (node: RichTextTextNode): ReactNode => renderMarks(node.text, node.marks)\r\n\r\nexport const renderRichTextNodes = (nodes: RichTextNode[] = []): ReactNode[] =>\r\n    nodes.map((node, index) => {\r\n        const key = `${node.type}-${index}`\r\n\r\n        if (node.type === 'text') {\r\n            return <span key={key}>{renderTextNode(node)}</span>\r\n        }\r\n\r\n        if (node.type === 'image') {\r\n            const src = node.attrs.src.startsWith('data:image/')\r\n                ? node.attrs.src\r\n                : normalizeRichTextUrl(node.attrs.src)\r\n\r\n            return src ? (\r\n                <img\r\n                    key={key}\r\n                    src={src}\r\n                    alt={node.attrs.alt ?? ''}\r\n                    title={node.attrs.title ?? undefined}\r\n                    style={node.attrs.width && /^\\d+(?:\\.\\d+)?(?:%|px|rem|em)?$/.test(node.attrs.width)\r\n                        ? { width: node.attrs.width }\r\n                        : undefined}\r\n                />\r\n            ) : null\r\n        }\r\n\r\n        if (node.type === 'horizontalRule') {\r\n            return <hr key={key} />\r\n        }\r\n\r\n        if (node.type === 'hardBreak') {\r\n            return <br key={key} />\r\n        }\r\n\r\n        const children = renderRichTextNodes(node.content)\r\n        const style = node.attrs?.textAlign\r\n            ? { textAlign: node.attrs.textAlign }\r\n            : undefined\r\n\r\n        switch (node.type) {\r\n            case 'paragraph':\r\n                return (\r\n                    <Typography\r\n                        key={key}\r\n                        variant={'p'}\r\n                        style={style}\r\n                    >\r\n                        {children}\r\n                    </Typography>\r\n                )\r\n            case 'heading': {\r\n                const variant = node.attrs?.level === 1\r\n                    ? 'h1'\r\n                    : node.attrs?.level === 2\r\n                        ? 'h2'\r\n                        : 'h3'\r\n\r\n                return (\r\n                    <Typography\r\n                        key={key}\r\n                        variant={variant}\r\n                        style={style}\r\n                    >\r\n                        {children}\r\n                    </Typography>\r\n                )\r\n            }\r\n            case 'bulletList':\r\n                return <ul key={key}>{children}</ul>\r\n            case 'orderedList':\r\n                return <ol key={key}>{children}</ol>\r\n            case 'listItem':\r\n                return <li key={key}>{children}</li>\r\n            case 'blockquote':\r\n                return <blockquote key={key}>{children}</blockquote>\r\n            case 'codeBlock':\r\n                return <pre key={key}><code>{children}</code></pre>\r\n        }\r\n    })\r\n"],"names":["renderMarks","content","marks","children","mark","jsx","Typography","color","normalizeRichTextColorValue","fontSize","normalizeRichTextFontSizeValue","href","normalizeRichTextUrl","label","extractTextFromReactNode","Link","renderTextNode","node","renderRichTextNodes","nodes","index","key","src","style","variant"],"mappings":"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"}