@payloadcms/richtext-lexical 3.77.0-internal.8cf758f → 3.77.0-internal.fd50432

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.
Files changed (121) hide show
  1. package/dist/exports/client/Field-HJGV32KA.js +2 -0
  2. package/dist/exports/client/Field-HJGV32KA.js.map +7 -0
  3. package/dist/exports/client/bundled.css +1 -1
  4. package/dist/exports/client/chunk-2S5Q7QYO.js +2 -0
  5. package/dist/exports/client/chunk-2S5Q7QYO.js.map +7 -0
  6. package/dist/exports/client/chunk-EZX4YW7S.js +12 -0
  7. package/dist/exports/client/chunk-EZX4YW7S.js.map +7 -0
  8. package/dist/exports/client/componentInline-NL25DNZ5.js +2 -0
  9. package/dist/exports/client/index.d.ts +0 -1
  10. package/dist/exports/client/index.d.ts.map +1 -1
  11. package/dist/exports/client/index.js +26 -26
  12. package/dist/exports/client/index.js.map +3 -3
  13. package/dist/exports/react/index.d.ts +1 -3
  14. package/dist/exports/react/index.d.ts.map +1 -1
  15. package/dist/exports/react/index.js +0 -1
  16. package/dist/exports/react/index.js.map +1 -1
  17. package/dist/features/blocks/client/component/BlockContent.d.ts +4 -7
  18. package/dist/features/blocks/client/component/BlockContent.d.ts.map +1 -1
  19. package/dist/features/blocks/client/component/BlockContent.js +8 -9
  20. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  21. package/dist/features/blocks/client/component/index.d.ts +4 -20
  22. package/dist/features/blocks/client/component/index.d.ts.map +1 -1
  23. package/dist/features/blocks/client/component/index.js +11 -40
  24. package/dist/features/blocks/client/component/index.js.map +1 -1
  25. package/dist/features/blocks/client/componentInline/index.d.ts +14 -8
  26. package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
  27. package/dist/features/blocks/client/componentInline/index.js +9 -38
  28. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  29. package/dist/features/blocks/client/nodes/BlocksNode.d.ts +2 -4
  30. package/dist/features/blocks/client/nodes/BlocksNode.d.ts.map +1 -1
  31. package/dist/features/blocks/client/nodes/BlocksNode.js +1 -3
  32. package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
  33. package/dist/features/blocks/client/nodes/InlineBlocksNode.d.ts +2 -4
  34. package/dist/features/blocks/client/nodes/InlineBlocksNode.d.ts.map +1 -1
  35. package/dist/features/blocks/client/nodes/InlineBlocksNode.js +1 -3
  36. package/dist/features/blocks/client/nodes/InlineBlocksNode.js.map +1 -1
  37. package/dist/features/converters/lexicalToJSX/Component/index.d.ts +20 -6
  38. package/dist/features/converters/lexicalToJSX/Component/index.d.ts.map +1 -1
  39. package/dist/features/converters/lexicalToJSX/Component/index.js +5 -7
  40. package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
  41. package/dist/features/converters/lexicalToJSX/converter/index.d.ts +2 -17
  42. package/dist/features/converters/lexicalToJSX/converter/index.d.ts.map +1 -1
  43. package/dist/features/converters/lexicalToJSX/converter/index.js +4 -124
  44. package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
  45. package/dist/features/converters/lexicalToJSX/converter/types.d.ts +10 -14
  46. package/dist/features/converters/lexicalToJSX/converter/types.d.ts.map +1 -1
  47. package/dist/features/converters/lexicalToJSX/converter/types.js.map +1 -1
  48. package/dist/features/debug/jsxConverter/client/plugin/index.js +1 -1
  49. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  50. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  51. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +13 -2
  52. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  53. package/dist/field/Field.d.ts.map +1 -1
  54. package/dist/field/Field.js +6 -15
  55. package/dist/field/Field.js.map +1 -1
  56. package/dist/field/bundled.css +1 -1
  57. package/dist/field/index.d.ts +0 -1
  58. package/dist/field/index.d.ts.map +1 -1
  59. package/dist/field/index.js +35 -64
  60. package/dist/field/index.js.map +1 -1
  61. package/dist/field/rscEntry.d.ts +1 -1
  62. package/dist/field/rscEntry.d.ts.map +1 -1
  63. package/dist/field/rscEntry.js +0 -12
  64. package/dist/field/rscEntry.js.map +1 -1
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +1 -3
  68. package/dist/index.js.map +1 -1
  69. package/dist/lexical/LexicalEditor.d.ts.map +1 -1
  70. package/dist/lexical/LexicalEditor.js +1 -2
  71. package/dist/lexical/LexicalEditor.js.map +1 -1
  72. package/dist/lexical/LexicalProvider.d.ts.map +1 -1
  73. package/dist/lexical/LexicalProvider.js +3 -12
  74. package/dist/lexical/LexicalProvider.js.map +1 -1
  75. package/dist/lexical/config/client/sanitize.d.ts +1 -1
  76. package/dist/lexical/config/client/sanitize.d.ts.map +1 -1
  77. package/dist/lexical/config/client/sanitize.js +2 -3
  78. package/dist/lexical/config/client/sanitize.js.map +1 -1
  79. package/dist/lexical/config/types.d.ts +0 -4
  80. package/dist/lexical/config/types.d.ts.map +1 -1
  81. package/dist/lexical/config/types.js.map +1 -1
  82. package/dist/lexical/nodes/index.d.ts +2 -12
  83. package/dist/lexical/nodes/index.d.ts.map +1 -1
  84. package/dist/lexical/nodes/index.js +2 -213
  85. package/dist/lexical/nodes/index.js.map +1 -1
  86. package/dist/lexical/utils/setFloatingElemPositionForLinkEditor.d.ts.map +1 -1
  87. package/dist/lexical/utils/setFloatingElemPositionForLinkEditor.js +30 -1
  88. package/dist/lexical/utils/setFloatingElemPositionForLinkEditor.js.map +1 -1
  89. package/dist/types.d.ts +2 -329
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/types.js.map +1 -1
  92. package/dist/utilities/generateImportMap.d.ts.map +1 -1
  93. package/dist/utilities/generateImportMap.js +0 -1
  94. package/dist/utilities/generateImportMap.js.map +1 -1
  95. package/dist/validate/hasText.d.ts +1 -6
  96. package/dist/validate/hasText.d.ts.map +1 -1
  97. package/dist/validate/hasText.js +4 -10
  98. package/dist/validate/hasText.js.map +1 -1
  99. package/package.json +6 -11
  100. package/dist/exports/client/Field-WHU2KI63.js +0 -2
  101. package/dist/exports/client/Field-WHU2KI63.js.map +0 -7
  102. package/dist/exports/client/chunk-CRVQNLN7.js +0 -2
  103. package/dist/exports/client/chunk-CRVQNLN7.js.map +0 -7
  104. package/dist/exports/client/chunk-LUQPUYGE.js +0 -12
  105. package/dist/exports/client/chunk-LUQPUYGE.js.map +0 -7
  106. package/dist/exports/client/componentInline-22F6QL2B.js +0 -2
  107. package/dist/exports/client/internal-client.d.ts +0 -3
  108. package/dist/exports/client/internal-client.d.ts.map +0 -1
  109. package/dist/field/RichTextViewProvider.d.ts +0 -84
  110. package/dist/field/RichTextViewProvider.d.ts.map +0 -1
  111. package/dist/field/RichTextViewProvider.js +0 -89
  112. package/dist/field/RichTextViewProvider.js.map +0 -1
  113. package/dist/field/ViewSelector.d.ts +0 -4
  114. package/dist/field/ViewSelector.d.ts.map +0 -1
  115. package/dist/field/ViewSelector.js +0 -89
  116. package/dist/field/ViewSelector.js.map +0 -1
  117. package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts +0 -2
  118. package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts.map +0 -1
  119. package/dist/lexical/plugins/NodeViewOverridePlugin/index.js +0 -48
  120. package/dist/lexical/plugins/NodeViewOverridePlugin/index.js.map +0 -1
  121. /package/dist/exports/client/{componentInline-22F6QL2B.js.map → componentInline-NL25DNZ5.js.map} +0 -0
@@ -1,139 +1,19 @@
1
1
  /* eslint-disable no-console */import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import React from 'react';
3
3
  import { hasText } from '../../../../validate/hasText.js';
4
- /**
5
- * Creates a JSX converter from a NodeMapValue
6
- */
7
- function createConverterFromNodeMapValue(viewDef) {
8
- return args => {
9
- const converterArgs = {
10
- ...args,
11
- isEditor: false,
12
- isJSXConverter: true
13
- };
14
- // If Component is provided, use it
15
- if (viewDef.Component) {
16
- return viewDef.Component(converterArgs);
17
- }
18
- // If html is provided (as a function or string), use it
19
- // Note: Using span instead of div to avoid forcing block-level semantics
20
- if (viewDef.html) {
21
- const htmlContent = typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html;
22
- return /*#__PURE__*/_jsx("span", {
23
- dangerouslySetInnerHTML: {
24
- __html: htmlContent
25
- }
26
- });
27
- }
28
- return null;
29
- };
30
- }
31
- /**
32
- * Creates a JSX converter from a NodeMapBlockValue (for blocks/inlineBlocks)
33
- * This also checks for Block FC as a fallback when Component is not defined.
34
- */
35
- function createConverterFromBlockValue(viewDef) {
36
- return args => {
37
- // Priority: Component > Block > html
38
- if (viewDef.Component) {
39
- const converterArgs = {
40
- ...args,
41
- isEditor: false,
42
- isJSXConverter: true
43
- };
44
- return viewDef.Component(converterArgs);
45
- }
46
- // Use Block FC with JSX converter props
47
- if (viewDef.Block) {
48
- const blockNode = args.node;
49
- const blockProps = {
50
- childIndex: args.childIndex,
51
- converters: args.converters,
52
- formData: blockNode.fields ?? {},
53
- isEditor: false,
54
- isJSXConverter: true,
55
- node: blockNode,
56
- nodesToJSX: args.nodesToJSX,
57
- parent: args.parent
58
- };
59
- return /*#__PURE__*/React.createElement(viewDef.Block, blockProps);
60
- }
61
- if (viewDef.html) {
62
- const converterArgs = {
63
- ...args,
64
- isEditor: false,
65
- isJSXConverter: true
66
- };
67
- const htmlContent = typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html;
68
- return /*#__PURE__*/_jsx("span", {
69
- dangerouslySetInnerHTML: {
70
- __html: htmlContent
71
- }
72
- });
73
- }
74
- return null;
75
- };
76
- }
77
- /**
78
- * Converts a LexicalEditorNodeMap into JSXConverters
79
- */
80
- function nodeMapToConverters(nodeMap) {
81
- const converters = {};
82
- for (const [nodeType, value] of Object.entries(nodeMap)) {
83
- if (!value || typeof value !== 'object') {
84
- continue;
85
- }
86
- // Handle special keys: blocks, inlineBlocks
87
- if (nodeType === 'blocks') {
88
- converters.blocks = {};
89
- for (const [blockType, _viewDef] of Object.entries(value)) {
90
- const viewDef = _viewDef;
91
- // Check for Component, Block, or html
92
- if (viewDef.Component || viewDef.Block || viewDef.html) {
93
- converters.blocks[blockType] = createConverterFromBlockValue(viewDef);
94
- }
95
- }
96
- continue;
97
- }
98
- if (nodeType === 'inlineBlocks') {
99
- converters.inlineBlocks = {};
100
- for (const [blockType, _viewDef] of Object.entries(value)) {
101
- const viewDef = _viewDef;
102
- // Check for Component, Block, or html
103
- if (viewDef.Component || viewDef.Block || viewDef.html) {
104
- converters.inlineBlocks[blockType] = createConverterFromBlockValue(viewDef);
105
- }
106
- }
107
- continue;
108
- }
109
- // Handle regular node types
110
- const viewDef = value;
111
- if (viewDef.Component || viewDef.html) {
112
- converters[nodeType] = createConverterFromNodeMapValue(viewDef);
113
- }
114
- }
115
- return converters;
116
- }
117
4
  export function convertLexicalToJSX({
118
5
  converters,
119
6
  data,
120
7
  disableIndent,
121
- disableTextAlign,
122
- nodeMap
8
+ disableTextAlign
123
9
  }) {
124
10
  if (hasText(data)) {
125
- // Merge nodeMap converters with existing converters
126
- // NodeMap converters override existing converters
127
- const mergedConverters = nodeMap ? {
128
- ...converters,
129
- ...nodeMapToConverters(nodeMap)
130
- } : converters;
131
11
  return convertLexicalNodesToJSX({
132
- converters: mergedConverters,
12
+ converters,
133
13
  disableIndent,
134
14
  disableTextAlign,
135
- nodes: data.root.children,
136
- parent: data.root
15
+ nodes: data?.root?.children,
16
+ parent: data?.root
137
17
  });
138
18
  }
139
19
  return /*#__PURE__*/_jsx(_Fragment, {});
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["jsx","_jsx","Fragment","_Fragment","React","hasText","createConverterFromNodeMapValue","viewDef","args","converterArgs","isEditor","isJSXConverter","Component","html","htmlContent","dangerouslySetInnerHTML","__html","createConverterFromBlockValue","Block","blockNode","node","blockProps","childIndex","converters","formData","fields","nodesToJSX","parent","createElement","nodeMapToConverters","nodeMap","nodeType","value","Object","entries","blocks","blockType","_viewDef","inlineBlocks","convertLexicalToJSX","data","disableIndent","disableTextAlign","mergedConverters","convertLexicalNodesToJSX","nodes","root","children","unknownConverter","unknown","jsxArray","map","i","converterForNode","type","console","error","reactNode","converted","style","Array","isArray","includes","format","textAlign","indent","paddingInlineStart","Number","isValidElement","newStyle","props","cloneElement","key","filter","Boolean"],"sources":["../../../../../src/features/converters/lexicalToJSX/converter/index.tsx"],"sourcesContent":["/* eslint-disable no-console */\nimport type { SerializedEditorState, SerializedLexicalNode } from 'lexical'\n\nimport React from 'react'\n\nimport type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js'\nimport type {\n LexicalEditorNodeMap,\n NodeMapBlockValue,\n NodeMapValue,\n SerializedNodeBase,\n ViewMapBlockJSXConverterProps,\n} from '../../../../types.js'\nimport type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js'\n\nimport { hasText } from '../../../../validate/hasText.js'\n\n/**\n * Creates a JSX converter from a NodeMapValue\n */\nfunction createConverterFromNodeMapValue(viewDef: NodeMapValue): JSXConverter {\n return (args) => {\n const converterArgs = {\n ...args,\n isEditor: false as const,\n isJSXConverter: true as const,\n }\n\n // If Component is provided, use it\n if (viewDef.Component) {\n return viewDef.Component(converterArgs)\n }\n\n // If html is provided (as a function or string), use it\n // Note: Using span instead of div to avoid forcing block-level semantics\n if (viewDef.html) {\n const htmlContent =\n typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html\n\n return <span dangerouslySetInnerHTML={{ __html: htmlContent }} />\n }\n\n return null\n }\n}\n\n/**\n * Creates a JSX converter from a NodeMapBlockValue (for blocks/inlineBlocks)\n * This also checks for Block FC as a fallback when Component is not defined.\n */\nfunction createConverterFromBlockValue(viewDef: NodeMapBlockValue<any>): JSXConverter {\n return (args) => {\n // Priority: Component > Block > html\n if (viewDef.Component) {\n const converterArgs = {\n ...args,\n isEditor: false as const,\n isJSXConverter: true as const,\n }\n return viewDef.Component(converterArgs)\n }\n\n // Use Block FC with JSX converter props\n if (viewDef.Block) {\n const blockNode = args.node as SerializedBlockNode\n const blockProps: ViewMapBlockJSXConverterProps<any> = {\n childIndex: args.childIndex,\n converters: args.converters,\n formData: blockNode.fields ?? {},\n isEditor: false,\n isJSXConverter: true,\n node: blockNode,\n nodesToJSX: args.nodesToJSX,\n parent: args.parent,\n }\n return React.createElement(viewDef.Block, blockProps)\n }\n\n if (viewDef.html) {\n const converterArgs = {\n ...args,\n isEditor: false as const,\n isJSXConverter: true as const,\n }\n const htmlContent =\n typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html\n\n return <span dangerouslySetInnerHTML={{ __html: htmlContent }} />\n }\n\n return null\n }\n}\n\n/**\n * Converts a LexicalEditorNodeMap into JSXConverters\n */\nfunction nodeMapToConverters<TNodes extends SerializedNodeBase = SerializedNodeBase>(\n nodeMap: LexicalEditorNodeMap<TNodes>,\n): JSXConverters {\n const converters: JSXConverters = {}\n\n for (const [nodeType, value] of Object.entries(nodeMap)) {\n if (!value || typeof value !== 'object') {\n continue\n }\n\n // Handle special keys: blocks, inlineBlocks\n if (nodeType === 'blocks') {\n converters.blocks = {}\n for (const [blockType, _viewDef] of Object.entries(value)) {\n const viewDef = _viewDef as NodeMapBlockValue<any>\n // Check for Component, Block, or html\n if (viewDef.Component || viewDef.Block || viewDef.html) {\n converters.blocks[blockType] = createConverterFromBlockValue(viewDef)\n }\n }\n continue\n }\n\n if (nodeType === 'inlineBlocks') {\n converters.inlineBlocks = {}\n for (const [blockType, _viewDef] of Object.entries(value)) {\n const viewDef = _viewDef as NodeMapBlockValue<any>\n // Check for Component, Block, or html\n if (viewDef.Component || viewDef.Block || viewDef.html) {\n converters.inlineBlocks[blockType] = createConverterFromBlockValue(viewDef)\n }\n }\n continue\n }\n\n // Handle regular node types\n const viewDef = value as NodeMapValue\n\n if (viewDef.Component || viewDef.html) {\n converters[nodeType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n\n return converters\n}\n\nexport type ConvertLexicalToJSXArgs<TNodes extends SerializedNodeBase = SerializedNodeBase> = {\n converters: JSXConverters\n /**\n * Serialized editor state to render.\n */\n data: SerializedEditorState\n /**\n * If true, disables indentation globally. If an array, disables for specific node `type` values.\n */\n disableIndent?: boolean | string[]\n /**\n * If true, disables text alignment globally. If an array, disables for specific node `type` values.\n */\n disableTextAlign?: boolean | string[]\n /**\n * You can use the lexical editor node map or view map as converters. NodeMap converters will override converters passed\n * in the `converters` prop. If a LexicalEditorViewMap is provided, the `default` view will be used.\n */\n nodeMap?: LexicalEditorNodeMap<TNodes>\n}\n\nexport function convertLexicalToJSX<TNodes extends SerializedNodeBase = SerializedNodeBase>({\n converters,\n data,\n disableIndent,\n disableTextAlign,\n nodeMap,\n}: ConvertLexicalToJSXArgs<TNodes>): React.ReactNode {\n if (hasText(data)) {\n // Merge nodeMap converters with existing converters\n // NodeMap converters override existing converters\n const mergedConverters = nodeMap\n ? {\n ...converters,\n ...nodeMapToConverters(nodeMap),\n }\n : converters\n\n return convertLexicalNodesToJSX({\n converters: mergedConverters,\n disableIndent,\n disableTextAlign,\n nodes: data.root.children,\n parent: data.root,\n })\n }\n return <></>\n}\n\nexport function convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes,\n parent,\n}: {\n converters: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent: SerializedLexicalNodeWithParent\n}): React.ReactNode[] {\n const unknownConverter: JSXConverter<any> = converters.unknown as JSXConverter<any>\n\n const jsxArray: React.ReactNode[] = nodes.map((node, i) => {\n let converterForNode: JSXConverter<any> | undefined\n if (node.type === 'block') {\n converterForNode = converters?.blocks?.[(node as SerializedBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`,\n )\n }\n } else if (node.type === 'inlineBlock') {\n converterForNode =\n converters?.inlineBlocks?.[(node as SerializedInlineBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`,\n )\n }\n } else {\n converterForNode = converters[node.type] as JSXConverter<any>\n }\n\n try {\n if (!converterForNode && unknownConverter) {\n converterForNode = unknownConverter\n }\n\n let reactNode: React.ReactNode\n if (converterForNode) {\n const converted =\n typeof converterForNode === 'function'\n ? converterForNode({\n childIndex: i,\n converters,\n node,\n nodesToJSX: (args) => {\n return convertLexicalNodesToJSX({\n converters: args.converters ?? converters,\n disableIndent: args.disableIndent ?? disableIndent,\n disableTextAlign: args.disableTextAlign ?? disableTextAlign,\n nodes: args.nodes,\n parent: args.parent ?? {\n ...node,\n parent,\n },\n })\n },\n parent,\n })\n : converterForNode\n reactNode = converted\n } else {\n reactNode = <span key={i}>unknown node</span>\n }\n\n const style: React.CSSProperties = {}\n\n // Check if disableTextAlign is not true and does not include node type\n if (\n !disableTextAlign &&\n (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type))\n ) {\n if ('format' in node && node.format) {\n switch (node.format) {\n case 'center':\n style.textAlign = 'center'\n break\n case 'end':\n style.textAlign = 'right'\n break\n case 'justify':\n style.textAlign = 'justify'\n break\n case 'left':\n //style.textAlign = 'left'\n // Do nothing, as left is the default\n break\n case 'right':\n style.textAlign = 'right'\n break\n case 'start':\n style.textAlign = 'left'\n break\n }\n }\n }\n\n if (\n !disableIndent &&\n (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))\n ) {\n if ('indent' in node && node.indent && node.type !== 'listitem') {\n // the unit should be px. Do not change it to rem, em, or something else.\n // The quantity should be 40px. Do not change it either.\n // See rationale in\n // https://github.com/payloadcms/payload/issues/13130#issuecomment-3058348085\n style.paddingInlineStart = `${Number(node.indent) * 40}px`\n }\n }\n\n if (React.isValidElement(reactNode)) {\n // Inject style into reactNode\n if (style.textAlign || style.paddingInlineStart) {\n const newStyle = {\n ...style,\n // @ts-expect-error type better later\n ...(reactNode?.props?.style ?? {}),\n // reactNode style comes after, thus a textAlign specified in the converter has priority over the one we inject here\n }\n\n return React.cloneElement(reactNode, {\n key: i,\n // @ts-expect-error type better later\n style: newStyle,\n })\n }\n return React.cloneElement(reactNode, {\n key: i,\n })\n }\n\n return reactNode\n } catch (error) {\n console.error('Error converting lexical node to JSX:', error, 'node:', node)\n return null\n }\n })\n\n return jsxArray.filter(Boolean)\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["jsx","_jsx","Fragment","_Fragment","React","hasText","convertLexicalToJSX","converters","data","disableIndent","disableTextAlign","convertLexicalNodesToJSX","nodes","root","children","parent","unknownConverter","unknown","jsxArray","map","node","i","converterForNode","type","blocks","fields","blockType","console","error","inlineBlocks","reactNode","converted","childIndex","nodesToJSX","args","style","Array","isArray","includes","format","textAlign","indent","paddingInlineStart","Number","isValidElement","newStyle","props","cloneElement","key","filter","Boolean"],"sources":["../../../../../src/features/converters/lexicalToJSX/converter/index.tsx"],"sourcesContent":["/* eslint-disable no-console */\nimport type { SerializedEditorState, SerializedLexicalNode } from 'lexical'\n\nimport React from 'react'\n\nimport type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js'\nimport type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js'\n\nimport { hasText } from '../../../../validate/hasText.js'\n\nexport type ConvertLexicalToJSXArgs = {\n converters: JSXConverters\n data: SerializedEditorState\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n}\n\nexport function convertLexicalToJSX({\n converters,\n data,\n disableIndent,\n disableTextAlign,\n}: ConvertLexicalToJSXArgs): React.ReactNode {\n if (hasText(data)) {\n return convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes: data?.root?.children,\n parent: data?.root,\n })\n }\n return <></>\n}\n\nexport function convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes,\n parent,\n}: {\n converters: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent: SerializedLexicalNodeWithParent\n}): React.ReactNode[] {\n const unknownConverter: JSXConverter<any> = converters.unknown as JSXConverter<any>\n\n const jsxArray: React.ReactNode[] = nodes.map((node, i) => {\n let converterForNode: JSXConverter<any> | undefined\n if (node.type === 'block') {\n converterForNode = converters?.blocks?.[(node as SerializedBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`,\n )\n }\n } else if (node.type === 'inlineBlock') {\n converterForNode =\n converters?.inlineBlocks?.[(node as SerializedInlineBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`,\n )\n }\n } else {\n converterForNode = converters[node.type] as JSXConverter<any>\n }\n\n try {\n if (!converterForNode && unknownConverter) {\n converterForNode = unknownConverter\n }\n\n let reactNode: React.ReactNode\n if (converterForNode) {\n const converted =\n typeof converterForNode === 'function'\n ? converterForNode({\n childIndex: i,\n converters,\n node,\n nodesToJSX: (args) => {\n return convertLexicalNodesToJSX({\n converters: args.converters ?? converters,\n disableIndent: args.disableIndent ?? disableIndent,\n disableTextAlign: args.disableTextAlign ?? disableTextAlign,\n nodes: args.nodes,\n parent: args.parent ?? {\n ...node,\n parent,\n },\n })\n },\n parent,\n })\n : converterForNode\n reactNode = converted\n } else {\n reactNode = <span key={i}>unknown node</span>\n }\n\n const style: React.CSSProperties = {}\n\n // Check if disableTextAlign is not true and does not include node type\n if (\n !disableTextAlign &&\n (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type))\n ) {\n if ('format' in node && node.format) {\n switch (node.format) {\n case 'center':\n style.textAlign = 'center'\n break\n case 'end':\n style.textAlign = 'right'\n break\n case 'justify':\n style.textAlign = 'justify'\n break\n case 'left':\n //style.textAlign = 'left'\n // Do nothing, as left is the default\n break\n case 'right':\n style.textAlign = 'right'\n break\n case 'start':\n style.textAlign = 'left'\n break\n }\n }\n }\n\n if (\n !disableIndent &&\n (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))\n ) {\n if ('indent' in node && node.indent && node.type !== 'listitem') {\n // the unit should be px. Do not change it to rem, em, or something else.\n // The quantity should be 40px. Do not change it either.\n // See rationale in\n // https://github.com/payloadcms/payload/issues/13130#issuecomment-3058348085\n style.paddingInlineStart = `${Number(node.indent) * 40}px`\n }\n }\n\n if (React.isValidElement(reactNode)) {\n // Inject style into reactNode\n if (style.textAlign || style.paddingInlineStart) {\n const newStyle = {\n ...style,\n // @ts-expect-error type better later\n ...(reactNode?.props?.style ?? {}),\n // reactNode style comes after, thus a textAlign specified in the converter has priority over the one we inject here\n }\n\n return React.cloneElement(reactNode, {\n key: i,\n // @ts-expect-error type better later\n style: newStyle,\n })\n }\n return React.cloneElement(reactNode, {\n key: i,\n })\n }\n\n return reactNode\n } catch (error) {\n console.error('Error converting lexical node to JSX:', error, 'node:', node)\n return null\n }\n })\n\n return jsxArray.filter(Boolean)\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,12 +1,12 @@
1
1
  import type { SerializedLexicalNode } from 'lexical';
2
2
  import type { DefaultNodeTypes, SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js';
3
- export type JSXConverterArgs<TNode extends {
3
+ export type JSXConverter<T extends {
4
4
  [key: string]: any;
5
5
  type?: string;
6
- } = SerializedLexicalNode> = {
6
+ } = SerializedLexicalNode> = ((args: {
7
7
  childIndex: number;
8
8
  converters: JSXConverters;
9
- node: TNode;
9
+ node: T;
10
10
  nodesToJSX: (args: {
11
11
  converters?: JSXConverters;
12
12
  disableIndent?: boolean | string[];
@@ -15,12 +15,8 @@ export type JSXConverterArgs<TNode extends {
15
15
  parent?: SerializedLexicalNodeWithParent;
16
16
  }) => React.ReactNode[];
17
17
  parent: SerializedLexicalNodeWithParent;
18
- };
19
- export type JSXConverter<TNode extends {
20
- [key: string]: any;
21
- type?: string;
22
- } = SerializedLexicalNode> = ((args: JSXConverterArgs<TNode>) => React.ReactNode) | React.ReactNode;
23
- export type JSXConverters<TNodes extends {
18
+ }) => React.ReactNode) | React.ReactNode;
19
+ export type JSXConverters<T extends {
24
20
  [key: string]: any;
25
21
  type?: string;
26
22
  } = DefaultNodeTypes | SerializedBlockNode<{
@@ -34,27 +30,27 @@ export type JSXConverters<TNodes extends {
34
30
  [blockSlug: string]: JSXConverter<any>;
35
31
  } | JSXConverter<any> | undefined;
36
32
  } & {
37
- [nodeType in Exclude<NonNullable<TNodes['type']>, 'block' | 'inlineBlock'>]?: JSXConverter<Extract<TNodes, {
33
+ [nodeType in Exclude<NonNullable<T['type']>, 'block' | 'inlineBlock'>]?: JSXConverter<Extract<T, {
38
34
  type: nodeType;
39
35
  }>>;
40
36
  } & {
41
37
  blocks?: {
42
- [K in Extract<Extract<TNodes, {
38
+ [K in Extract<Extract<T, {
43
39
  type: 'block';
44
40
  }> extends SerializedBlockNode<infer B> ? B extends {
45
41
  blockType: string;
46
- } ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<TNodes, {
42
+ } ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<T, {
47
43
  type: 'block';
48
44
  }> extends SerializedBlockNode<infer B> ? SerializedBlockNode<Extract<B, {
49
45
  blockType: K;
50
46
  }>> : SerializedBlockNode>;
51
47
  };
52
48
  inlineBlocks?: {
53
- [K in Extract<Extract<TNodes, {
49
+ [K in Extract<Extract<T, {
54
50
  type: 'inlineBlock';
55
51
  }> extends SerializedInlineBlockNode<infer B> ? B extends {
56
52
  blockType: string;
57
- } ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<TNodes, {
53
+ } ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<T, {
58
54
  type: 'inlineBlock';
59
55
  }> extends SerializedInlineBlockNode<infer B> ? SerializedInlineBlockNode<Extract<B, {
60
56
  blockType: K;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"sourcesContent":["import type { SerializedLexicalNode } from 'lexical'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\n\nexport type JSXConverterArgs<\n TNode extends { [key: string]: any; type?: string } = SerializedLexicalNode,\n> = {\n childIndex: number\n converters: JSXConverters\n node: TNode\n nodesToJSX: (args: {\n converters?: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent?: SerializedLexicalNodeWithParent\n }) => React.ReactNode[]\n parent: SerializedLexicalNodeWithParent\n}\nexport type JSXConverter<\n TNode extends { [key: string]: any; type?: string } = SerializedLexicalNode,\n> = ((args: JSXConverterArgs<TNode>) => React.ReactNode) | React.ReactNode\n\nexport type JSXConverters<\n TNodes extends { [key: string]: any; type?: string } =\n | DefaultNodeTypes\n | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided\n | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided\n> = {\n [key: string]:\n | {\n [blockSlug: string]: JSXConverter<any>\n }\n | JSXConverter<any>\n | undefined\n} & {\n [nodeType in Exclude<NonNullable<TNodes['type']>, 'block' | 'inlineBlock'>]?: JSXConverter<\n Extract<TNodes, { type: nodeType }>\n >\n} & {\n blocks?: {\n [K in Extract<\n Extract<TNodes, { type: 'block' }> extends SerializedBlockNode<infer B>\n ? B extends { blockType: string }\n ? B['blockType']\n : never\n : never,\n string\n >]?: JSXConverter<\n Extract<TNodes, { type: 'block' }> extends SerializedBlockNode<infer B>\n ? SerializedBlockNode<Extract<B, { blockType: K }>>\n : SerializedBlockNode\n >\n }\n inlineBlocks?: {\n [K in Extract<\n Extract<TNodes, { type: 'inlineBlock' }> extends SerializedInlineBlockNode<infer B>\n ? B extends { blockType: string }\n ? B['blockType']\n : never\n : never,\n string\n >]?: JSXConverter<\n Extract<TNodes, { type: 'inlineBlock' }> extends SerializedInlineBlockNode<infer B>\n ? SerializedInlineBlockNode<Extract<B, { blockType: K }>>\n : SerializedInlineBlockNode\n >\n }\n unknown?: JSXConverter<SerializedLexicalNode>\n}\nexport type SerializedLexicalNodeWithParent = {\n parent?: SerializedLexicalNode\n} & SerializedLexicalNode\n"],"mappings":"AA0EA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"sourcesContent":["import type { SerializedLexicalNode } from 'lexical'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\nexport type JSXConverter<T extends { [key: string]: any; type?: string } = SerializedLexicalNode> =\n | ((args: {\n childIndex: number\n converters: JSXConverters\n node: T\n nodesToJSX: (args: {\n converters?: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent?: SerializedLexicalNodeWithParent\n }) => React.ReactNode[]\n parent: SerializedLexicalNodeWithParent\n }) => React.ReactNode)\n | React.ReactNode\n\nexport type JSXConverters<\n T extends { [key: string]: any; type?: string } =\n | DefaultNodeTypes\n | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided\n | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided\n> = {\n [key: string]:\n | {\n [blockSlug: string]: JSXConverter<any>\n }\n | JSXConverter<any>\n | undefined\n} & {\n [nodeType in Exclude<NonNullable<T['type']>, 'block' | 'inlineBlock'>]?: JSXConverter<\n Extract<T, { type: nodeType }>\n >\n} & {\n blocks?: {\n [K in Extract<\n Extract<T, { type: 'block' }> extends SerializedBlockNode<infer B>\n ? B extends { blockType: string }\n ? B['blockType']\n : never\n : never,\n string\n >]?: JSXConverter<\n Extract<T, { type: 'block' }> extends SerializedBlockNode<infer B>\n ? SerializedBlockNode<Extract<B, { blockType: K }>>\n : SerializedBlockNode\n >\n }\n inlineBlocks?: {\n [K in Extract<\n Extract<T, { type: 'inlineBlock' }> extends SerializedInlineBlockNode<infer B>\n ? B extends { blockType: string }\n ? B['blockType']\n : never\n : never,\n string\n >]?: JSXConverter<\n Extract<T, { type: 'inlineBlock' }> extends SerializedInlineBlockNode<infer B>\n ? SerializedInlineBlockNode<Extract<B, { blockType: K }>>\n : SerializedInlineBlockNode\n >\n }\n unknown?: JSXConverter<SerializedLexicalNode>\n}\nexport type SerializedLexicalNodeWithParent = {\n parent?: SerializedLexicalNode\n} & SerializedLexicalNode\n"],"mappings":"AAsEA","ignoreList":[]}
@@ -11,7 +11,7 @@ export function RichTextPlugin() {
11
11
  const [editor] = useLexicalComposerContext();
12
12
  let t0;
13
13
  if ($[0] !== editor) {
14
- t0 = () => editor.getEditorState().toJSON();
14
+ t0 = editor.getEditorState().toJSON();
15
15
  $[0] = editor;
16
16
  $[1] = t0;
17
17
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useEffect","useState","defaultJSXConverters","RichText","RichTextPlugin","$","editor","t0","getEditorState","toJSON","editorState","setEditorState","t1","t2","registerUpdateListener","t3","editorState_0","_jsx","className","children","converters","data"],"sources":["../../../../../../src/features/debug/jsxConverter/client/plugin/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useEffect, useState } from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { defaultJSXConverters, RichText } from '../../../../../exports/react/index.js'\nimport './style.scss'\n\nexport function RichTextPlugin() {\n const [editor] = useLexicalComposerContext()\n const [editorState, setEditorState] = useState(() => editor.getEditorState().toJSON())\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n setEditorState(editorState.toJSON())\n })\n }, [editor])\n\n return (\n <div className=\"debug-jsx-converter\">\n <RichText converters={defaultJSXConverters} data={editorState} />\n </div>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,SAAS,EAAEC,QAAQ,QAAQ;AAEpC;AACA,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ;AAG/C,OAAO,SAAAC,eAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EACL,OAAAQ,MAAA,IAAiBP,yBAAA;EAAA,IAAAQ,EAAA;EAAA,IAAAF,CAAA,QAAAC,MAAA;IAC8BC,EAAA,GAAAA,CAAA,KAAMD,MAAA,CAAAE,cAAA,CAAqB,EAAAC,MAAA,CAAS;IAAAJ,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,EAAA;EAAA;IAAAA,EAAA,GAAAF,CAAA;EAAA;EAAnF,OAAAK,WAAA,EAAAC,cAAA,IAAsCV,QAAA,CAASM,EAAoC;EAAA,IAAAK,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAR,CAAA,QAAAC,MAAA;IAEzEM,EAAA,GAAAA,CAAA,KACDN,MAAA,CAAAQ,sBAAA,CAAAC,EAAA;MAA+B;QAAAL,WAAA,EAAAM;MAAA,IAAAD,EAAe;MACnDJ,cAAA,CAAeD,aAAA,CAAAD,MAAA,CAAkB;IAAA,CACnC;IACCI,EAAA,IAACP,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAO,EAAA;IAAAP,CAAA,MAAAQ,EAAA;EAAA;IAAAD,EAAA,GAAAP,CAAA;IAAAQ,EAAA,GAAAR,CAAA;EAAA;EAJXL,SAAA,CAAUY,EAIV,EAAGC,EAAQ;EAAA,IAAAE,EAAA;EAAA,IAAAV,CAAA,QAAAK,WAAA;IAGTK,EAAA,GAAAE,IAAA,CAAC;MAAAC,SAAA,EAAc;MAAAC,QAAA,EACbF,IAAA,CAAAd,QAAA;QAAAiB,UAAA,EAAAlB,oBAAA;QAAAmB,IAAA,EAAkDX;MAAA,C;;;;;;;SADpDK,E","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useEffect","useState","defaultJSXConverters","RichText","RichTextPlugin","$","editor","t0","getEditorState","toJSON","editorState","setEditorState","t1","t2","registerUpdateListener","t3","editorState_0","_jsx","className","children","converters","data"],"sources":["../../../../../../src/features/debug/jsxConverter/client/plugin/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useEffect, useState } from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { defaultJSXConverters, RichText } from '../../../../../exports/react/index.js'\nimport './style.scss'\n\nexport function RichTextPlugin() {\n const [editor] = useLexicalComposerContext()\n const [editorState, setEditorState] = useState(editor.getEditorState().toJSON())\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n setEditorState(editorState.toJSON())\n })\n }, [editor])\n\n return (\n <div className=\"debug-jsx-converter\">\n <RichText converters={defaultJSXConverters} data={editorState} />\n </div>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,SAAS,EAAEC,QAAQ,QAAQ;AAEpC;AACA,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ;AAG/C,OAAO,SAAAC,eAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EACL,OAAAQ,MAAA,IAAiBP,yBAAA;EAAA,IAAAQ,EAAA;EAAA,IAAAF,CAAA,QAAAC,MAAA;IAC8BC,EAAA,GAAAD,MAAA,CAAAE,cAAA,CAAqB,EAAAC,MAAA,CAAS;IAAAJ,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,EAAA;EAAA;IAAAA,EAAA,GAAAF,CAAA;EAAA;EAA7E,OAAAK,WAAA,EAAAC,cAAA,IAAsCV,QAAA,CAASM,EAA8B;EAAA,IAAAK,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAR,CAAA,QAAAC,MAAA;IAEnEM,EAAA,GAAAA,CAAA,KACDN,MAAA,CAAAQ,sBAAA,CAAAC,EAAA;MAA+B;QAAAL,WAAA,EAAAM;MAAA,IAAAD,EAAe;MACnDJ,cAAA,CAAeD,aAAA,CAAAD,MAAA,CAAkB;IAAA,CACnC;IACCI,EAAA,IAACP,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAO,EAAA;IAAAP,CAAA,MAAAQ,EAAA;EAAA;IAAAD,EAAA,GAAAP,CAAA;IAAAQ,EAAA,GAAAR,CAAA;EAAA;EAJXL,SAAA,CAAUY,EAIV,EAAGC,EAAQ;EAAA,IAAAE,EAAA;EAAA,IAAAV,CAAA,QAAAK,WAAA;IAGTK,EAAA,GAAAE,IAAA,CAAC;MAAAC,SAAA,EAAc;MAAAC,QAAA,EACbF,IAAA,CAAAd,QAAA;QAAAiB,UAAA,EAAAlB,oBAAA;QAAAmB,IAAA,EAAkDX;MAAA,C;;;;;;;SADpDK,E","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAqBvE,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CA0YvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAoE,MAAM,OAAO,CAAA;AAqBxF,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAuZvF"}
@@ -9,7 +9,7 @@ import { CloseMenuIcon, EditIcon, ExternalLinkIcon, formatDrawerSlug, useConfig,
9
9
  import { requests } from '@payloadcms/ui/shared';
10
10
  import { $getSelection, $isLineBreakNode, $isRangeSelection, COMMAND_PRIORITY_HIGH, COMMAND_PRIORITY_LOW, getDOMSelection, KEY_ESCAPE_COMMAND, SELECTION_CHANGE_COMMAND } from 'lexical';
11
11
  import { formatAdminURL } from 'payload/shared';
12
- import React, { useCallback, useEffect, useRef, useState } from 'react';
12
+ import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
13
13
  import { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js';
14
14
  import { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js';
15
15
  import { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js';
@@ -29,6 +29,7 @@ export function LinkEditor({
29
29
  // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)
30
30
  const [linkNode, setLinkNode] = useState();
31
31
  const editorRef = useRef(null);
32
+ const selectedNodeRectRef = useRef(null);
32
33
  const [linkUrl, setLinkUrl] = useState(null);
33
34
  const [linkLabel, setLinkLabel] = useState(null);
34
35
  const {
@@ -179,7 +180,8 @@ export function LinkEditor({
179
180
  }
180
181
  if (selectedNodeDomRect != null) {
181
182
  selectedNodeDomRect.y += 40;
182
- setFloatingElemPositionForLinkEditor(selectedNodeDomRect, editorElem, anchorElem);
183
+ // Store the rect for positioning in useLayoutEffect after content renders
184
+ selectedNodeRectRef.current = selectedNodeDomRect;
183
185
  }
184
186
  } else if (activeElement == null || activeElement.className !== 'link-input') {
185
187
  if (rootElement !== null) {
@@ -240,6 +242,15 @@ export function LinkEditor({
240
242
  void $updateLinkEditor();
241
243
  });
242
244
  }, [editor, $updateLinkEditor]);
245
+ // Position the tooltip after React renders the link content
246
+ useLayoutEffect(() => {
247
+ if (!isLink || !editorRef.current || !anchorElem || !selectedNodeRectRef.current) {
248
+ return;
249
+ }
250
+ // Now the DOM has the actual link element, we can position the tooltip
251
+ setFloatingElemPositionForLinkEditor(selectedNodeRectRef.current, editorRef.current, anchorElem);
252
+ // linkNode dependency ensures re-positioning when clicking between different links with the same URL
253
+ }, [linkUrl, linkLabel, isLink, anchorElem, linkNode]);
243
254
  return /*#__PURE__*/_jsxs(React.Fragment, {
244
255
  children: [/*#__PURE__*/_jsx("div", {
245
256
  className: "link-editor",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","CloseMenuIcon","EditIcon","ExternalLinkIcon","formatDrawerSlug","useConfig","useEditDepth","useLocale","useTranslation","requests","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatAdminURL","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","apiRoute","api","path","serverURL","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","_jsxs","Fragment","_jsx","ref","length","href","rel","target","__fields","newTab","_Fragment","onClick","onMouseDown","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CloseMenuIcon,\n EditIcon,\n ExternalLinkIcon,\n formatDrawerSlug,\n useConfig,\n useEditDepth,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n },\n )\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n setFloatingElemPositionForLinkEditor(selectedNodeDomRect, editorElem, anchorElem)\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [\n editor,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void $updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n </>\n ) : null}\n\n {isEditable && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <EditIcon />\n </button>\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <CloseMenuIcon />\n </button>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","CloseMenuIcon","EditIcon","ExternalLinkIcon","formatDrawerSlug","useConfig","useEditDepth","useLocale","useTranslation","requests","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatAdminURL","React","useCallback","useEffect","useLayoutEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","selectedNodeRectRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","apiRoute","api","path","serverURL","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","_jsxs","Fragment","_jsx","ref","length","href","rel","target","__fields","newTab","_Fragment","onClick","onMouseDown","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CloseMenuIcon,\n EditIcon,\n ExternalLinkIcon,\n formatDrawerSlug,\n useConfig,\n useEditDepth,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const selectedNodeRectRef = useRef<DOMRect | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n },\n )\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n // Store the rect for positioning in useLayoutEffect after content renders\n selectedNodeRectRef.current = selectedNodeDomRect\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [\n editor,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void $updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n // Position the tooltip after React renders the link content\n useLayoutEffect(() => {\n if (!isLink || !editorRef.current || !anchorElem || !selectedNodeRectRef.current) {\n return\n }\n\n // Now the DOM has the actual link element, we can position the tooltip\n setFloatingElemPositionForLinkEditor(selectedNodeRectRef.current, editorRef.current, anchorElem)\n // linkNode dependency ensures re-positioning when clicking between different links with the same URL\n }, [linkUrl, linkLabel, isLink, anchorElem, linkNode])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n </>\n ) : null}\n\n {isEditable && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <EditIcon />\n </button>\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <CloseMenuIcon />\n </button>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/field/Field.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAGxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAE7E,OAAO,mCAAmC,CAAA;AAC1C,OAAO,eAAe,CAAA;AACtB,OAAO,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAS5D,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAC/B;IACE,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAA;CACnD,GAAG,yBAAyB,CAuL9B,CAAA;AAaD,eAAO,MAAM,QAAQ,EAAE,OAAO,iBAAqC,CAAA"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/field/Field.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAGxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAE7E,OAAO,mCAAmC,CAAA;AAC1C,OAAO,eAAe,CAAA;AACtB,OAAO,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAO5D,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAC/B;IACE,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAA;CACnD,GAAG,yBAAyB,CA4K9B,CAAA;AAaD,eAAO,MAAM,QAAQ,EAAE,OAAO,iBAAqC,CAAA"}
@@ -9,8 +9,6 @@ import { ErrorBoundary } from 'react-error-boundary';
9
9
  import './bundled.css';
10
10
  import { LexicalProvider } from '../lexical/LexicalProvider.js';
11
11
  import { useRunDeprioritized } from '../utilities/useRunDeprioritized.js';
12
- import { useRichTextView } from './RichTextViewProvider.js';
13
- import { ViewSelector } from './ViewSelector.js';
14
12
  const baseClass = 'rich-text-lexical';
15
13
  const RichTextComponent = props => {
16
14
  const {
@@ -32,9 +30,6 @@ const RichTextComponent = props => {
32
30
  } = props;
33
31
  const readOnlyFromProps = readOnlyFromTopLevelProps || readOnlyFromAdmin;
34
32
  const editDepth = useEditDepth();
35
- const {
36
- hasInheritedView
37
- } = useRichTextView();
38
33
  const memoizedValidate = useCallback((value, validationOptions) => {
39
34
  if (typeof validate === 'function') {
40
35
  // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve
@@ -85,7 +80,7 @@ const RichTextComponent = props => {
85
80
  window.removeEventListener('resize', updateViewPortWidth);
86
81
  };
87
82
  }, [isSmallWidthViewport]);
88
- const classes = ['field-type', baseClass, className, showError && 'error', disabled && `${baseClass}--read-only`, editorConfig?.admin?.hideGutter !== true && !isSmallWidthViewport ? `${baseClass}--show-gutter` : null].filter(Boolean).join(' ');
83
+ const classes = [baseClass, 'field-type', className, showError && 'error', disabled && `${baseClass}--read-only`, editorConfig?.admin?.hideGutter !== true && !isSmallWidthViewport ? `${baseClass}--show-gutter` : null].filter(Boolean).join(' ');
89
84
  const pathWithEditDepth = `${path}.${editDepth}`;
90
85
  const runDeprioritized = useRunDeprioritized() // defaults to 500 ms timeout
91
86
  ;
@@ -124,7 +119,6 @@ const RichTextComponent = props => {
124
119
  }, [initialValue]);
125
120
  return /*#__PURE__*/_jsxs("div", {
126
121
  className: classes,
127
- "data-lexical-view": editorConfig?.view,
128
122
  style: styles,
129
123
  children: [/*#__PURE__*/_jsx(RenderCustomComponent, {
130
124
  CustomComponent: Error,
@@ -132,14 +126,11 @@ const RichTextComponent = props => {
132
126
  path: path,
133
127
  showError: showError
134
128
  })
135
- }), /*#__PURE__*/_jsxs("div", {
136
- className: `${baseClass}__label-row`,
137
- children: [Label || /*#__PURE__*/_jsx(FieldLabel, {
138
- label: label,
139
- localized: localized,
140
- path: path,
141
- required: required
142
- }), !hasInheritedView && /*#__PURE__*/_jsx(ViewSelector, {})]
129
+ }), Label || /*#__PURE__*/_jsx(FieldLabel, {
130
+ label: label,
131
+ localized: localized,
132
+ path: path,
133
+ required: required
143
134
  }), /*#__PURE__*/_jsxs("div", {
144
135
  className: `${baseClass}__wrap`,
145
136
  children: [/*#__PURE__*/_jsxs(ErrorBoundary, {