@payloadcms/richtext-lexical 3.59.0-internal.929dda3 → 3.59.0-internal.c8403a3

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 (201) hide show
  1. package/dist/exports/client/Field-CJFETHA3.js +2 -0
  2. package/dist/exports/client/Field-CJFETHA3.js.map +7 -0
  3. package/dist/exports/client/RelationshipComponent-TSIENULZ.js +2 -0
  4. package/dist/exports/client/RelationshipComponent-TSIENULZ.js.map +7 -0
  5. package/dist/exports/client/bundled.css +1 -1
  6. package/dist/exports/client/chunk-BQCXN3B4.js +2 -0
  7. package/dist/exports/client/chunk-BQCXN3B4.js.map +7 -0
  8. package/dist/exports/client/{chunk-2Y72RT72.js → chunk-TLQLXR6Q.js} +2 -2
  9. package/dist/exports/client/chunk-XNERFY6G.js +2 -0
  10. package/dist/exports/client/chunk-XNERFY6G.js.map +7 -0
  11. package/dist/exports/client/component-CYFKY3IL.js +2 -0
  12. package/dist/exports/client/component-CYFKY3IL.js.map +7 -0
  13. package/dist/exports/client/componentInline-NGTRUSGB.js +2 -0
  14. package/dist/exports/client/index.d.ts +3 -0
  15. package/dist/exports/client/index.d.ts.map +1 -1
  16. package/dist/exports/client/index.js +35 -10
  17. package/dist/exports/client/index.js.map +4 -4
  18. package/dist/features/align/server/i18n.d.ts.map +1 -1
  19. package/dist/features/align/server/i18n.js +6 -0
  20. package/dist/features/align/server/i18n.js.map +1 -1
  21. package/dist/features/blockquote/server/i18n.d.ts.map +1 -1
  22. package/dist/features/blockquote/server/i18n.js +3 -0
  23. package/dist/features/blockquote/server/i18n.js.map +1 -1
  24. package/dist/features/blocks/client/component/BlockContent.d.ts +52 -27
  25. package/dist/features/blocks/client/component/BlockContent.d.ts.map +1 -1
  26. package/dist/features/blocks/client/component/BlockContent.js +48 -51
  27. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  28. package/dist/features/blocks/client/component/components/BlockCollapsible.d.ts +2 -9
  29. package/dist/features/blocks/client/component/components/BlockCollapsible.d.ts.map +1 -1
  30. package/dist/features/blocks/client/component/components/BlockCollapsible.js +7 -25
  31. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  32. package/dist/features/blocks/client/component/index.d.ts.map +1 -1
  33. package/dist/features/blocks/client/component/index.js +71 -56
  34. package/dist/features/blocks/client/component/index.js.map +1 -1
  35. package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
  36. package/dist/features/blocks/client/componentInline/index.js +13 -11
  37. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  38. package/dist/features/blocks/client/index.d.ts.map +1 -1
  39. package/dist/features/blocks/client/index.js +5 -0
  40. package/dist/features/blocks/client/index.js.map +1 -1
  41. package/dist/features/blocks/client/markdown/getLexicalToMarkdown.d.ts +6 -0
  42. package/dist/features/blocks/client/markdown/getLexicalToMarkdown.d.ts.map +1 -0
  43. package/dist/features/blocks/client/markdown/getLexicalToMarkdown.js +24 -0
  44. package/dist/features/blocks/client/markdown/getLexicalToMarkdown.js.map +1 -0
  45. package/dist/features/blocks/client/markdown/getMarkdownToLexical.d.ts +6 -0
  46. package/dist/features/blocks/client/markdown/getMarkdownToLexical.d.ts.map +1 -0
  47. package/dist/features/blocks/client/markdown/getMarkdownToLexical.js +20 -0
  48. package/dist/features/blocks/client/markdown/getMarkdownToLexical.js.map +1 -0
  49. package/dist/features/blocks/client/markdown/markdownTransformer.d.ts +12 -0
  50. package/dist/features/blocks/client/markdown/markdownTransformer.d.ts.map +1 -0
  51. package/dist/features/blocks/client/markdown/markdownTransformer.js +348 -0
  52. package/dist/features/blocks/client/markdown/markdownTransformer.js.map +1 -0
  53. package/dist/features/blocks/premade/CodeBlock/Component/Block.d.ts +5 -0
  54. package/dist/features/blocks/premade/CodeBlock/Component/Block.d.ts.map +1 -0
  55. package/dist/features/blocks/premade/CodeBlock/Component/Block.js +114 -0
  56. package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -0
  57. package/dist/features/blocks/premade/CodeBlock/Component/Code.d.ts +56 -0
  58. package/dist/features/blocks/premade/CodeBlock/Component/Code.d.ts.map +1 -0
  59. package/dist/features/blocks/premade/CodeBlock/Component/Code.js +96 -0
  60. package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -0
  61. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.d.ts +4 -0
  62. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.d.ts.map +1 -0
  63. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js +17 -0
  64. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js.map +1 -0
  65. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.d.ts +4 -0
  66. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.d.ts.map +1 -0
  67. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js +26 -0
  68. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js.map +1 -0
  69. package/dist/features/blocks/premade/CodeBlock/Component/defaultLanguages.d.ts +5 -0
  70. package/dist/features/blocks/premade/CodeBlock/Component/defaultLanguages.d.ts.map +1 -0
  71. package/dist/features/blocks/premade/CodeBlock/Component/defaultLanguages.js +87 -0
  72. package/dist/features/blocks/premade/CodeBlock/Component/defaultLanguages.js.map +1 -0
  73. package/dist/features/blocks/premade/CodeBlock/converter.d.ts +7 -0
  74. package/dist/features/blocks/premade/CodeBlock/converter.d.ts.map +1 -0
  75. package/dist/features/blocks/premade/CodeBlock/converter.js +46 -0
  76. package/dist/features/blocks/premade/CodeBlock/converter.js.map +1 -0
  77. package/dist/features/blocks/premade/CodeBlock/converterClient.d.ts +2 -0
  78. package/dist/features/blocks/premade/CodeBlock/converterClient.d.ts.map +1 -0
  79. package/dist/features/blocks/premade/CodeBlock/converterClient.js +4 -0
  80. package/dist/features/blocks/premade/CodeBlock/converterClient.js.map +1 -0
  81. package/dist/features/blocks/premade/CodeBlock/index.d.ts +7 -0
  82. package/dist/features/blocks/premade/CodeBlock/index.d.ts.map +1 -0
  83. package/dist/features/blocks/premade/CodeBlock/index.js +50 -0
  84. package/dist/features/blocks/premade/CodeBlock/index.js.map +1 -0
  85. package/dist/features/blocks/server/i18n.d.ts.map +1 -1
  86. package/dist/features/blocks/server/i18n.js +9 -0
  87. package/dist/features/blocks/server/i18n.js.map +1 -1
  88. package/dist/features/blocks/server/index.js +1 -1
  89. package/dist/features/blocks/server/index.js.map +1 -1
  90. package/dist/features/blocks/server/markdown/linesFromMatchToContentAndPropsString.d.ts.map +1 -0
  91. package/dist/features/blocks/server/markdown/linesFromMatchToContentAndPropsString.js.map +1 -0
  92. package/dist/features/blocks/server/markdown/markdownTransformer.d.ts +15 -0
  93. package/dist/features/blocks/server/markdown/markdownTransformer.d.ts.map +1 -0
  94. package/dist/features/blocks/server/{markdownTransformer.js → markdown/markdownTransformer.js} +22 -53
  95. package/dist/features/blocks/server/markdown/markdownTransformer.js.map +1 -0
  96. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.d.ts.map +1 -1
  97. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +5 -3
  98. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  99. package/dist/features/heading/server/i18n.d.ts.map +1 -1
  100. package/dist/features/heading/server/i18n.js +3 -0
  101. package/dist/features/heading/server/i18n.js.map +1 -1
  102. package/dist/features/horizontalRule/server/i18n.d.ts.map +1 -1
  103. package/dist/features/horizontalRule/server/i18n.js +3 -0
  104. package/dist/features/horizontalRule/server/i18n.js.map +1 -1
  105. package/dist/features/indent/server/i18n.d.ts.map +1 -1
  106. package/dist/features/indent/server/i18n.js +4 -0
  107. package/dist/features/indent/server/i18n.js.map +1 -1
  108. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  109. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +3 -1
  110. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  111. package/dist/features/link/server/i18n.d.ts.map +1 -1
  112. package/dist/features/link/server/i18n.js +4 -0
  113. package/dist/features/link/server/i18n.js.map +1 -1
  114. package/dist/features/lists/checklist/server/i18n.d.ts.map +1 -1
  115. package/dist/features/lists/checklist/server/i18n.js +3 -0
  116. package/dist/features/lists/checklist/server/i18n.js.map +1 -1
  117. package/dist/features/lists/orderedList/server/i18n.d.ts.map +1 -1
  118. package/dist/features/lists/orderedList/server/i18n.js +3 -0
  119. package/dist/features/lists/orderedList/server/i18n.js.map +1 -1
  120. package/dist/features/lists/unorderedList/server/i18n.d.ts.map +1 -1
  121. package/dist/features/lists/unorderedList/server/i18n.js +3 -0
  122. package/dist/features/lists/unorderedList/server/i18n.js.map +1 -1
  123. package/dist/features/paragraph/server/i18n.d.ts.map +1 -1
  124. package/dist/features/paragraph/server/i18n.js +4 -0
  125. package/dist/features/paragraph/server/i18n.js.map +1 -1
  126. package/dist/features/relationship/client/components/RelationshipComponent.d.ts.map +1 -1
  127. package/dist/features/relationship/client/components/RelationshipComponent.js +5 -9
  128. package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
  129. package/dist/features/relationship/server/i18n.d.ts.map +1 -1
  130. package/dist/features/relationship/server/i18n.js +3 -0
  131. package/dist/features/relationship/server/i18n.js.map +1 -1
  132. package/dist/features/textState/i18n.d.ts.map +1 -1
  133. package/dist/features/textState/i18n.js +3 -0
  134. package/dist/features/textState/i18n.js.map +1 -1
  135. package/dist/features/toolbars/fixed/client/Toolbar/index.d.ts.map +1 -1
  136. package/dist/features/toolbars/fixed/client/Toolbar/index.js +7 -1
  137. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  138. package/dist/features/toolbars/inline/client/Toolbar/index.d.ts.map +1 -1
  139. package/dist/features/toolbars/inline/client/Toolbar/index.js +3 -1
  140. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  141. package/dist/features/upload/client/component/index.d.ts.map +1 -1
  142. package/dist/features/upload/client/component/index.js +6 -5
  143. package/dist/features/upload/client/component/index.js.map +1 -1
  144. package/dist/features/upload/server/i18n.d.ts.map +1 -1
  145. package/dist/features/upload/server/i18n.js +3 -0
  146. package/dist/features/upload/server/i18n.js.map +1 -1
  147. package/dist/field/bundled.css +1 -1
  148. package/dist/field/rscEntry.d.ts.map +1 -1
  149. package/dist/field/rscEntry.js +2 -0
  150. package/dist/field/rscEntry.js.map +1 -1
  151. package/dist/i18n.d.ts.map +1 -1
  152. package/dist/i18n.js +6 -0
  153. package/dist/i18n.js.map +1 -1
  154. package/dist/index.d.ts +1 -0
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +1 -0
  157. package/dist/index.js.map +1 -1
  158. package/dist/lexical/LexicalEditor.d.ts.map +1 -1
  159. package/dist/lexical/LexicalEditor.js +20 -26
  160. package/dist/lexical/LexicalEditor.js.map +1 -1
  161. package/dist/lexical/ui/icons/CodeBlock/index.d.ts.map +1 -1
  162. package/dist/lexical/ui/icons/CodeBlock/index.js +10 -15
  163. package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
  164. package/dist/lexical/ui/icons/Collapse/index.d.ts +3 -0
  165. package/dist/lexical/ui/icons/Collapse/index.d.ts.map +1 -0
  166. package/dist/lexical/ui/icons/Collapse/index.js +18 -0
  167. package/dist/lexical/ui/icons/Collapse/index.js.map +1 -0
  168. package/dist/utilities/buildInitialState.d.ts +1 -0
  169. package/dist/utilities/buildInitialState.d.ts.map +1 -1
  170. package/dist/utilities/buildInitialState.js +1 -0
  171. package/dist/utilities/buildInitialState.js.map +1 -1
  172. package/dist/utilities/fieldsDrawer/DrawerContent.d.ts.map +1 -1
  173. package/dist/utilities/fieldsDrawer/DrawerContent.js +7 -3
  174. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  175. package/dist/utilities/jsx/collectTopLevelJSXInLines.js +2 -2
  176. package/dist/utilities/jsx/collectTopLevelJSXInLines.js.map +1 -1
  177. package/package.json +6 -6
  178. package/dist/exports/client/Field-EHRBYNHO.js +0 -2
  179. package/dist/exports/client/Field-EHRBYNHO.js.map +0 -7
  180. package/dist/exports/client/RelationshipComponent-APF3CN47.js +0 -2
  181. package/dist/exports/client/RelationshipComponent-APF3CN47.js.map +0 -7
  182. package/dist/exports/client/chunk-3BY5IZJD.js +0 -2
  183. package/dist/exports/client/chunk-3BY5IZJD.js.map +0 -7
  184. package/dist/exports/client/chunk-CYLMY5ZJ.js +0 -2
  185. package/dist/exports/client/chunk-CYLMY5ZJ.js.map +0 -7
  186. package/dist/exports/client/component-VDJI45F2.js +0 -2
  187. package/dist/exports/client/component-VDJI45F2.js.map +0 -7
  188. package/dist/exports/client/componentInline-7TPI7ZBC.js +0 -2
  189. package/dist/features/blocks/client/markdownTransformer.d.ts +0 -17
  190. package/dist/features/blocks/client/markdownTransformer.d.ts.map +0 -1
  191. package/dist/features/blocks/client/markdownTransformer.js +0 -144
  192. package/dist/features/blocks/client/markdownTransformer.js.map +0 -1
  193. package/dist/features/blocks/server/linesFromMatchToContentAndPropsString.d.ts.map +0 -1
  194. package/dist/features/blocks/server/linesFromMatchToContentAndPropsString.js.map +0 -1
  195. package/dist/features/blocks/server/markdownTransformer.d.ts +0 -22
  196. package/dist/features/blocks/server/markdownTransformer.d.ts.map +0 -1
  197. package/dist/features/blocks/server/markdownTransformer.js.map +0 -1
  198. /package/dist/exports/client/{chunk-2Y72RT72.js.map → chunk-TLQLXR6Q.js.map} +0 -0
  199. /package/dist/exports/client/{componentInline-7TPI7ZBC.js.map → componentInline-NGTRUSGB.js.map} +0 -0
  200. /package/dist/features/blocks/server/{linesFromMatchToContentAndPropsString.d.ts → markdown/linesFromMatchToContentAndPropsString.d.ts} +0 -0
  201. /package/dist/features/blocks/server/{linesFromMatchToContentAndPropsString.js → markdown/linesFromMatchToContentAndPropsString.js} +0 -0
@@ -0,0 +1,348 @@
1
+ import { $parseSerializedNode } from 'lexical';
2
+ import { extractPropsFromJSXPropsString } from '../../../../utilities/jsx/extractPropsFromJSXPropsString.js';
3
+ import { propsToJSXString } from '../../../../utilities/jsx/jsx.js';
4
+ import { linesFromStartToContentAndPropsString } from '../../server/markdown/linesFromMatchToContentAndPropsString.js';
5
+ import { $createBlockNode, $isBlockNode, BlockNode } from '../nodes/BlocksNode.js';
6
+ import { $createInlineBlockNode, $isInlineBlockNode, InlineBlockNode } from '../nodes/InlineBlocksNode.js';
7
+ import { getLexicalToMarkdown } from './getLexicalToMarkdown.js';
8
+ import { getMarkdownToLexical } from './getMarkdownToLexical.js';
9
+ function createTagRegexes(tagName) {
10
+ const escapedTagName = tagName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
11
+ return {
12
+ regExpEnd: new RegExp(`</(${escapedTagName})\\s*>|<${escapedTagName}[^>]*?/>`, 'i'),
13
+ regExpStart: new RegExp(`<(${escapedTagName})([^>]*?)\\s*(/?)>`, 'i')
14
+ };
15
+ }
16
+ export const getBlockMarkdownTransformers = ({
17
+ blocks,
18
+ inlineBlocks
19
+ }) => {
20
+ if (!blocks?.length && !inlineBlocks?.length) {
21
+ return [];
22
+ }
23
+ let transformers = [];
24
+ if (blocks?.length) {
25
+ for (const block of blocks) {
26
+ const transformer = getMarkdownTransformerForBlock(block, false);
27
+ if (transformer) {
28
+ transformers = transformers.concat(transformer);
29
+ }
30
+ }
31
+ }
32
+ if (inlineBlocks?.length) {
33
+ for (const block of inlineBlocks) {
34
+ const transformer = getMarkdownTransformerForBlock(block, true);
35
+ if (transformer) {
36
+ transformers = transformers.concat(transformer);
37
+ }
38
+ }
39
+ }
40
+ return transformers;
41
+ };
42
+ function getMarkdownTransformerForBlock(block, isInlineBlock) {
43
+ if (!block.jsx) {
44
+ return null;
45
+ }
46
+ const regex = createTagRegexes(block.slug);
47
+ const toReturn = [];
48
+ if (isInlineBlock) {
49
+ toReturn.push(({
50
+ allNodes,
51
+ allTransformers
52
+ }) => ({
53
+ type: 'text-match',
54
+ dependencies: [InlineBlockNode],
55
+ export: node => {
56
+ if (!$isInlineBlockNode(node)) {
57
+ return null;
58
+ }
59
+ if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {
60
+ return null;
61
+ }
62
+ const nodeFields = node.getFields();
63
+ const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers);
64
+ const exportResult = block.jsx.export({
65
+ fields: nodeFields,
66
+ lexicalToMarkdown
67
+ });
68
+ if (exportResult === false) {
69
+ return null;
70
+ }
71
+ if (typeof exportResult === 'string') {
72
+ return exportResult;
73
+ }
74
+ const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0;
75
+ const props = exportResult.props ?? {};
76
+ if (exportResult?.children?.length) {
77
+ return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({
78
+ props
79
+ }) : ''}>${exportResult.children}</${nodeFields.blockType}>`;
80
+ }
81
+ return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({
82
+ props
83
+ }) : ''}/>`;
84
+ },
85
+ getEndIndex: (node, match) => {
86
+ const {
87
+ endlineLastCharIndex
88
+ } = linesFromStartToContentAndPropsString({
89
+ isEndOptional: false,
90
+ lines: [node.getTextContent()],
91
+ regexpEndRegex: regex.regExpEnd,
92
+ startLineIndex: 0,
93
+ startMatch: match,
94
+ trimChildren: false
95
+ });
96
+ return endlineLastCharIndex;
97
+ },
98
+ importRegExp: block.jsx?.customStartRegex ?? regex.regExpStart,
99
+ regExp: /___ignoreignoreignore___/g,
100
+ replace(node, match) {
101
+ const {
102
+ content,
103
+ propsString
104
+ } = linesFromStartToContentAndPropsString({
105
+ isEndOptional: false,
106
+ lines: [node.getTextContent()],
107
+ regexpEndRegex: regex.regExpEnd,
108
+ startLineIndex: 0,
109
+ startMatch: {
110
+ ...match,
111
+ index: 0
112
+ },
113
+ trimChildren: false
114
+ });
115
+ if (!block?.jsx?.import) {
116
+ // No multiline transformer handled this line successfully
117
+ return;
118
+ }
119
+ const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers);
120
+ const blockFields = block.jsx.import({
121
+ children: content,
122
+ closeMatch: null,
123
+ htmlToLexical: null,
124
+ markdownToLexical,
125
+ openMatch: match,
126
+ props: propsString ? extractPropsFromJSXPropsString({
127
+ propsString
128
+ }) : {}
129
+ });
130
+ if (blockFields === false) {
131
+ return;
132
+ }
133
+ const inlineBlockNode = $createInlineBlockNode({
134
+ blockType: block.slug,
135
+ ...blockFields
136
+ });
137
+ node.replace(inlineBlockNode);
138
+ }
139
+ }));
140
+ return toReturn;
141
+ }
142
+ toReturn.push(({
143
+ allNodes,
144
+ allTransformers
145
+ }) => ({
146
+ dependencies: [BlockNode],
147
+ export: node => {
148
+ if (!$isBlockNode(node)) {
149
+ return null;
150
+ }
151
+ if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {
152
+ return null;
153
+ }
154
+ const nodeFields = node.getFields();
155
+ const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers);
156
+ const exportResult = block.jsx.export({
157
+ fields: nodeFields,
158
+ lexicalToMarkdown
159
+ });
160
+ if (exportResult === false) {
161
+ return null;
162
+ }
163
+ if (typeof exportResult === 'string') {
164
+ return exportResult;
165
+ }
166
+ const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0;
167
+ const props = exportResult.props ?? {};
168
+ if (exportResult?.children?.length) {
169
+ const children = exportResult.children;
170
+ let sanitizedChildren = '';
171
+ // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child
172
+ if (children.includes('\n')) {
173
+ for (const child of children.split('\n')) {
174
+ let sanitizedChild = '';
175
+ if (!block?.jsx?.doNotTrimChildren && child !== '') {
176
+ sanitizedChild = ' ';
177
+ }
178
+ sanitizedChild += child + '\n';
179
+ sanitizedChildren += sanitizedChild;
180
+ }
181
+ } else {
182
+ sanitizedChildren = (block?.jsx?.doNotTrimChildren ? '' : ' ') + children + '\n';
183
+ }
184
+ return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({
185
+ props
186
+ }) : ''}>\n${sanitizedChildren}</${nodeFields.blockType}>`;
187
+ }
188
+ return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({
189
+ props
190
+ }) : ''}/>`;
191
+ },
192
+ handleImportAfterStartMatch: block.jsx?.customEndRegex ? undefined : ({
193
+ lines,
194
+ rootNode,
195
+ startLineIndex,
196
+ startMatch,
197
+ transformer
198
+ }) => {
199
+ const regexpEndRegex = typeof transformer.regExpEnd === 'object' && 'regExp' in transformer.regExpEnd ? transformer.regExpEnd.regExp : transformer.regExpEnd;
200
+ const isEndOptional = transformer.regExpEnd && typeof transformer.regExpEnd === 'object' && 'optional' in transformer.regExpEnd ? transformer.regExpEnd.optional : !transformer.regExpEnd;
201
+ const {
202
+ afterEndLine,
203
+ beforeStartLine,
204
+ content: unsanitizedContent,
205
+ endLineIndex,
206
+ propsString
207
+ } = linesFromStartToContentAndPropsString({
208
+ isEndOptional,
209
+ lines,
210
+ regexpEndRegex,
211
+ startLineIndex,
212
+ startMatch,
213
+ trimChildren: false
214
+ });
215
+ let content = '';
216
+ if (block?.jsx?.doNotTrimChildren) {
217
+ content = unsanitizedContent.endsWith('\n') ? unsanitizedContent.slice(0, -1) : unsanitizedContent;
218
+ } else {
219
+ // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child
220
+ if (unsanitizedContent.includes('\n')) {
221
+ const split = unsanitizedContent.split('\n');
222
+ let index = 0;
223
+ for (const child of split) {
224
+ index++;
225
+ if (child.startsWith(' ')) {
226
+ content += child.slice(2);
227
+ } else {
228
+ // If one child is misaligned, skip aligning completely, unless it's just empty
229
+ if (child === '') {
230
+ content += child;
231
+ } else {
232
+ content = unsanitizedContent.endsWith('\n') ? unsanitizedContent.slice(0, -1) : unsanitizedContent;
233
+ break;
234
+ }
235
+ }
236
+ content += index === split.length ? '' : '\n';
237
+ }
238
+ } else {
239
+ content = (!unsanitizedContent.startsWith(' ') ? unsanitizedContent : unsanitizedContent.slice(2)) + '\n';
240
+ }
241
+ }
242
+ if (!block?.jsx?.import) {
243
+ // No multiline transformer handled this line successfully
244
+ return [false, startLineIndex];
245
+ }
246
+ const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers);
247
+ const blockFields = block.jsx.import({
248
+ children: content,
249
+ closeMatch: null,
250
+ htmlToLexical: null,
251
+ markdownToLexical,
252
+ openMatch: startMatch,
253
+ props: propsString ? extractPropsFromJSXPropsString({
254
+ propsString
255
+ }) : {}
256
+ });
257
+ if (blockFields === false) {
258
+ return [false, startLineIndex];
259
+ }
260
+ const node = $createBlockNode({
261
+ blockType: block.slug,
262
+ ...blockFields
263
+ });
264
+ if (node) {
265
+ // Now handle beforeStartLine and afterEndLine. If those are not empty, we need to add them as text nodes before and after the block node.
266
+ // However, those themselves can contain other markdown matches, so we need to parse them as well.
267
+ // Example where this is needed: "Hello <InlineCode>inline code</InlineCode> test."
268
+ let prevNodes = null;
269
+ let nextNodes = null;
270
+ // TODO: Might not need this prevNodes and nextNodes handling if inline nodes are handled by textmatch transformers
271
+ if (beforeStartLine?.length) {
272
+ prevNodes = markdownToLexical({
273
+ markdown: beforeStartLine
274
+ })?.root?.children ?? [];
275
+ const firstPrevNode = prevNodes?.[0];
276
+ if (firstPrevNode) {
277
+ rootNode.append($parseSerializedNode(firstPrevNode));
278
+ }
279
+ }
280
+ rootNode.append(node);
281
+ if (afterEndLine?.length) {
282
+ nextNodes = markdownToLexical({
283
+ markdown: afterEndLine
284
+ })?.root?.children;
285
+ const lastChild = rootNode.getChildren()[rootNode.getChildren().length - 1];
286
+ const children = $parseSerializedNode(nextNodes[0])?.getChildren();
287
+ if (children?.length) {
288
+ for (const child of children) {
289
+ lastChild.append(child);
290
+ }
291
+ }
292
+ }
293
+ }
294
+ return [true, endLineIndex];
295
+ },
296
+ regExpEnd: block.jsx?.customEndRegex ?? regex.regExpEnd,
297
+ regExpStart: block.jsx?.customStartRegex ?? regex.regExpStart,
298
+ // This replace is ONLY run for ``` code blocks (so any blocks with custom start and end regexes). For others, we use the special JSX handling above:
299
+ type: 'multiline-element',
300
+ replace: (rootNode, children, openMatch, closeMatch, linesInBetween) => {
301
+ if (block?.jsx?.import) {
302
+ if (!linesInBetween) {
303
+ // convert children to linesInBetween
304
+ let line = '';
305
+ if (children) {
306
+ for (const child of children) {
307
+ line += child.getTextContent();
308
+ }
309
+ }
310
+ linesInBetween = [line];
311
+ }
312
+ let childrenString = '';
313
+ if (block?.jsx?.doNotTrimChildren) {
314
+ childrenString = linesInBetween.join('\n');
315
+ } else {
316
+ childrenString = linesInBetween.join('\n').trim();
317
+ }
318
+ const propsString = openMatch[1]?.trim();
319
+ const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers);
320
+ const blockFields = block.jsx.import({
321
+ children: childrenString,
322
+ closeMatch: closeMatch,
323
+ htmlToLexical: null,
324
+ markdownToLexical,
325
+ openMatch: openMatch,
326
+ props: propsString ? extractPropsFromJSXPropsString({
327
+ propsString
328
+ }) : {}
329
+ });
330
+ if (blockFields === false) {
331
+ return false;
332
+ }
333
+ const node = $createBlockNode({
334
+ blockType: block.slug,
335
+ ...blockFields
336
+ });
337
+ if (node) {
338
+ rootNode.append(node);
339
+ }
340
+ return;
341
+ }
342
+ return false // Run next transformer
343
+ ;
344
+ }
345
+ }));
346
+ return toReturn;
347
+ }
348
+ //# sourceMappingURL=markdownTransformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownTransformer.js","names":["$parseSerializedNode","extractPropsFromJSXPropsString","propsToJSXString","linesFromStartToContentAndPropsString","$createBlockNode","$isBlockNode","BlockNode","$createInlineBlockNode","$isInlineBlockNode","InlineBlockNode","getLexicalToMarkdown","getMarkdownToLexical","createTagRegexes","tagName","escapedTagName","replace","regExpEnd","RegExp","regExpStart","getBlockMarkdownTransformers","blocks","inlineBlocks","length","transformers","block","transformer","getMarkdownTransformerForBlock","concat","isInlineBlock","jsx","regex","slug","toReturn","push","allNodes","allTransformers","type","dependencies","export","node","getFields","blockType","toLowerCase","nodeFields","lexicalToMarkdown","exportResult","fields","hasProps","props","Object","keys","children","getEndIndex","match","endlineLastCharIndex","isEndOptional","lines","getTextContent","regexpEndRegex","startLineIndex","startMatch","trimChildren","importRegExp","customStartRegex","regExp","content","propsString","index","import","markdownToLexical","blockFields","closeMatch","htmlToLexical","openMatch","inlineBlockNode","sanitizedChildren","includes","child","split","sanitizedChild","doNotTrimChildren","handleImportAfterStartMatch","customEndRegex","undefined","rootNode","optional","afterEndLine","beforeStartLine","unsanitizedContent","endLineIndex","endsWith","slice","startsWith","prevNodes","nextNodes","markdown","root","firstPrevNode","append","lastChild","getChildren","linesInBetween","line","childrenString","join","trim"],"sources":["../../../../../src/features/blocks/client/markdown/markdownTransformer.ts"],"sourcesContent":["import type { ClientBlock } from 'payload'\n\nimport {\n $parseSerializedNode,\n type ElementNode,\n type Klass,\n type LexicalNode,\n type LexicalNodeReplacement,\n type SerializedLexicalNode,\n} from 'lexical'\n\nimport type { Transformer } from '../../../../packages/@lexical/markdown/index.js'\nimport type {\n MultilineElementTransformer,\n TextMatchTransformer,\n} from '../../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { extractPropsFromJSXPropsString } from '../../../../utilities/jsx/extractPropsFromJSXPropsString.js'\nimport { propsToJSXString } from '../../../../utilities/jsx/jsx.js'\nimport { linesFromStartToContentAndPropsString } from '../../server/markdown/linesFromMatchToContentAndPropsString.js'\nimport { $createBlockNode, $isBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport {\n $createInlineBlockNode,\n $isInlineBlockNode,\n InlineBlockNode,\n} from '../nodes/InlineBlocksNode.js'\nimport { getLexicalToMarkdown } from './getLexicalToMarkdown.js'\nimport { getMarkdownToLexical } from './getMarkdownToLexical.js'\n\nfunction createTagRegexes(tagName: string) {\n const escapedTagName = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return {\n regExpEnd: new RegExp(`</(${escapedTagName})\\\\s*>|<${escapedTagName}[^>]*?/>`, 'i'),\n regExpStart: new RegExp(`<(${escapedTagName})([^>]*?)\\\\s*(/?)>`, 'i'),\n }\n}\nexport const getBlockMarkdownTransformers = ({\n blocks,\n inlineBlocks,\n}: {\n blocks: ClientBlock[]\n inlineBlocks: ClientBlock[]\n}): ((props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n}) => MultilineElementTransformer | TextMatchTransformer)[] => {\n if (!blocks?.length && !inlineBlocks?.length) {\n return []\n }\n let transformers: ((props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer)[] = []\n\n if (blocks?.length) {\n for (const block of blocks) {\n const transformer = getMarkdownTransformerForBlock(block, false)\n\n if (transformer) {\n transformers = transformers.concat(transformer)\n }\n }\n }\n\n if (inlineBlocks?.length) {\n for (const block of inlineBlocks) {\n const transformer = getMarkdownTransformerForBlock(block, true)\n\n if (transformer) {\n transformers = transformers.concat(transformer)\n }\n }\n }\n\n return transformers\n}\n\nfunction getMarkdownTransformerForBlock(\n block: ClientBlock,\n isInlineBlock: boolean,\n): Array<\n (props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer\n> | null {\n if (!block.jsx) {\n return null\n }\n const regex = createTagRegexes(block.slug)\n const toReturn: Array<\n (props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer\n > = []\n\n if (isInlineBlock) {\n toReturn.push(({ allNodes, allTransformers }) => ({\n type: 'text-match',\n dependencies: [InlineBlockNode],\n export: (node) => {\n if (!$isInlineBlockNode(node)) {\n return null\n }\n\n if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {\n return null\n }\n\n const nodeFields = node.getFields()\n const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers)\n\n const exportResult = block.jsx!.export({\n fields: nodeFields,\n lexicalToMarkdown,\n })\n if (exportResult === false) {\n return null\n }\n if (typeof exportResult === 'string') {\n return exportResult\n }\n\n const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0\n const props = exportResult.props ?? {}\n\n if (exportResult?.children?.length) {\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}>${exportResult.children}</${nodeFields.blockType}>`\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}/>`\n },\n getEndIndex: (node, match) => {\n const { endlineLastCharIndex } = linesFromStartToContentAndPropsString({\n isEndOptional: false,\n lines: [node.getTextContent()],\n regexpEndRegex: regex.regExpEnd,\n startLineIndex: 0,\n startMatch: match,\n trimChildren: false,\n })\n\n return endlineLastCharIndex\n },\n importRegExp: block.jsx?.customStartRegex ?? regex.regExpStart,\n regExp: /___ignoreignoreignore___/g,\n replace(node, match) {\n const { content, propsString } = linesFromStartToContentAndPropsString({\n isEndOptional: false,\n lines: [node.getTextContent()],\n regexpEndRegex: regex.regExpEnd,\n startLineIndex: 0,\n startMatch: {\n ...match,\n index: 0,\n },\n trimChildren: false,\n })\n\n if (!block?.jsx?.import) {\n // No multiline transformer handled this line successfully\n return\n }\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: content,\n closeMatch: null,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: match,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return\n }\n\n const inlineBlockNode = $createInlineBlockNode({\n blockType: block.slug,\n ...(blockFields as any),\n })\n\n node.replace(inlineBlockNode)\n },\n }))\n\n return toReturn\n }\n\n toReturn.push(({ allNodes, allTransformers }) => ({\n dependencies: [BlockNode],\n export: (node) => {\n if (!$isBlockNode(node)) {\n return null\n }\n\n if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {\n return null\n }\n\n const nodeFields = node.getFields()\n const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers)\n\n const exportResult = block.jsx!.export({\n fields: nodeFields,\n lexicalToMarkdown,\n })\n if (exportResult === false) {\n return null\n }\n if (typeof exportResult === 'string') {\n return exportResult\n }\n\n const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0\n const props = exportResult.props ?? {}\n\n if (exportResult?.children?.length) {\n const children = exportResult.children\n let sanitizedChildren = ''\n\n // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child\n if (children.includes('\\n')) {\n for (const child of children.split('\\n')) {\n let sanitizedChild = ''\n if (!block?.jsx?.doNotTrimChildren && child !== '') {\n sanitizedChild = ' '\n }\n sanitizedChild += child + '\\n'\n\n sanitizedChildren += sanitizedChild\n }\n } else {\n sanitizedChildren = (block?.jsx?.doNotTrimChildren ? '' : ' ') + children + '\\n'\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}>\\n${sanitizedChildren}</${nodeFields.blockType}>`\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}/>`\n },\n handleImportAfterStartMatch: block.jsx?.customEndRegex\n ? undefined\n : ({ lines, rootNode, startLineIndex, startMatch, transformer }) => {\n const regexpEndRegex: RegExp | undefined =\n typeof transformer.regExpEnd === 'object' && 'regExp' in transformer.regExpEnd\n ? transformer.regExpEnd.regExp\n : transformer.regExpEnd\n\n const isEndOptional =\n transformer.regExpEnd &&\n typeof transformer.regExpEnd === 'object' &&\n 'optional' in transformer.regExpEnd\n ? transformer.regExpEnd.optional\n : !transformer.regExpEnd\n\n const {\n afterEndLine,\n beforeStartLine,\n content: unsanitizedContent,\n endLineIndex,\n propsString,\n } = linesFromStartToContentAndPropsString({\n isEndOptional,\n lines,\n regexpEndRegex,\n startLineIndex,\n startMatch,\n trimChildren: false,\n })\n\n let content = ''\n\n if (block?.jsx?.doNotTrimChildren) {\n content = unsanitizedContent.endsWith('\\n')\n ? unsanitizedContent.slice(0, -1)\n : unsanitizedContent\n } else {\n // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child\n if (unsanitizedContent.includes('\\n')) {\n const split = unsanitizedContent.split('\\n')\n let index = 0\n for (const child of split) {\n index++\n\n if (child.startsWith(' ')) {\n content += child.slice(2)\n } else {\n // If one child is misaligned, skip aligning completely, unless it's just empty\n if (child === '') {\n content += child\n } else {\n content = unsanitizedContent.endsWith('\\n')\n ? unsanitizedContent.slice(0, -1)\n : unsanitizedContent\n break\n }\n }\n\n content += index === split.length ? '' : '\\n'\n }\n } else {\n content =\n (!unsanitizedContent.startsWith(' ')\n ? unsanitizedContent\n : unsanitizedContent.slice(2)) + '\\n'\n }\n }\n\n if (!block?.jsx?.import) {\n // No multiline transformer handled this line successfully\n return [false, startLineIndex]\n }\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: content,\n closeMatch: null,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: startMatch,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return [false, startLineIndex]\n }\n\n const node = $createBlockNode({\n blockType: block.slug,\n ...blockFields,\n } as any)\n\n if (node) {\n // Now handle beforeStartLine and afterEndLine. If those are not empty, we need to add them as text nodes before and after the block node.\n // However, those themselves can contain other markdown matches, so we need to parse them as well.\n // Example where this is needed: \"Hello <InlineCode>inline code</InlineCode> test.\"\n let prevNodes: null | SerializedLexicalNode[] = null\n let nextNodes: null | SerializedLexicalNode[] = null\n // TODO: Might not need this prevNodes and nextNodes handling if inline nodes are handled by textmatch transformers\n\n if (beforeStartLine?.length) {\n prevNodes = markdownToLexical({ markdown: beforeStartLine })?.root?.children ?? []\n\n const firstPrevNode = prevNodes?.[0]\n if (firstPrevNode) {\n rootNode.append($parseSerializedNode(firstPrevNode))\n }\n }\n\n rootNode.append(node)\n\n if (afterEndLine?.length) {\n nextNodes = markdownToLexical({ markdown: afterEndLine })?.root?.children\n const lastChild = rootNode.getChildren()[rootNode.getChildren().length - 1]\n\n const children = ($parseSerializedNode(nextNodes[0]!) as ElementNode)?.getChildren()\n if (children?.length) {\n for (const child of children) {\n ;(lastChild as ElementNode).append(child)\n }\n }\n }\n }\n\n return [true, endLineIndex]\n },\n regExpEnd: block.jsx?.customEndRegex ?? regex.regExpEnd,\n regExpStart: block.jsx?.customStartRegex ?? regex.regExpStart,\n // This replace is ONLY run for ``` code blocks (so any blocks with custom start and end regexes). For others, we use the special JSX handling above:\n type: 'multiline-element',\n replace: (rootNode, children, openMatch, closeMatch, linesInBetween) => {\n if (block?.jsx?.import) {\n if (!linesInBetween) {\n // convert children to linesInBetween\n let line = ''\n if (children) {\n for (const child of children) {\n line += child.getTextContent()\n }\n }\n\n linesInBetween = [line]\n }\n\n let childrenString = ''\n if (block?.jsx?.doNotTrimChildren) {\n childrenString = linesInBetween.join('\\n')\n } else {\n childrenString = linesInBetween.join('\\n').trim()\n }\n\n const propsString = openMatch[1]?.trim()\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: childrenString,\n closeMatch: closeMatch as RegExpMatchArray,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: openMatch as RegExpMatchArray,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return false\n }\n\n const node = $createBlockNode({\n blockType: block.slug,\n ...blockFields,\n } as any)\n\n if (node) {\n rootNode.append(node)\n }\n\n return\n }\n return false // Run next transformer\n },\n }))\n\n return toReturn\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ import './index.scss';
2
+ import React from 'react';
3
+ import type { AdditionalCodeComponentProps } from './Code.js';
4
+ export declare const CodeBlockBlockComponent: React.FC<Pick<AdditionalCodeComponentProps, 'languages'>>;
5
+ //# sourceMappingURL=Block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Block.d.ts","sourceRoot":"","sources":["../../../../../../src/features/blocks/premade/CodeBlock/Component/Block.tsx"],"names":[],"mappings":"AAIA,OAAO,cAAc,CAAA;AAarB,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAA;AAS7D,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAuG7F,CAAA"}
@@ -0,0 +1,114 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
5
+ import { ChevronIcon, Combobox, CopyToClipboard, PopupList, RenderFields, useForm, useFormFields, useTranslation } from '@payloadcms/ui';
6
+ import React from 'react';
7
+ import { CodeBlockIcon } from '../../../../../lexical/ui/icons/CodeBlock/index.js';
8
+ import { useBlockComponentContext } from '../../../client/component/BlockContent.js';
9
+ import { Collapse } from './Collapse/index.js';
10
+ import { defaultLanguages } from './defaultLanguages.js';
11
+ import { FloatingCollapse } from './FloatingCollapse/index.js';
12
+ const baseClass = 'payload-richtext-code-block';
13
+ export const CodeBlockBlockComponent = args => {
14
+ const {
15
+ languages: languagesFromProps
16
+ } = args;
17
+ const languages = languagesFromProps || defaultLanguages;
18
+ const {
19
+ BlockCollapsible,
20
+ formSchema,
21
+ RemoveButton
22
+ } = useBlockComponentContext();
23
+ const {
24
+ setModified
25
+ } = useForm();
26
+ const {
27
+ t
28
+ } = useTranslation();
29
+ const {
30
+ codeField
31
+ } = useFormFields(([fields]) => ({
32
+ codeField: fields?.code
33
+ }));
34
+ const {
35
+ selectedLanguageField,
36
+ setSelectedLanguage
37
+ } = useFormFields(([fields_0, dispatch]) => ({
38
+ selectedLanguageField: fields_0?.language,
39
+ setSelectedLanguage: language => {
40
+ dispatch({
41
+ type: 'UPDATE',
42
+ path: 'language',
43
+ value: language
44
+ });
45
+ setModified(true);
46
+ }
47
+ }));
48
+ const selectedLanguageLabel = languages[selectedLanguageField?.value];
49
+ const isEditable = useLexicalEditable();
50
+ const languageEntries = React.useMemo(() => {
51
+ return Object.entries(languages).map(([languageCode, languageLabel]) => ({
52
+ name: `${languageCode} ${languageLabel}`,
53
+ Component: /*#__PURE__*/_jsx(PopupList.Button, {
54
+ active: false,
55
+ disabled: false,
56
+ onClick: () => {
57
+ setSelectedLanguage(languageCode);
58
+ },
59
+ children: /*#__PURE__*/_jsx("span", {
60
+ className: `${baseClass}__language-code`,
61
+ "data-language": languageCode,
62
+ children: languageLabel
63
+ })
64
+ })
65
+ }));
66
+ }, [languages, setSelectedLanguage]);
67
+ return /*#__PURE__*/_jsx(BlockCollapsible, {
68
+ Actions: /*#__PURE__*/_jsxs("div", {
69
+ className: `${baseClass}__actions`,
70
+ children: [/*#__PURE__*/_jsx(Combobox, {
71
+ button: /*#__PURE__*/_jsxs("div", {
72
+ className: `${baseClass}__language-selector-button`,
73
+ "data-selected-language": selectedLanguageField?.value,
74
+ children: [/*#__PURE__*/_jsx("span", {
75
+ children: selectedLanguageLabel
76
+ }), /*#__PURE__*/_jsx(ChevronIcon, {
77
+ className: `${baseClass}__chevron`
78
+ })]
79
+ }),
80
+ buttonType: "custom",
81
+ className: `${baseClass}__language-selector`,
82
+ disabled: !isEditable,
83
+ entries: languageEntries,
84
+ horizontalAlign: "right",
85
+ minEntriesForSearch: 8,
86
+ searchPlaceholder: t('fields:searchForLanguage'),
87
+ showScrollbar: true,
88
+ size: "large"
89
+ }), /*#__PURE__*/_jsx(CopyToClipboard, {
90
+ value: codeField?.value ?? ''
91
+ }), /*#__PURE__*/_jsx(Collapse, {}), isEditable && /*#__PURE__*/_jsx(RemoveButton, {})]
92
+ }),
93
+ className: baseClass,
94
+ collapsibleProps: {
95
+ AfterCollapsible: /*#__PURE__*/_jsx(FloatingCollapse, {}),
96
+ disableHeaderToggle: true,
97
+ disableToggleIndicator: true
98
+ },
99
+ Pill: /*#__PURE__*/_jsx("div", {
100
+ className: `${baseClass}__pill`,
101
+ children: /*#__PURE__*/_jsx(CodeBlockIcon, {})
102
+ }),
103
+ children: /*#__PURE__*/_jsx(RenderFields, {
104
+ fields: formSchema,
105
+ forceRender: true,
106
+ parentIndexPath: "",
107
+ parentPath: '',
108
+ parentSchemaPath: "",
109
+ permissions: true,
110
+ readOnly: !isEditable
111
+ })
112
+ });
113
+ };
114
+ //# sourceMappingURL=Block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Block.js","names":["useLexicalEditable","ChevronIcon","Combobox","CopyToClipboard","PopupList","RenderFields","useForm","useFormFields","useTranslation","React","CodeBlockIcon","useBlockComponentContext","Collapse","defaultLanguages","FloatingCollapse","baseClass","CodeBlockBlockComponent","args","languages","languagesFromProps","BlockCollapsible","formSchema","RemoveButton","setModified","t","codeField","fields","code","selectedLanguageField","setSelectedLanguage","dispatch","language","type","path","value","selectedLanguageLabel","isEditable","languageEntries","useMemo","Object","entries","map","languageCode","languageLabel","name","Component","_jsx","Button","active","disabled","onClick","className","Actions","_jsxs","button","buttonType","horizontalAlign","minEntriesForSearch","searchPlaceholder","showScrollbar","size","collapsibleProps","AfterCollapsible","disableHeaderToggle","disableToggleIndicator","Pill","forceRender","parentIndexPath","parentPath","parentSchemaPath","permissions","readOnly"],"sources":["../../../../../../src/features/blocks/premade/CodeBlock/Component/Block.tsx"],"sourcesContent":["'use client'\nimport type { ComboboxEntry } from '@payloadcms/ui'\nimport type {} from 'payload'\n\nimport './index.scss'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n ChevronIcon,\n Combobox,\n CopyToClipboard,\n PopupList,\n RenderFields,\n useForm,\n useFormFields,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { AdditionalCodeComponentProps } from './Code.js'\n\nimport { CodeBlockIcon } from '../../../../../lexical/ui/icons/CodeBlock/index.js'\nimport { useBlockComponentContext } from '../../../client/component/BlockContent.js'\nimport { Collapse } from './Collapse/index.js'\nimport { defaultLanguages } from './defaultLanguages.js'\nimport { FloatingCollapse } from './FloatingCollapse/index.js'\n\nconst baseClass = 'payload-richtext-code-block'\nexport const CodeBlockBlockComponent: React.FC<Pick<AdditionalCodeComponentProps, 'languages'>> = (\n args,\n) => {\n const { languages: languagesFromProps } = args\n const languages = languagesFromProps || defaultLanguages\n\n const { BlockCollapsible, formSchema, RemoveButton } = useBlockComponentContext()\n const { setModified } = useForm()\n const { t } = useTranslation()\n\n const { codeField } = useFormFields(([fields]) => ({\n codeField: fields?.code,\n }))\n\n const { selectedLanguageField, setSelectedLanguage } = useFormFields(([fields, dispatch]) => ({\n selectedLanguageField: fields?.language,\n setSelectedLanguage: (language: string) => {\n dispatch({\n type: 'UPDATE',\n path: 'language',\n value: language,\n })\n setModified(true)\n },\n }))\n\n const selectedLanguageLabel = languages[selectedLanguageField?.value as keyof typeof languages]\n\n const isEditable = useLexicalEditable()\n\n const languageEntries = React.useMemo<ComboboxEntry[]>(() => {\n return Object.entries(languages).map(([languageCode, languageLabel]) => ({\n name: `${languageCode} ${languageLabel}`,\n Component: (\n <PopupList.Button\n active={false}\n disabled={false}\n onClick={() => {\n setSelectedLanguage(languageCode)\n }}\n >\n <span className={`${baseClass}__language-code`} data-language={languageCode}>\n {languageLabel}\n </span>\n </PopupList.Button>\n ),\n }))\n }, [languages, setSelectedLanguage])\n\n return (\n <BlockCollapsible\n Actions={\n <div className={`${baseClass}__actions`}>\n <Combobox\n button={\n <div\n className={`${baseClass}__language-selector-button`}\n data-selected-language={selectedLanguageField?.value}\n >\n <span>{selectedLanguageLabel}</span>\n <ChevronIcon className={`${baseClass}__chevron`} />\n </div>\n }\n buttonType=\"custom\"\n className={`${baseClass}__language-selector`}\n disabled={!isEditable}\n entries={languageEntries}\n horizontalAlign=\"right\"\n minEntriesForSearch={8}\n searchPlaceholder={t('fields:searchForLanguage')}\n showScrollbar\n size=\"large\"\n />\n <CopyToClipboard value={(codeField?.value as string) ?? ''} />\n\n <Collapse />\n\n {isEditable && <RemoveButton />}\n </div>\n }\n className={baseClass}\n collapsibleProps={{\n AfterCollapsible: <FloatingCollapse />,\n disableHeaderToggle: true,\n disableToggleIndicator: true,\n }}\n Pill={\n <div className={`${baseClass}__pill`}>\n <CodeBlockIcon />\n </div>\n }\n >\n <RenderFields\n fields={formSchema}\n forceRender={true}\n parentIndexPath=\"\"\n parentPath={''}\n parentSchemaPath=\"\"\n permissions={true}\n readOnly={!isEditable}\n />\n </BlockCollapsible>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,56 @@
1
+ import type { CodeFieldClientProps } from 'payload';
2
+ import React from 'react';
3
+ export type AdditionalCodeComponentProps = {
4
+ /**
5
+ * @default first key of the `languages` prop
6
+ */
7
+ defaultLanguage?: string;
8
+ /**
9
+ * @default all languages supported by Monaco Editor
10
+ */
11
+ languages?: Record<string, string>;
12
+ /**
13
+ * Override the name of the block.
14
+ *
15
+ * @default 'Code'
16
+ */
17
+ slug?: string;
18
+ /**
19
+ * Configure typescript settings for the editor
20
+ */
21
+ typescript?: {
22
+ /**
23
+ * By default, the editor will not perform semantic validation. This means that
24
+ * while syntax errors will be highlighted, other issues like missing imports or incorrect
25
+ * types will not be.
26
+ *
27
+ * @default false
28
+ */
29
+ enableSemanticValidation?: boolean;
30
+ /**
31
+ * Additional types to fetch and include in the editor for autocompletion.
32
+ *
33
+ * For example, to include types for payload, you would set this to
34
+ *
35
+ * [{ url: 'https://unpkg.com/payload@latest/dist/index.d.ts', filePath: 'file:///node_modules/payload/index.d.ts' }]
36
+ */
37
+ fetchTypes?: Array<{
38
+ filePath: string;
39
+ url: string;
40
+ }>;
41
+ /**
42
+ * @default undefined
43
+ */
44
+ paths?: Record<string, string[]>;
45
+ /**
46
+ * @default "ESNext"
47
+ */
48
+ target?: string;
49
+ /**
50
+ * @default ['node_modules/@types']
51
+ */
52
+ typeRoots?: string[];
53
+ };
54
+ };
55
+ export declare const CodeComponent: React.FC<AdditionalCodeComponentProps & CodeFieldClientProps>;
56
+ //# sourceMappingURL=Code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Code.d.ts","sourceRoot":"","sources":["../../../../../../src/features/blocks/premade/CodeBlock/Component/Code.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAGpE,OAAO,KAAkB,MAAM,OAAO,CAAA;AAItC,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;;;;;WAMG;QACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;QAClC;;;;;;WAMG;QACH,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAA;YAChB,GAAG,EAAE,MAAM,CAAA;SACZ,CAAC,CAAA;QACF;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAChC;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QACf;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KACrB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,GAAG,oBAAoB,CAoHvF,CAAA"}