@payloadcms/richtext-lexical 3.89.0-internal.95c9cba → 3.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/exports/client/{Field-J6MIUIWP.js → Field-YZR46UCY.js} +1 -1
  2. package/dist/exports/client/{Field-J6MIUIWP.js.map → Field-YZR46UCY.js.map} +1 -1
  3. package/dist/exports/client/bundled.css +1 -1
  4. package/dist/exports/client/chunk-OSMEE5HW.js +2 -0
  5. package/dist/exports/client/chunk-OSMEE5HW.js.map +7 -0
  6. package/dist/exports/client/component-UBRNPIQ6.js +2 -0
  7. package/dist/exports/client/component-UBRNPIQ6.js.map +7 -0
  8. package/dist/exports/client/index.js +21 -21
  9. package/dist/exports/client/index.js.map +4 -4
  10. package/dist/features/converters/lexicalToHtml/async/converters/heading.js +1 -1
  11. package/dist/features/converters/lexicalToHtml/async/converters/heading.js.map +1 -1
  12. package/dist/features/converters/lexicalToHtml/async/converters/list.d.ts.map +1 -1
  13. package/dist/features/converters/lexicalToHtml/async/converters/list.js +4 -3
  14. package/dist/features/converters/lexicalToHtml/async/converters/list.js.map +1 -1
  15. package/dist/features/converters/lexicalToHtml/sync/converters/heading.js +1 -1
  16. package/dist/features/converters/lexicalToHtml/sync/converters/heading.js.map +1 -1
  17. package/dist/features/converters/lexicalToHtml/sync/converters/list.d.ts.map +1 -1
  18. package/dist/features/converters/lexicalToHtml/sync/converters/list.js +4 -3
  19. package/dist/features/converters/lexicalToHtml/sync/converters/list.js.map +1 -1
  20. package/dist/features/converters/lexicalToJSX/Component/nodeTags.spec.js +114 -0
  21. package/dist/features/converters/lexicalToJSX/Component/nodeTags.spec.js.map +1 -0
  22. package/dist/features/converters/lexicalToJSX/converter/converters/heading.d.ts.map +1 -1
  23. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +2 -1
  24. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
  25. package/dist/features/converters/lexicalToJSX/converter/converters/list.d.ts.map +1 -1
  26. package/dist/features/converters/lexicalToJSX/converter/converters/list.js +2 -1
  27. package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
  28. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/computeSelectionCount.d.ts +8 -0
  29. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/computeSelectionCount.d.ts.map +1 -0
  30. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/computeSelectionCount.js +19 -0
  31. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/computeSelectionCount.js.map +1 -0
  32. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.d.ts.map +1 -1
  33. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +16 -43
  34. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  35. package/dist/features/heading/constants.d.ts +2 -0
  36. package/dist/features/heading/constants.d.ts.map +1 -0
  37. package/dist/features/heading/constants.js +2 -0
  38. package/dist/features/heading/constants.js.map +1 -0
  39. package/dist/features/heading/server/index.d.ts.map +1 -1
  40. package/dist/features/heading/server/index.js +8 -2
  41. package/dist/features/heading/server/index.js.map +1 -1
  42. package/dist/features/heading/server/validate.d.ts +6 -0
  43. package/dist/features/heading/server/validate.d.ts.map +1 -0
  44. package/dist/features/heading/server/validate.js +15 -0
  45. package/dist/features/heading/server/validate.js.map +1 -0
  46. package/dist/features/lists/checklist/server/index.d.ts.map +1 -1
  47. package/dist/features/lists/checklist/server/index.js +5 -2
  48. package/dist/features/lists/checklist/server/index.js.map +1 -1
  49. package/dist/features/lists/htmlConverter.d.ts.map +1 -1
  50. package/dist/features/lists/htmlConverter.js +6 -3
  51. package/dist/features/lists/htmlConverter.js.map +1 -1
  52. package/dist/features/lists/orderedList/server/index.d.ts.map +1 -1
  53. package/dist/features/lists/orderedList/server/index.js +5 -2
  54. package/dist/features/lists/orderedList/server/index.js.map +1 -1
  55. package/dist/features/lists/shared/constants.d.ts +2 -0
  56. package/dist/features/lists/shared/constants.d.ts.map +1 -0
  57. package/dist/features/lists/shared/constants.js +2 -0
  58. package/dist/features/lists/shared/constants.js.map +1 -0
  59. package/dist/features/lists/shared/validate.d.ts +5 -0
  60. package/dist/features/lists/shared/validate.d.ts.map +1 -0
  61. package/dist/features/lists/shared/validate.js +15 -0
  62. package/dist/features/lists/shared/validate.js.map +1 -0
  63. package/dist/features/lists/unorderedList/server/index.d.ts.map +1 -1
  64. package/dist/features/lists/unorderedList/server/index.js +5 -2
  65. package/dist/features/lists/unorderedList/server/index.js.map +1 -1
  66. package/dist/features/relationship/client/index.d.ts +2 -2
  67. package/dist/features/relationship/client/index.d.ts.map +1 -1
  68. package/dist/features/relationship/client/index.js.map +1 -1
  69. package/dist/features/relationship/client/plugins/index.d.ts +2 -2
  70. package/dist/features/relationship/client/plugins/index.d.ts.map +1 -1
  71. package/dist/features/relationship/client/plugins/index.js +27 -31
  72. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  73. package/dist/features/relationship/client/utils/useEnabledRelationships.d.ts +2 -4
  74. package/dist/features/relationship/client/utils/useEnabledRelationships.d.ts.map +1 -1
  75. package/dist/features/relationship/client/utils/useEnabledRelationships.js +52 -50
  76. package/dist/features/relationship/client/utils/useEnabledRelationships.js.map +1 -1
  77. package/dist/features/relationship/server/graphQLPopulationPromise.d.ts +2 -2
  78. package/dist/features/relationship/server/graphQLPopulationPromise.d.ts.map +1 -1
  79. package/dist/features/relationship/server/graphQLPopulationPromise.js +2 -2
  80. package/dist/features/relationship/server/graphQLPopulationPromise.js.map +1 -1
  81. package/dist/features/relationship/server/index.d.ts +8 -1
  82. package/dist/features/relationship/server/index.d.ts.map +1 -1
  83. package/dist/features/relationship/server/index.js +28 -11
  84. package/dist/features/relationship/server/index.js.map +1 -1
  85. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.d.ts +7 -0
  86. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.d.ts.map +1 -0
  87. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.js +23 -0
  88. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.js.map +1 -0
  89. package/dist/features/toolbars/shared/useToolbarStates.d.ts.map +1 -1
  90. package/dist/features/toolbars/shared/useToolbarStates.js +3 -1
  91. package/dist/features/toolbars/shared/useToolbarStates.js.map +1 -1
  92. package/dist/features/upload/client/component/index.js +2 -1
  93. package/dist/features/upload/client/component/index.js.map +1 -1
  94. package/dist/features/upload/client/index.d.ts +3 -2
  95. package/dist/features/upload/client/index.d.ts.map +1 -1
  96. package/dist/features/upload/client/index.js.map +1 -1
  97. package/dist/features/upload/client/plugin/index.d.ts.map +1 -1
  98. package/dist/features/upload/client/plugin/index.js +47 -52
  99. package/dist/features/upload/client/plugin/index.js.map +1 -1
  100. package/dist/features/upload/server/graphQLPopulationPromise.d.ts +2 -2
  101. package/dist/features/upload/server/graphQLPopulationPromise.d.ts.map +1 -1
  102. package/dist/features/upload/server/graphQLPopulationPromise.js +1 -1
  103. package/dist/features/upload/server/graphQLPopulationPromise.js.map +1 -1
  104. package/dist/features/upload/server/index.d.ts +6 -2
  105. package/dist/features/upload/server/index.d.ts.map +1 -1
  106. package/dist/features/upload/server/index.js +21 -14
  107. package/dist/features/upload/server/index.js.map +1 -1
  108. package/dist/features/upload/server/validate.d.ts +2 -2
  109. package/dist/features/upload/server/validate.d.ts.map +1 -1
  110. package/dist/features/upload/server/validate.js +3 -0
  111. package/dist/features/upload/server/validate.js.map +1 -1
  112. package/dist/field/Diff/converters/listitem/index.d.ts.map +1 -1
  113. package/dist/field/Diff/converters/listitem/index.js +2 -1
  114. package/dist/field/Diff/converters/listitem/index.js.map +1 -1
  115. package/dist/field/Diff/index.d.ts.map +1 -1
  116. package/dist/field/Diff/index.js +1 -0
  117. package/dist/field/Diff/index.js.map +1 -1
  118. package/dist/field/RenderLexical/index.d.ts +3 -1
  119. package/dist/field/RenderLexical/index.d.ts.map +1 -1
  120. package/dist/field/RenderLexical/index.js +23 -23
  121. package/dist/field/RenderLexical/index.js.map +1 -1
  122. package/dist/field/bundled.css +1 -1
  123. package/dist/index.d.ts +1 -1
  124. package/dist/index.js +1 -1
  125. package/dist/index.js.map +1 -1
  126. package/dist/lexical/LexicalEditor.js.map +1 -1
  127. package/dist/lexical-proxy/@lexical-react/ExtensionComponent.d.ts +2 -0
  128. package/dist/lexical-proxy/@lexical-react/ExtensionComponent.d.ts.map +1 -0
  129. package/dist/lexical-proxy/@lexical-react/ExtensionComponent.js +2 -0
  130. package/dist/lexical-proxy/@lexical-react/ExtensionComponent.js.map +1 -0
  131. package/dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.d.ts +2 -0
  132. package/dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.d.ts.map +1 -0
  133. package/dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.js +2 -0
  134. package/dist/lexical-proxy/@lexical-react/LexicalExtensionComposer.js.map +1 -0
  135. package/dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.d.ts +2 -0
  136. package/dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.d.ts.map +1 -0
  137. package/dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.js +2 -0
  138. package/dist/lexical-proxy/@lexical-react/LexicalExtensionEditorComposer.js.map +1 -0
  139. package/dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.d.ts +2 -0
  140. package/dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.d.ts.map +1 -0
  141. package/dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.js +2 -0
  142. package/dist/lexical-proxy/@lexical-react/LexicalSelectionAlwaysOnDisplay.js.map +1 -0
  143. package/dist/lexical-proxy/@lexical-react/ReactExtension.d.ts +2 -0
  144. package/dist/lexical-proxy/@lexical-react/ReactExtension.d.ts.map +1 -0
  145. package/dist/lexical-proxy/@lexical-react/ReactExtension.js +2 -0
  146. package/dist/lexical-proxy/@lexical-react/ReactExtension.js.map +1 -0
  147. package/dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.d.ts +2 -0
  148. package/dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.d.ts.map +1 -0
  149. package/dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.js +2 -0
  150. package/dist/lexical-proxy/@lexical-react/ReactPluginHostExtension.js.map +1 -0
  151. package/dist/lexical-proxy/@lexical-react/ReactProviderExtension.d.ts +2 -0
  152. package/dist/lexical-proxy/@lexical-react/ReactProviderExtension.d.ts.map +1 -0
  153. package/dist/lexical-proxy/@lexical-react/ReactProviderExtension.js +2 -0
  154. package/dist/lexical-proxy/@lexical-react/ReactProviderExtension.js.map +1 -0
  155. package/dist/lexical-proxy/@lexical-react/TreeViewExtension.d.ts +2 -0
  156. package/dist/lexical-proxy/@lexical-react/TreeViewExtension.d.ts.map +1 -0
  157. package/dist/lexical-proxy/@lexical-react/TreeViewExtension.js +2 -0
  158. package/dist/lexical-proxy/@lexical-react/TreeViewExtension.js.map +1 -0
  159. package/dist/lexical-proxy/@lexical-react/useExtensionComponent.d.ts +2 -0
  160. package/dist/lexical-proxy/@lexical-react/useExtensionComponent.d.ts.map +1 -0
  161. package/dist/lexical-proxy/@lexical-react/useExtensionComponent.js +2 -0
  162. package/dist/lexical-proxy/@lexical-react/useExtensionComponent.js.map +1 -0
  163. package/dist/lexical-proxy/@lexical-react/useExtensionSignalValue.d.ts +2 -0
  164. package/dist/lexical-proxy/@lexical-react/useExtensionSignalValue.d.ts.map +1 -0
  165. package/dist/lexical-proxy/@lexical-react/useExtensionSignalValue.js +2 -0
  166. package/dist/lexical-proxy/@lexical-react/useExtensionSignalValue.js.map +1 -0
  167. package/dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.d.ts +2 -0
  168. package/dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.d.ts.map +1 -0
  169. package/dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.js +2 -0
  170. package/dist/lexical-proxy/@lexical-react/useLexicalAriaLiveRegion.js.map +1 -0
  171. package/dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.d.ts +2 -0
  172. package/dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.d.ts.map +1 -0
  173. package/dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.js +2 -0
  174. package/dist/lexical-proxy/@lexical-react/useLexicalFocusManagerRef.js.map +1 -0
  175. package/dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.d.ts +2 -0
  176. package/dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.d.ts.map +1 -0
  177. package/dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.js +2 -0
  178. package/dist/lexical-proxy/@lexical-react/useLexicalFocusTrapRef.js.map +1 -0
  179. package/dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.d.ts +2 -0
  180. package/dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.d.ts.map +1 -0
  181. package/dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.js +2 -0
  182. package/dist/lexical-proxy/@lexical-react/useLexicalRovingTabIndexRef.js.map +1 -0
  183. package/dist/lexical-proxy/@lexical-react/useLexicalSlotRef.d.ts +2 -0
  184. package/dist/lexical-proxy/@lexical-react/useLexicalSlotRef.d.ts.map +1 -0
  185. package/dist/lexical-proxy/@lexical-react/useLexicalSlotRef.js +2 -0
  186. package/dist/lexical-proxy/@lexical-react/useLexicalSlotRef.js.map +1 -0
  187. package/package.json +94 -24
  188. package/dist/exports/client/chunk-FWFDJAJ5.js +0 -2
  189. package/dist/exports/client/chunk-FWFDJAJ5.js.map +0 -7
  190. package/dist/exports/client/component-BAAVC34S.js +0 -2
  191. package/dist/exports/client/component-BAAVC34S.js.map +0 -7
  192. package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.d.ts +0 -2
  193. package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.d.ts.map +0 -1
  194. package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.js +0 -2
  195. package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.js.map +0 -1
@@ -1,4 +1,4 @@
1
- const ALLOWED_HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);
1
+ import { ALLOWED_HEADING_TAGS } from '../../../../heading/constants.js';
2
2
  export const HeadingHTMLConverterAsync = {
3
3
  heading: async ({
4
4
  node,
@@ -1 +1 @@
1
- {"version":3,"file":"heading.js","names":["ALLOWED_HEADING_TAGS","Set","HeadingHTMLConverterAsync","heading","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has"],"sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/heading.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConvertersAsync } from '../types.js'\n\nconst ALLOWED_HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])\n\nexport const HeadingHTMLConverterAsync: HTMLConvertersAsync<SerializedHeadingNode> = {\n heading: async ({ node, nodesToHTML, providedStyleTag }) => {\n const children = (\n await nodesToHTML({\n nodes: node.children,\n })\n ).join('')\n\n const tag = ALLOWED_HEADING_TAGS.has(node.tag) ? node.tag : 'h1'\n\n return `<${tag}${providedStyleTag}>${children}</${tag}>`\n },\n}\n"],"mappings":"AAGA,MAAMA,oBAAA,GAAuB,IAAIC,GAAA,CAAI,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAEzE,OAAO,MAAMC,yBAAA,GAAwE;EACnFC,OAAA,EAAS,MAAAA,CAAO;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IACrD,MAAMC,QAAA,GAAW,CACf,MAAMF,WAAA,CAAY;MAChBG,KAAA,EAAOJ,IAAA,CAAKG;IACd,EAAC,EACDE,IAAI,CAAC;IAEP,MAAMC,GAAA,GAAMV,oBAAA,CAAqBW,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IAE5D,OAAO,IAAIA,GAAA,GAAMJ,gBAAA,IAAoBC,QAAA,KAAaG,GAAA,GAAM;EAC1D;AACF","ignoreList":[]}
1
+ {"version":3,"file":"heading.js","names":["ALLOWED_HEADING_TAGS","HeadingHTMLConverterAsync","heading","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has"],"sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/heading.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConvertersAsync } from '../types.js'\n\nimport { ALLOWED_HEADING_TAGS } from '../../../../heading/constants.js'\n\nexport const HeadingHTMLConverterAsync: HTMLConvertersAsync<SerializedHeadingNode> = {\n heading: async ({ node, nodesToHTML, providedStyleTag }) => {\n const children = (\n await nodesToHTML({\n nodes: node.children,\n })\n ).join('')\n\n const tag = ALLOWED_HEADING_TAGS.has(node.tag) ? node.tag : 'h1'\n\n return `<${tag}${providedStyleTag}>${children}</${tag}>`\n },\n}\n"],"mappings":"AAGA,SAASA,oBAAoB,QAAQ;AAErC,OAAO,MAAMC,yBAAA,GAAwE;EACnFC,OAAA,EAAS,MAAAA,CAAO;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IACrD,MAAMC,QAAA,GAAW,CACf,MAAMF,WAAA,CAAY;MAChBG,KAAA,EAAOJ,IAAA,CAAKG;IACd,EAAC,EACDE,IAAI,CAAC;IAEP,MAAMC,GAAA,GAAMT,oBAAA,CAAqBU,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IAE5D,OAAO,IAAIA,GAAA,GAAMJ,gBAAA,IAAoBC,QAAA,KAAaG,GAAA,GAAM;EAC1D;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKtD,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,CACtD,sBAAsB,GAAG,kBAAkB,CAiD5C,CAAA"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMtD,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,CACtD,sBAAsB,GAAG,kBAAkB,CAiD5C,CAAA"}
@@ -1,5 +1,6 @@
1
+ import escapeHTML from 'escape-html';
1
2
  import { v4 as uuidv4 } from 'uuid';
2
- const ALLOWED_LIST_TAGS = new Set(['ol', 'ul']);
3
+ import { ALLOWED_LIST_TAGS } from '../../../../lists/shared/constants.js';
3
4
  const ALLOWED_LIST_TYPES = new Set(['bullet', 'check', 'number']);
4
5
  export const ListHTMLConverterAsync = {
5
6
  list: async ({
@@ -32,7 +33,7 @@ export const ListHTMLConverterAsync = {
32
33
  role="checkbox"
33
34
  style="list-style-type: none;${providedCSSString}"
34
35
  tabIndex="-1"
35
- value="${node.value}"
36
+ value="${escapeHTML(String(node.value))}"
36
37
  >
37
38
  ${hasSubLists ? children : `<input${node.checked ? ' checked' : ''} id="${uuid}" readOnly="true" type="checkbox" />
38
39
  <label htmlFor="${uuid}">${children}</label>
@@ -42,7 +43,7 @@ export const ListHTMLConverterAsync = {
42
43
  return `<li
43
44
  class="${hasSubLists ? 'nestedListItem' : ''}"
44
45
  style="${hasSubLists ? `list-style-type: none;${providedCSSString}` : providedCSSString}"
45
- value="${node.value}"
46
+ value="${escapeHTML(String(node.value))}"
46
47
  >${children}</li>`;
47
48
  }
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","names":["v4","uuidv4","ALLOWED_LIST_TAGS","Set","ALLOWED_LIST_TYPES","ListHTMLConverterAsync","list","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has","listType","listitem","parent","providedCSSString","hasSubLists","some","child","type","uuid","checked","value"],"sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/list.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConvertersAsync } from '../types.js'\n\nconst ALLOWED_LIST_TAGS = new Set(['ol', 'ul'])\nconst ALLOWED_LIST_TYPES = new Set(['bullet', 'check', 'number'])\n\nexport const ListHTMLConverterAsync: HTMLConvertersAsync<\n SerializedListItemNode | SerializedListNode\n> = {\n list: async ({ node, nodesToHTML, providedStyleTag }) => {\n const children = (\n await nodesToHTML({\n nodes: node.children,\n })\n ).join('')\n\n const tag = ALLOWED_LIST_TAGS.has(node.tag) ? node.tag : 'ul'\n const listType = ALLOWED_LIST_TYPES.has(node.listType) ? node.listType : 'bullet'\n\n return `<${tag}${providedStyleTag} class=\"list-${listType}\">${children}</${tag}>`\n },\n listitem: async ({ node, nodesToHTML, parent, providedCSSString }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = (\n await nodesToHTML({\n nodes: node.children,\n })\n ).join('')\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n return `<li\n aria-checked=\"${node.checked ? 'true' : 'false'}\"\n class=\"list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}\"\n role=\"checkbox\"\n style=\"list-style-type: none;${providedCSSString}\"\n tabIndex=\"-1\"\n value=\"${node.value}\"\n >\n ${\n hasSubLists\n ? children\n : `<input${node.checked ? ' checked' : ''} id=\"${uuid}\" readOnly=\"true\" type=\"checkbox\" />\n <label htmlFor=\"${uuid}\">${children}</label>\n <br />`\n }\n </li>`\n } else {\n return `<li\n class=\"${hasSubLists ? 'nestedListItem' : ''}\"\n style=\"${hasSubLists ? `list-style-type: none;${providedCSSString}` : providedCSSString}\"\n value=\"${node.value}\"\n >${children}</li>`\n }\n },\n}\n"],"mappings":"AAAA,SAASA,EAAA,IAAMC,MAAM,QAAQ;AAK7B,MAAMC,iBAAA,GAAoB,IAAIC,GAAA,CAAI,CAAC,MAAM,KAAK;AAC9C,MAAMC,kBAAA,GAAqB,IAAID,GAAA,CAAI,CAAC,UAAU,SAAS,SAAS;AAEhE,OAAO,MAAME,sBAAA,GAET;EACFC,IAAA,EAAM,MAAAA,CAAO;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IAClD,MAAMC,QAAA,GAAW,CACf,MAAMF,WAAA,CAAY;MAChBG,KAAA,EAAOJ,IAAA,CAAKG;IACd,EAAC,EACDE,IAAI,CAAC;IAEP,MAAMC,GAAA,GAAMX,iBAAA,CAAkBY,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IACzD,MAAME,QAAA,GAAWX,kBAAA,CAAmBU,GAAG,CAACP,IAAA,CAAKQ,QAAQ,IAAIR,IAAA,CAAKQ,QAAQ,GAAG;IAEzE,OAAO,IAAIF,GAAA,GAAMJ,gBAAA,gBAAgCM,QAAA,KAAaL,QAAA,KAAaG,GAAA,GAAM;EACnF;EACAG,QAAA,EAAU,MAAAA,CAAO;IAAET,IAAI;IAAEC,WAAW;IAAES,MAAM;IAAEC;EAAiB,CAAE;IAC/D,MAAMC,WAAA,GAAcZ,IAAA,CAAKG,QAAQ,CAACU,IAAI,CAAEC,KAAA,IAAUA,KAAA,CAAMC,IAAI,KAAK;IAEjE,MAAMZ,QAAA,GAAW,CACf,MAAMF,WAAA,CAAY;MAChBG,KAAA,EAAOJ,IAAA,CAAKG;IACd,EAAC,EACDE,IAAI,CAAC;IAEP,IAAI,cAAcK,MAAA,IAAUA,MAAA,EAAQF,QAAA,KAAa,SAAS;MACxD,MAAMQ,IAAA,GAAOtB,MAAA;MACb,OAAO;0BACaM,IAAA,CAAKiB,OAAO,GAAG,SAAS;qCACbjB,IAAA,CAAKiB,OAAO,GAAG,gCAAgC,kCAAkCL,WAAA,GAAc,oBAAoB;;yCAE/GD,iBAAA;;mBAEtBX,IAAA,CAAKkB,KAAK;;YAGjBN,WAAA,GACIT,QAAA,GACA,SAASH,IAAA,CAAKiB,OAAO,GAAG,aAAa,UAAUD,IAAA;8BACjCA,IAAA,KAASb,QAAA;mBACpB;cAEL;IACV,OAAO;MACL,OAAO;mBACMS,WAAA,GAAc,mBAAmB;mBACjCA,WAAA,GAAc,yBAAyBD,iBAAA,EAAmB,GAAGA,iBAAA;mBAC7DX,IAAA,CAAKkB,KAAK;WAClBf,QAAA,OAAe;IACtB;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"list.js","names":["escapeHTML","v4","uuidv4","ALLOWED_LIST_TAGS","ALLOWED_LIST_TYPES","Set","ListHTMLConverterAsync","list","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has","listType","listitem","parent","providedCSSString","hasSubLists","some","child","type","uuid","checked","String","value"],"sources":["../../../../../../src/features/converters/lexicalToHtml/async/converters/list.ts"],"sourcesContent":["import escapeHTML from 'escape-html'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConvertersAsync } from '../types.js'\n\nimport { ALLOWED_LIST_TAGS } from '../../../../lists/shared/constants.js'\n\nconst ALLOWED_LIST_TYPES = new Set(['bullet', 'check', 'number'])\n\nexport const ListHTMLConverterAsync: HTMLConvertersAsync<\n SerializedListItemNode | SerializedListNode\n> = {\n list: async ({ node, nodesToHTML, providedStyleTag }) => {\n const children = (\n await nodesToHTML({\n nodes: node.children,\n })\n ).join('')\n\n const tag = ALLOWED_LIST_TAGS.has(node.tag) ? node.tag : 'ul'\n const listType = ALLOWED_LIST_TYPES.has(node.listType) ? node.listType : 'bullet'\n\n return `<${tag}${providedStyleTag} class=\"list-${listType}\">${children}</${tag}>`\n },\n listitem: async ({ node, nodesToHTML, parent, providedCSSString }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = (\n await nodesToHTML({\n nodes: node.children,\n })\n ).join('')\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n return `<li\n aria-checked=\"${node.checked ? 'true' : 'false'}\"\n class=\"list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}\"\n role=\"checkbox\"\n style=\"list-style-type: none;${providedCSSString}\"\n tabIndex=\"-1\"\n value=\"${escapeHTML(String(node.value))}\"\n >\n ${\n hasSubLists\n ? children\n : `<input${node.checked ? ' checked' : ''} id=\"${uuid}\" readOnly=\"true\" type=\"checkbox\" />\n <label htmlFor=\"${uuid}\">${children}</label>\n <br />`\n }\n </li>`\n } else {\n return `<li\n class=\"${hasSubLists ? 'nestedListItem' : ''}\"\n style=\"${hasSubLists ? `list-style-type: none;${providedCSSString}` : providedCSSString}\"\n value=\"${escapeHTML(String(node.value))}\"\n >${children}</li>`\n }\n },\n}\n"],"mappings":"AAAA,OAAOA,UAAA,MAAgB;AACvB,SAASC,EAAA,IAAMC,MAAM,QAAQ;AAK7B,SAASC,iBAAiB,QAAQ;AAElC,MAAMC,kBAAA,GAAqB,IAAIC,GAAA,CAAI,CAAC,UAAU,SAAS,SAAS;AAEhE,OAAO,MAAMC,sBAAA,GAET;EACFC,IAAA,EAAM,MAAAA,CAAO;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IAClD,MAAMC,QAAA,GAAW,CACf,MAAMF,WAAA,CAAY;MAChBG,KAAA,EAAOJ,IAAA,CAAKG;IACd,EAAC,EACDE,IAAI,CAAC;IAEP,MAAMC,GAAA,GAAMX,iBAAA,CAAkBY,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IACzD,MAAME,QAAA,GAAWZ,kBAAA,CAAmBW,GAAG,CAACP,IAAA,CAAKQ,QAAQ,IAAIR,IAAA,CAAKQ,QAAQ,GAAG;IAEzE,OAAO,IAAIF,GAAA,GAAMJ,gBAAA,gBAAgCM,QAAA,KAAaL,QAAA,KAAaG,GAAA,GAAM;EACnF;EACAG,QAAA,EAAU,MAAAA,CAAO;IAAET,IAAI;IAAEC,WAAW;IAAES,MAAM;IAAEC;EAAiB,CAAE;IAC/D,MAAMC,WAAA,GAAcZ,IAAA,CAAKG,QAAQ,CAACU,IAAI,CAAEC,KAAA,IAAUA,KAAA,CAAMC,IAAI,KAAK;IAEjE,MAAMZ,QAAA,GAAW,CACf,MAAMF,WAAA,CAAY;MAChBG,KAAA,EAAOJ,IAAA,CAAKG;IACd,EAAC,EACDE,IAAI,CAAC;IAEP,IAAI,cAAcK,MAAA,IAAUA,MAAA,EAAQF,QAAA,KAAa,SAAS;MACxD,MAAMQ,IAAA,GAAOtB,MAAA;MACb,OAAO;0BACaM,IAAA,CAAKiB,OAAO,GAAG,SAAS;qCACbjB,IAAA,CAAKiB,OAAO,GAAG,gCAAgC,kCAAkCL,WAAA,GAAc,oBAAoB;;yCAE/GD,iBAAA;;mBAEtBnB,UAAA,CAAW0B,MAAA,CAAOlB,IAAA,CAAKmB,KAAK;;YAGnCP,WAAA,GACIT,QAAA,GACA,SAASH,IAAA,CAAKiB,OAAO,GAAG,aAAa,UAAUD,IAAA;8BACjCA,IAAA,KAASb,QAAA;mBACpB;cAEL;IACV,OAAO;MACL,OAAO;mBACMS,WAAA,GAAc,mBAAmB;mBACjCA,WAAA,GAAc,yBAAyBD,iBAAA,EAAmB,GAAGA,iBAAA;mBAC7DnB,UAAA,CAAW0B,MAAA,CAAOlB,IAAA,CAAKmB,KAAK;WACpChB,QAAA,OAAe;IACtB;EACF;AACF","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- const ALLOWED_HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);
1
+ import { ALLOWED_HEADING_TAGS } from '../../../../heading/constants.js';
2
2
  export const HeadingHTMLConverter = {
3
3
  heading: ({
4
4
  node,
@@ -1 +1 @@
1
- {"version":3,"file":"heading.js","names":["ALLOWED_HEADING_TAGS","Set","HeadingHTMLConverter","heading","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has"],"sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/heading.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConverters } from '../types.js'\n\nconst ALLOWED_HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])\n\nexport const HeadingHTMLConverter: HTMLConverters<SerializedHeadingNode> = {\n heading: ({ node, nodesToHTML, providedStyleTag }) => {\n const children = nodesToHTML({\n nodes: node.children,\n }).join('')\n\n const tag = ALLOWED_HEADING_TAGS.has(node.tag) ? node.tag : 'h1'\n\n return `<${tag}${providedStyleTag}>${children}</${tag}>`\n },\n}\n"],"mappings":"AAGA,MAAMA,oBAAA,GAAuB,IAAIC,GAAA,CAAI,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAEzE,OAAO,MAAMC,oBAAA,GAA8D;EACzEC,OAAA,EAASA,CAAC;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IAC/C,MAAMC,QAAA,GAAWF,WAAA,CAAY;MAC3BG,KAAA,EAAOJ,IAAA,CAAKG;IACd,GAAGE,IAAI,CAAC;IAER,MAAMC,GAAA,GAAMV,oBAAA,CAAqBW,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IAE5D,OAAO,IAAIA,GAAA,GAAMJ,gBAAA,IAAoBC,QAAA,KAAaG,GAAA,GAAM;EAC1D;AACF","ignoreList":[]}
1
+ {"version":3,"file":"heading.js","names":["ALLOWED_HEADING_TAGS","HeadingHTMLConverter","heading","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has"],"sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/heading.ts"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConverters } from '../types.js'\n\nimport { ALLOWED_HEADING_TAGS } from '../../../../heading/constants.js'\n\nexport const HeadingHTMLConverter: HTMLConverters<SerializedHeadingNode> = {\n heading: ({ node, nodesToHTML, providedStyleTag }) => {\n const children = nodesToHTML({\n nodes: node.children,\n }).join('')\n\n const tag = ALLOWED_HEADING_TAGS.has(node.tag) ? node.tag : 'h1'\n\n return `<${tag}${providedStyleTag}>${children}</${tag}>`\n },\n}\n"],"mappings":"AAGA,SAASA,oBAAoB,QAAQ;AAErC,OAAO,MAAMC,oBAAA,GAA8D;EACzEC,OAAA,EAASA,CAAC;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IAC/C,MAAMC,QAAA,GAAWF,WAAA,CAAY;MAC3BG,KAAA,EAAOJ,IAAA,CAAKG;IACd,GAAGE,IAAI,CAAC;IAER,MAAMC,GAAA,GAAMT,oBAAA,CAAqBU,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IAE5D,OAAO,IAAIA,GAAA,GAAMJ,gBAAA,IAAoBC,QAAA,KAAaG,GAAA,GAAM;EAC1D;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKjD,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,sBAAsB,GAAG,kBAAkB,CA4CzF,CAAA"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAMjD,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,sBAAsB,GAAG,kBAAkB,CA4CzF,CAAA"}
@@ -1,5 +1,6 @@
1
+ import escapeHTML from 'escape-html';
1
2
  import { v4 as uuidv4 } from 'uuid';
2
- const ALLOWED_LIST_TAGS = new Set(['ol', 'ul']);
3
+ import { ALLOWED_LIST_TAGS } from '../../../../lists/shared/constants.js';
3
4
  const ALLOWED_LIST_TYPES = new Set(['bullet', 'check', 'number']);
4
5
  export const ListHTMLConverter = {
5
6
  list: ({
@@ -32,7 +33,7 @@ export const ListHTMLConverter = {
32
33
  role="checkbox"
33
34
  style="list-style-type: none;${providedCSSString}"
34
35
  tabIndex="-1"
35
- value="${node.value}"
36
+ value="${escapeHTML(String(node.value))}"
36
37
  >
37
38
  ${hasSubLists ? children : `<input${node.checked ? ' checked' : ''} id="${uuid}" readOnly="true" type="checkbox" />
38
39
  <label htmlFor="${uuid}">${children}</label>
@@ -42,7 +43,7 @@ export const ListHTMLConverter = {
42
43
  return `<li
43
44
  class="${hasSubLists ? 'nestedListItem' : ''}"
44
45
  style="${hasSubLists ? `list-style-type: none;${providedCSSString}` : providedCSSString}"
45
- value="${node.value}"
46
+ value="${escapeHTML(String(node.value))}"
46
47
  >${children}</li>`;
47
48
  }
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","names":["v4","uuidv4","ALLOWED_LIST_TAGS","Set","ALLOWED_LIST_TYPES","ListHTMLConverter","list","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has","listType","listitem","parent","providedCSSString","hasSubLists","some","child","type","uuid","checked","value"],"sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/list.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConverters } from '../types.js'\n\nconst ALLOWED_LIST_TAGS = new Set(['ol', 'ul'])\nconst ALLOWED_LIST_TYPES = new Set(['bullet', 'check', 'number'])\n\nexport const ListHTMLConverter: HTMLConverters<SerializedListItemNode | SerializedListNode> = {\n list: ({ node, nodesToHTML, providedStyleTag }) => {\n const children = nodesToHTML({\n nodes: node.children,\n }).join('')\n\n const tag = ALLOWED_LIST_TAGS.has(node.tag) ? node.tag : 'ul'\n const listType = ALLOWED_LIST_TYPES.has(node.listType) ? node.listType : 'bullet'\n\n return `<${tag}${providedStyleTag} class=\"list-${listType}\">${children}</${tag}>`\n },\n listitem: ({ node, nodesToHTML, parent, providedCSSString }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = nodesToHTML({\n nodes: node.children,\n }).join('')\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n return `<li\n aria-checked=\"${node.checked ? 'true' : 'false'}\"\n class=\"list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}\"\n role=\"checkbox\"\n style=\"list-style-type: none;${providedCSSString}\"\n tabIndex=\"-1\"\n value=\"${node.value}\"\n >\n ${\n hasSubLists\n ? children\n : `<input${node.checked ? ' checked' : ''} id=\"${uuid}\" readOnly=\"true\" type=\"checkbox\" />\n <label htmlFor=\"${uuid}\">${children}</label>\n <br />`\n }\n </li>`\n } else {\n return `<li\n class=\"${hasSubLists ? 'nestedListItem' : ''}\"\n style=\"${hasSubLists ? `list-style-type: none;${providedCSSString}` : providedCSSString}\"\n value=\"${node.value}\"\n >${children}</li>`\n }\n },\n}\n"],"mappings":"AAAA,SAASA,EAAA,IAAMC,MAAM,QAAQ;AAK7B,MAAMC,iBAAA,GAAoB,IAAIC,GAAA,CAAI,CAAC,MAAM,KAAK;AAC9C,MAAMC,kBAAA,GAAqB,IAAID,GAAA,CAAI,CAAC,UAAU,SAAS,SAAS;AAEhE,OAAO,MAAME,iBAAA,GAAiF;EAC5FC,IAAA,EAAMA,CAAC;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IAC5C,MAAMC,QAAA,GAAWF,WAAA,CAAY;MAC3BG,KAAA,EAAOJ,IAAA,CAAKG;IACd,GAAGE,IAAI,CAAC;IAER,MAAMC,GAAA,GAAMX,iBAAA,CAAkBY,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IACzD,MAAME,QAAA,GAAWX,kBAAA,CAAmBU,GAAG,CAACP,IAAA,CAAKQ,QAAQ,IAAIR,IAAA,CAAKQ,QAAQ,GAAG;IAEzE,OAAO,IAAIF,GAAA,GAAMJ,gBAAA,gBAAgCM,QAAA,KAAaL,QAAA,KAAaG,GAAA,GAAM;EACnF;EACAG,QAAA,EAAUA,CAAC;IAAET,IAAI;IAAEC,WAAW;IAAES,MAAM;IAAEC;EAAiB,CAAE;IACzD,MAAMC,WAAA,GAAcZ,IAAA,CAAKG,QAAQ,CAACU,IAAI,CAAEC,KAAA,IAAUA,KAAA,CAAMC,IAAI,KAAK;IAEjE,MAAMZ,QAAA,GAAWF,WAAA,CAAY;MAC3BG,KAAA,EAAOJ,IAAA,CAAKG;IACd,GAAGE,IAAI,CAAC;IAER,IAAI,cAAcK,MAAA,IAAUA,MAAA,EAAQF,QAAA,KAAa,SAAS;MACxD,MAAMQ,IAAA,GAAOtB,MAAA;MACb,OAAO;0BACaM,IAAA,CAAKiB,OAAO,GAAG,SAAS;qCACbjB,IAAA,CAAKiB,OAAO,GAAG,gCAAgC,kCAAkCL,WAAA,GAAc,oBAAoB;;yCAE/GD,iBAAA;;mBAEtBX,IAAA,CAAKkB,KAAK;;YAGjBN,WAAA,GACIT,QAAA,GACA,SAASH,IAAA,CAAKiB,OAAO,GAAG,aAAa,UAAUD,IAAA;8BACjCA,IAAA,KAASb,QAAA;mBACpB;cAEL;IACV,OAAO;MACL,OAAO;mBACMS,WAAA,GAAc,mBAAmB;mBACjCA,WAAA,GAAc,yBAAyBD,iBAAA,EAAmB,GAAGA,iBAAA;mBAC7DX,IAAA,CAAKkB,KAAK;WAClBf,QAAA,OAAe;IACtB;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"list.js","names":["escapeHTML","v4","uuidv4","ALLOWED_LIST_TAGS","ALLOWED_LIST_TYPES","Set","ListHTMLConverter","list","node","nodesToHTML","providedStyleTag","children","nodes","join","tag","has","listType","listitem","parent","providedCSSString","hasSubLists","some","child","type","uuid","checked","String","value"],"sources":["../../../../../../src/features/converters/lexicalToHtml/sync/converters/list.ts"],"sourcesContent":["import escapeHTML from 'escape-html'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { HTMLConverters } from '../types.js'\n\nimport { ALLOWED_LIST_TAGS } from '../../../../lists/shared/constants.js'\n\nconst ALLOWED_LIST_TYPES = new Set(['bullet', 'check', 'number'])\n\nexport const ListHTMLConverter: HTMLConverters<SerializedListItemNode | SerializedListNode> = {\n list: ({ node, nodesToHTML, providedStyleTag }) => {\n const children = nodesToHTML({\n nodes: node.children,\n }).join('')\n\n const tag = ALLOWED_LIST_TAGS.has(node.tag) ? node.tag : 'ul'\n const listType = ALLOWED_LIST_TYPES.has(node.listType) ? node.listType : 'bullet'\n\n return `<${tag}${providedStyleTag} class=\"list-${listType}\">${children}</${tag}>`\n },\n listitem: ({ node, nodesToHTML, parent, providedCSSString }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = nodesToHTML({\n nodes: node.children,\n }).join('')\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n return `<li\n aria-checked=\"${node.checked ? 'true' : 'false'}\"\n class=\"list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}\"\n role=\"checkbox\"\n style=\"list-style-type: none;${providedCSSString}\"\n tabIndex=\"-1\"\n value=\"${escapeHTML(String(node.value))}\"\n >\n ${\n hasSubLists\n ? children\n : `<input${node.checked ? ' checked' : ''} id=\"${uuid}\" readOnly=\"true\" type=\"checkbox\" />\n <label htmlFor=\"${uuid}\">${children}</label>\n <br />`\n }\n </li>`\n } else {\n return `<li\n class=\"${hasSubLists ? 'nestedListItem' : ''}\"\n style=\"${hasSubLists ? `list-style-type: none;${providedCSSString}` : providedCSSString}\"\n value=\"${escapeHTML(String(node.value))}\"\n >${children}</li>`\n }\n },\n}\n"],"mappings":"AAAA,OAAOA,UAAA,MAAgB;AACvB,SAASC,EAAA,IAAMC,MAAM,QAAQ;AAK7B,SAASC,iBAAiB,QAAQ;AAElC,MAAMC,kBAAA,GAAqB,IAAIC,GAAA,CAAI,CAAC,UAAU,SAAS,SAAS;AAEhE,OAAO,MAAMC,iBAAA,GAAiF;EAC5FC,IAAA,EAAMA,CAAC;IAAEC,IAAI;IAAEC,WAAW;IAAEC;EAAgB,CAAE;IAC5C,MAAMC,QAAA,GAAWF,WAAA,CAAY;MAC3BG,KAAA,EAAOJ,IAAA,CAAKG;IACd,GAAGE,IAAI,CAAC;IAER,MAAMC,GAAA,GAAMX,iBAAA,CAAkBY,GAAG,CAACP,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IACzD,MAAME,QAAA,GAAWZ,kBAAA,CAAmBW,GAAG,CAACP,IAAA,CAAKQ,QAAQ,IAAIR,IAAA,CAAKQ,QAAQ,GAAG;IAEzE,OAAO,IAAIF,GAAA,GAAMJ,gBAAA,gBAAgCM,QAAA,KAAaL,QAAA,KAAaG,GAAA,GAAM;EACnF;EACAG,QAAA,EAAUA,CAAC;IAAET,IAAI;IAAEC,WAAW;IAAES,MAAM;IAAEC;EAAiB,CAAE;IACzD,MAAMC,WAAA,GAAcZ,IAAA,CAAKG,QAAQ,CAACU,IAAI,CAAEC,KAAA,IAAUA,KAAA,CAAMC,IAAI,KAAK;IAEjE,MAAMZ,QAAA,GAAWF,WAAA,CAAY;MAC3BG,KAAA,EAAOJ,IAAA,CAAKG;IACd,GAAGE,IAAI,CAAC;IAER,IAAI,cAAcK,MAAA,IAAUA,MAAA,EAAQF,QAAA,KAAa,SAAS;MACxD,MAAMQ,IAAA,GAAOtB,MAAA;MACb,OAAO;0BACaM,IAAA,CAAKiB,OAAO,GAAG,SAAS;qCACbjB,IAAA,CAAKiB,OAAO,GAAG,gCAAgC,kCAAkCL,WAAA,GAAc,oBAAoB;;yCAE/GD,iBAAA;;mBAEtBnB,UAAA,CAAW0B,MAAA,CAAOlB,IAAA,CAAKmB,KAAK;;YAGnCP,WAAA,GACIT,QAAA,GACA,SAASH,IAAA,CAAKiB,OAAO,GAAG,aAAa,UAAUD,IAAA;8BACjCA,IAAA,KAASb,QAAA;mBACpB;cAEL;IACV,OAAO;MACL,OAAO;mBACMS,WAAA,GAAc,mBAAmB;mBACjCA,WAAA,GAAc,yBAAyBD,iBAAA,EAAmB,GAAGA,iBAAA;mBAC7DnB,UAAA,CAAW0B,MAAA,CAAOlB,IAAA,CAAKmB,KAAK;WACpChB,QAAA,OAAe;IACtB;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,114 @@
1
+ import { createElement } from 'react';
2
+ import { renderToStaticMarkup } from 'react-dom/server';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { RichText } from './index.js';
5
+ const text = 'body { display: none; }';
6
+ const textNode = {
7
+ type: 'text',
8
+ detail: 0,
9
+ format: 0,
10
+ mode: 'normal',
11
+ style: '',
12
+ text,
13
+ version: 1
14
+ };
15
+ describe('RichText node tags', () => {
16
+ it.each(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])('should preserve the allowed heading tag %s', tag => {
17
+ const html = renderToStaticMarkup(createElement(RichText, {
18
+ data: createEditorState({
19
+ tag,
20
+ type: 'heading'
21
+ }),
22
+ disableContainer: true
23
+ }));
24
+ expect(html).toBe(`<${tag}>${text}</${tag}>`);
25
+ });
26
+ it.each([{
27
+ listType: 'bullet',
28
+ tag: 'ul'
29
+ }, {
30
+ listType: 'number',
31
+ tag: 'ol'
32
+ }, {
33
+ listType: 'check',
34
+ tag: 'ul'
35
+ }])('should preserve the allowed $listType list tag $tag', ({
36
+ listType,
37
+ tag
38
+ }) => {
39
+ const html = renderToStaticMarkup(createElement(RichText, {
40
+ data: createEditorState({
41
+ listType,
42
+ tag,
43
+ type: 'list'
44
+ }),
45
+ disableContainer: true
46
+ }));
47
+ expect(html).toBe(`<${tag} class="list-${listType}">${text}</${tag}>`);
48
+ });
49
+ describe.each(['heading', 'list'])('%s', type => {
50
+ it.each(['style', 'script', 'plaintext', 'iframe', 'div', 'h7', '', null, undefined, 1, {}, ['h1']].map(tag => ({
51
+ tag
52
+ })))('should replace an invalid tag $tag with a safe fallback', ({
53
+ tag
54
+ }) => {
55
+ const html = renderToStaticMarkup(createElement(RichText, {
56
+ data: createEditorState({
57
+ tag,
58
+ type
59
+ }),
60
+ disableContainer: true
61
+ }));
62
+ expect(html).toBe(type === 'heading' ? `<h1>${text}</h1>` : `<ul class="list-bullet">${text}</ul>`);
63
+ });
64
+ it('should replace invalid tags in nested nodes', () => {
65
+ const data = createEditorState({
66
+ tag: 'style',
67
+ type
68
+ });
69
+ data.root.children = [{
70
+ type: 'quote',
71
+ children: data.root.children,
72
+ direction: null,
73
+ format: '',
74
+ indent: 0,
75
+ version: 1
76
+ }];
77
+ const html = renderToStaticMarkup(createElement(RichText, {
78
+ data,
79
+ disableContainer: true
80
+ }));
81
+ expect(html).toBe(`<blockquote>${type === 'heading' ? `<h1>${text}</h1>` : `<ul class="list-bullet">${text}</ul>`}</blockquote>`);
82
+ });
83
+ });
84
+ });
85
+ function createEditorState({
86
+ listType = 'bullet',
87
+ tag,
88
+ type
89
+ }) {
90
+ // Stored JSON can contain values outside the serialized node's TypeScript types.
91
+ return {
92
+ root: {
93
+ type: 'root',
94
+ children: [{
95
+ type,
96
+ children: [textNode],
97
+ direction: null,
98
+ format: '',
99
+ indent: 0,
100
+ ...(type === 'list' ? {
101
+ listType,
102
+ start: 1
103
+ } : {}),
104
+ tag,
105
+ version: 1
106
+ }],
107
+ direction: null,
108
+ format: '',
109
+ indent: 0,
110
+ version: 1
111
+ }
112
+ };
113
+ }
114
+ //# sourceMappingURL=nodeTags.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeTags.spec.js","names":["createElement","renderToStaticMarkup","describe","expect","it","RichText","text","textNode","type","detail","format","mode","style","version","each","tag","html","data","createEditorState","disableContainer","toBe","listType","undefined","map","root","children","direction","indent","start"],"sources":["../../../../../src/features/converters/lexicalToJSX/Component/nodeTags.spec.ts"],"sourcesContent":["import { createElement } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { describe, expect, it } from 'vitest'\n\nimport type { DefaultTypedEditorState, SerializedTextNode } from '../../../../nodeTypes.js'\n\nimport { RichText } from './index.js'\n\nconst text = 'body { display: none; }'\nconst textNode: SerializedTextNode = {\n type: 'text',\n detail: 0,\n format: 0,\n mode: 'normal',\n style: '',\n text,\n version: 1,\n}\n\ndescribe('RichText node tags', () => {\n it.each(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])(\n 'should preserve the allowed heading tag %s',\n (tag) => {\n const html = renderToStaticMarkup(\n createElement(RichText, {\n data: createEditorState({ tag, type: 'heading' }),\n disableContainer: true,\n }),\n )\n\n expect(html).toBe(`<${tag}>${text}</${tag}>`)\n },\n )\n\n it.each([\n { listType: 'bullet', tag: 'ul' },\n { listType: 'number', tag: 'ol' },\n { listType: 'check', tag: 'ul' },\n ])('should preserve the allowed $listType list tag $tag', ({ listType, tag }) => {\n const html = renderToStaticMarkup(\n createElement(RichText, {\n data: createEditorState({ listType, tag, type: 'list' }),\n disableContainer: true,\n }),\n )\n\n expect(html).toBe(`<${tag} class=\"list-${listType}\">${text}</${tag}>`)\n })\n\n describe.each(['heading', 'list'] as const)('%s', (type) => {\n it.each(\n [\n 'style',\n 'script',\n 'plaintext',\n 'iframe',\n 'div',\n 'h7',\n '',\n null,\n undefined,\n 1,\n {},\n ['h1'],\n ].map((tag) => ({ tag })),\n )('should replace an invalid tag $tag with a safe fallback', ({ tag }) => {\n const html = renderToStaticMarkup(\n createElement(RichText, { data: createEditorState({ tag, type }), disableContainer: true }),\n )\n\n expect(html).toBe(\n type === 'heading' ? `<h1>${text}</h1>` : `<ul class=\"list-bullet\">${text}</ul>`,\n )\n })\n\n it('should replace invalid tags in nested nodes', () => {\n const data = createEditorState({ tag: 'style', type })\n\n data.root.children = [\n {\n type: 'quote',\n children: data.root.children,\n direction: null,\n format: '',\n indent: 0,\n version: 1,\n },\n ]\n\n const html = renderToStaticMarkup(createElement(RichText, { data, disableContainer: true }))\n\n expect(html).toBe(\n `<blockquote>${type === 'heading' ? `<h1>${text}</h1>` : `<ul class=\"list-bullet\">${text}</ul>`}</blockquote>`,\n )\n })\n })\n})\n\nfunction createEditorState({\n listType = 'bullet',\n tag,\n type,\n}: {\n listType?: string\n tag: unknown\n type: 'heading' | 'list'\n}): DefaultTypedEditorState {\n // Stored JSON can contain values outside the serialized node's TypeScript types.\n return {\n root: {\n type: 'root',\n children: [\n {\n type,\n children: [textNode],\n direction: null,\n format: '',\n indent: 0,\n ...(type === 'list' ? { listType, start: 1 } : {}),\n tag,\n version: 1,\n },\n ],\n direction: null,\n format: '',\n indent: 0,\n version: 1,\n },\n } as DefaultTypedEditorState\n}\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ;AAC9B,SAASC,oBAAoB,QAAQ;AACrC,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAIrC,SAASC,QAAQ,QAAQ;AAEzB,MAAMC,IAAA,GAAO;AACb,MAAMC,QAAA,GAA+B;EACnCC,IAAA,EAAM;EACNC,MAAA,EAAQ;EACRC,MAAA,EAAQ;EACRC,IAAA,EAAM;EACNC,KAAA,EAAO;EACPN,IAAA;EACAO,OAAA,EAAS;AACX;AAEAX,QAAA,CAAS,sBAAsB;EAC7BE,EAAA,CAAGU,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,EAC1C,8CACCC,GAAA;IACC,MAAMC,IAAA,GAAOf,oBAAA,CACXD,aAAA,CAAcK,QAAA,EAAU;MACtBY,IAAA,EAAMC,iBAAA,CAAkB;QAAEH,GAAA;QAAKP,IAAA,EAAM;MAAU;MAC/CW,gBAAA,EAAkB;IACpB;IAGFhB,MAAA,CAAOa,IAAA,EAAMI,IAAI,CAAC,IAAIL,GAAA,IAAOT,IAAA,KAASS,GAAA,GAAM;EAC9C;EAGFX,EAAA,CAAGU,IAAI,CAAC,CACN;IAAEO,QAAA,EAAU;IAAUN,GAAA,EAAK;EAAK,GAChC;IAAEM,QAAA,EAAU;IAAUN,GAAA,EAAK;EAAK,GAChC;IAAEM,QAAA,EAAU;IAASN,GAAA,EAAK;EAAK,EAChC,EAAE,uDAAuD,CAAC;IAAEM,QAAQ;IAAEN;EAAG,CAAE;IAC1E,MAAMC,IAAA,GAAOf,oBAAA,CACXD,aAAA,CAAcK,QAAA,EAAU;MACtBY,IAAA,EAAMC,iBAAA,CAAkB;QAAEG,QAAA;QAAUN,GAAA;QAAKP,IAAA,EAAM;MAAO;MACtDW,gBAAA,EAAkB;IACpB;IAGFhB,MAAA,CAAOa,IAAA,EAAMI,IAAI,CAAC,IAAIL,GAAA,gBAAmBM,QAAA,KAAaf,IAAA,KAASS,GAAA,GAAM;EACvE;EAEAb,QAAA,CAASY,IAAI,CAAC,CAAC,WAAW,OAAO,EAAW,MAAON,IAAA;IACjDJ,EAAA,CAAGU,IAAI,CACL,CACE,SACA,UACA,aACA,UACA,OACA,MACA,IACA,MACAQ,SAAA,EACA,GACA,CAAC,GACD,CAAC,KAAK,CACP,CAACC,GAAG,CAAER,GAAA,KAAS;MAAEA;IAAI,KACtB,2DAA2D,CAAC;MAAEA;IAAG,CAAE;MACnE,MAAMC,IAAA,GAAOf,oBAAA,CACXD,aAAA,CAAcK,QAAA,EAAU;QAAEY,IAAA,EAAMC,iBAAA,CAAkB;UAAEH,GAAA;UAAKP;QAAK;QAAIW,gBAAA,EAAkB;MAAK;MAG3FhB,MAAA,CAAOa,IAAA,EAAMI,IAAI,CACfZ,IAAA,KAAS,YAAY,OAAOF,IAAA,OAAW,GAAG,2BAA2BA,IAAA,OAAW;IAEpF;IAEAF,EAAA,CAAG,+CAA+C;MAChD,MAAMa,IAAA,GAAOC,iBAAA,CAAkB;QAAEH,GAAA,EAAK;QAASP;MAAK;MAEpDS,IAAA,CAAKO,IAAI,CAACC,QAAQ,GAAG,CACnB;QACEjB,IAAA,EAAM;QACNiB,QAAA,EAAUR,IAAA,CAAKO,IAAI,CAACC,QAAQ;QAC5BC,SAAA,EAAW;QACXhB,MAAA,EAAQ;QACRiB,MAAA,EAAQ;QACRd,OAAA,EAAS;MACX,EACD;MAED,MAAMG,IAAA,GAAOf,oBAAA,CAAqBD,aAAA,CAAcK,QAAA,EAAU;QAAEY,IAAA;QAAME,gBAAA,EAAkB;MAAK;MAEzFhB,MAAA,CAAOa,IAAA,EAAMI,IAAI,CACf,eAAeZ,IAAA,KAAS,YAAY,OAAOF,IAAA,OAAW,GAAG,2BAA2BA,IAAA,OAAW,eAAe;IAElH;EACF;AACF;AAEA,SAASY,kBAAkB;EACzBG,QAAA,GAAW,QAAQ;EACnBN,GAAG;EACHP;AAAI,CAKL;EACC;EACA,OAAO;IACLgB,IAAA,EAAM;MACJhB,IAAA,EAAM;MACNiB,QAAA,EAAU,CACR;QACEjB,IAAA;QACAiB,QAAA,EAAU,CAAClB,QAAA,CAAS;QACpBmB,SAAA,EAAW;QACXhB,MAAA,EAAQ;QACRiB,MAAA,EAAQ;QACR,IAAInB,IAAA,KAAS,SAAS;UAAEa,QAAA;UAAUO,KAAA,EAAO;QAAE,IAAI,CAAC,CAAC;QACjDb,GAAA;QACAF,OAAA,EAAS;MACX,EACD;MACDa,SAAA,EAAW;MACXhB,MAAA,EAAQ;MACRiB,MAAA,EAAQ;MACRd,OAAA,EAAS;IACX;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/heading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAUpE,CAAA"}
1
+ {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/heading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAUpE,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ALLOWED_HEADING_TAGS } from '../../../../heading/constants.js';
2
3
  export const HeadingJSXConverter = {
3
4
  heading: ({
4
5
  node,
@@ -7,7 +8,7 @@ export const HeadingJSXConverter = {
7
8
  const children = nodesToJSX({
8
9
  nodes: node.children
9
10
  });
10
- const NodeTag = node.tag;
11
+ const NodeTag = ALLOWED_HEADING_TAGS.has(node.tag) ? node.tag : 'h1';
11
12
  return /*#__PURE__*/_jsx(NodeTag, {
12
13
  children: children
13
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"heading.js","names":["HeadingJSXConverter","heading","node","nodesToJSX","children","nodes","NodeTag","tag","_jsx"],"sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/heading.tsx"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const HeadingJSXConverter: JSXConverters<SerializedHeadingNode> = {\n heading: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = node.tag\n\n return <NodeTag>{children}</NodeTag>\n },\n}\n"],"mappings":";AAGA,OAAO,MAAMA,mBAAA,GAA4D;EACvEC,OAAA,EAASA,CAAC;IAAEC,IAAI;IAAEC;EAAU,CAAE;IAC5B,MAAMC,QAAA,GAAWD,UAAA,CAAW;MAC1BE,KAAA,EAAOH,IAAA,CAAKE;IACd;IAEA,MAAME,OAAA,GAAUJ,IAAA,CAAKK,GAAG;IAExB,oBAAOC,IAAA,CAACF,OAAA;gBAASF;;EACnB;AACF","ignoreList":[]}
1
+ {"version":3,"file":"heading.js","names":["ALLOWED_HEADING_TAGS","HeadingJSXConverter","heading","node","nodesToJSX","children","nodes","NodeTag","has","tag","_jsx"],"sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/heading.tsx"],"sourcesContent":["import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nimport { ALLOWED_HEADING_TAGS } from '../../../../heading/constants.js'\n\nexport const HeadingJSXConverter: JSXConverters<SerializedHeadingNode> = {\n heading: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = ALLOWED_HEADING_TAGS.has(node.tag) ? node.tag : 'h1'\n\n return <NodeTag>{children}</NodeTag>\n },\n}\n"],"mappings":";AAGA,SAASA,oBAAoB,QAAQ;AAErC,OAAO,MAAMC,mBAAA,GAA4D;EACvEC,OAAA,EAASA,CAAC;IAAEC,IAAI;IAAEC;EAAU,CAAE;IAC5B,MAAMC,QAAA,GAAWD,UAAA,CAAW;MAC1BE,KAAA,EAAOH,IAAA,CAAKE;IACd;IAEA,MAAME,OAAA,GAAUP,oBAAA,CAAqBQ,GAAG,CAACL,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IAEhE,oBAAOC,IAAA,CAACH,OAAA;gBAASF;;EACnB;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,sBAAsB,GAAG,kBAAkB,CAqDvF,CAAA"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,sBAAsB,GAAG,kBAAkB,CAqDvF,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { v4 as uuidv4 } from 'uuid';
3
+ import { ALLOWED_LIST_TAGS } from '../../../../lists/shared/constants.js';
3
4
  export const ListJSXConverter = {
4
5
  list: ({
5
6
  node,
@@ -8,7 +9,7 @@ export const ListJSXConverter = {
8
9
  const children = nodesToJSX({
9
10
  nodes: node.children
10
11
  });
11
- const NodeTag = node.tag;
12
+ const NodeTag = ALLOWED_LIST_TAGS.has(node.tag) ? node.tag : 'ul';
12
13
  return /*#__PURE__*/_jsx(NodeTag, {
13
14
  className: `list-${node?.listType}`,
14
15
  children: children
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","names":["v4","uuidv4","ListJSXConverter","list","node","nodesToJSX","children","nodes","NodeTag","tag","_jsx","className","listType","listitem","parent","hasSubLists","some","child","type","uuid","checked","role","style","listStyleType","tabIndex","value","_jsxs","_Fragment","id","readOnly","htmlFor","undefined"],"sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/list.tsx"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const ListJSXConverter: JSXConverters<SerializedListItemNode | SerializedListNode> = {\n list: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = node.tag\n\n return <NodeTag className={`list-${node?.listType}`}>{children}</NodeTag>\n },\n listitem: ({ node, nodesToJSX, parent }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n\n return (\n <li\n aria-checked={node.checked ? 'true' : 'false'}\n className={`list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}`}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n role=\"checkbox\"\n style={{ listStyleType: 'none' }}\n tabIndex={-1}\n value={node?.value}\n >\n {hasSubLists ? (\n children\n ) : (\n <>\n <input checked={node.checked} id={uuid} readOnly={true} type=\"checkbox\" />\n <label htmlFor={uuid}>{children}</label>\n <br />\n </>\n )}\n </li>\n )\n } else {\n return (\n <li\n className={`${hasSubLists ? 'nestedListItem' : ''}`}\n style={hasSubLists ? { listStyleType: 'none' } : undefined}\n value={node?.value}\n >\n {children}\n </li>\n )\n }\n },\n}\n"],"mappings":";AAAA,SAASA,EAAA,IAAMC,MAAM,QAAQ;AAK7B,OAAO,MAAMC,gBAAA,GAA+E;EAC1FC,IAAA,EAAMA,CAAC;IAAEC,IAAI;IAAEC;EAAU,CAAE;IACzB,MAAMC,QAAA,GAAWD,UAAA,CAAW;MAC1BE,KAAA,EAAOH,IAAA,CAAKE;IACd;IAEA,MAAME,OAAA,GAAUJ,IAAA,CAAKK,GAAG;IAExB,oBAAOC,IAAA,CAACF,OAAA;MAAQG,SAAA,EAAW,QAAQP,IAAA,EAAMQ,QAAA,EAAU;gBAAGN;;EACxD;EACAO,QAAA,EAAUA,CAAC;IAAET,IAAI;IAAEC,UAAU;IAAES;EAAM,CAAE;IACrC,MAAMC,WAAA,GAAcX,IAAA,CAAKE,QAAQ,CAACU,IAAI,CAAEC,KAAA,IAAUA,KAAA,CAAMC,IAAI,KAAK;IAEjE,MAAMZ,QAAA,GAAWD,UAAA,CAAW;MAC1BE,KAAA,EAAOH,IAAA,CAAKE;IACd;IAEA,IAAI,cAAcQ,MAAA,IAAUA,MAAA,EAAQF,QAAA,KAAa,SAAS;MACxD,MAAMO,IAAA,GAAOlB,MAAA;MAEb,oBACES,IAAA,CAAC;QACC,gBAAcN,IAAA,CAAKgB,OAAO,GAAG,SAAS;QACtCT,SAAA,EAAW,qBAAqBP,IAAA,CAAKgB,OAAO,GAAG,gCAAgC,kCAAkCL,WAAA,GAAc,oBAAoB,IAAI;QACvJ;QACAM,IAAA,EAAK;QACLC,KAAA,EAAO;UAAEC,aAAA,EAAe;QAAO;QAC/BC,QAAA,EAAU,CAAC;QACXC,KAAA,EAAOrB,IAAA,EAAMqB,KAAA;kBAEZV,WAAA,GACCT,QAAA,gBAEAoB,KAAA,CAAAC,SAAA;kCACEjB,IAAA,CAAC;YAAMU,OAAA,EAAShB,IAAA,CAAKgB,OAAO;YAAEQ,EAAA,EAAIT,IAAA;YAAMU,QAAA,EAAU;YAAMX,IAAA,EAAK;2BAC7DR,IAAA,CAAC;YAAMoB,OAAA,EAASX,IAAA;sBAAOb;2BACvBI,IAAA,CAAC;;;IAKX,OAAO;MACL,oBACEA,IAAA,CAAC;QACCC,SAAA,EAAW,GAAGI,WAAA,GAAc,mBAAmB,IAAI;QACnDO,KAAA,EAAOP,WAAA,GAAc;UAAEQ,aAAA,EAAe;QAAO,IAAIQ,SAAA;QACjDN,KAAA,EAAOrB,IAAA,EAAMqB,KAAA;kBAEZnB;;IAGP;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"list.js","names":["v4","uuidv4","ALLOWED_LIST_TAGS","ListJSXConverter","list","node","nodesToJSX","children","nodes","NodeTag","has","tag","_jsx","className","listType","listitem","parent","hasSubLists","some","child","type","uuid","checked","role","style","listStyleType","tabIndex","value","_jsxs","_Fragment","id","readOnly","htmlFor","undefined"],"sources":["../../../../../../src/features/converters/lexicalToJSX/converter/converters/list.tsx"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nimport { ALLOWED_LIST_TAGS } from '../../../../lists/shared/constants.js'\n\nexport const ListJSXConverter: JSXConverters<SerializedListItemNode | SerializedListNode> = {\n list: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = ALLOWED_LIST_TAGS.has(node.tag) ? node.tag : 'ul'\n\n return <NodeTag className={`list-${node?.listType}`}>{children}</NodeTag>\n },\n listitem: ({ node, nodesToJSX, parent }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n\n return (\n <li\n aria-checked={node.checked ? 'true' : 'false'}\n className={`list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}`}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n role=\"checkbox\"\n style={{ listStyleType: 'none' }}\n tabIndex={-1}\n value={node?.value}\n >\n {hasSubLists ? (\n children\n ) : (\n <>\n <input checked={node.checked} id={uuid} readOnly={true} type=\"checkbox\" />\n <label htmlFor={uuid}>{children}</label>\n <br />\n </>\n )}\n </li>\n )\n } else {\n return (\n <li\n className={`${hasSubLists ? 'nestedListItem' : ''}`}\n style={hasSubLists ? { listStyleType: 'none' } : undefined}\n value={node?.value}\n >\n {children}\n </li>\n )\n }\n },\n}\n"],"mappings":";AAAA,SAASA,EAAA,IAAMC,MAAM,QAAQ;AAK7B,SAASC,iBAAiB,QAAQ;AAElC,OAAO,MAAMC,gBAAA,GAA+E;EAC1FC,IAAA,EAAMA,CAAC;IAAEC,IAAI;IAAEC;EAAU,CAAE;IACzB,MAAMC,QAAA,GAAWD,UAAA,CAAW;MAC1BE,KAAA,EAAOH,IAAA,CAAKE;IACd;IAEA,MAAME,OAAA,GAAUP,iBAAA,CAAkBQ,GAAG,CAACL,IAAA,CAAKM,GAAG,IAAIN,IAAA,CAAKM,GAAG,GAAG;IAE7D,oBAAOC,IAAA,CAACH,OAAA;MAAQI,SAAA,EAAW,QAAQR,IAAA,EAAMS,QAAA,EAAU;gBAAGP;;EACxD;EACAQ,QAAA,EAAUA,CAAC;IAAEV,IAAI;IAAEC,UAAU;IAAEU;EAAM,CAAE;IACrC,MAAMC,WAAA,GAAcZ,IAAA,CAAKE,QAAQ,CAACW,IAAI,CAAEC,KAAA,IAAUA,KAAA,CAAMC,IAAI,KAAK;IAEjE,MAAMb,QAAA,GAAWD,UAAA,CAAW;MAC1BE,KAAA,EAAOH,IAAA,CAAKE;IACd;IAEA,IAAI,cAAcS,MAAA,IAAUA,MAAA,EAAQF,QAAA,KAAa,SAAS;MACxD,MAAMO,IAAA,GAAOpB,MAAA;MAEb,oBACEW,IAAA,CAAC;QACC,gBAAcP,IAAA,CAAKiB,OAAO,GAAG,SAAS;QACtCT,SAAA,EAAW,qBAAqBR,IAAA,CAAKiB,OAAO,GAAG,gCAAgC,kCAAkCL,WAAA,GAAc,oBAAoB,IAAI;QACvJ;QACAM,IAAA,EAAK;QACLC,KAAA,EAAO;UAAEC,aAAA,EAAe;QAAO;QAC/BC,QAAA,EAAU,CAAC;QACXC,KAAA,EAAOtB,IAAA,EAAMsB,KAAA;kBAEZV,WAAA,GACCV,QAAA,gBAEAqB,KAAA,CAAAC,SAAA;kCACEjB,IAAA,CAAC;YAAMU,OAAA,EAASjB,IAAA,CAAKiB,OAAO;YAAEQ,EAAA,EAAIT,IAAA;YAAMU,QAAA,EAAU;YAAMX,IAAA,EAAK;2BAC7DR,IAAA,CAAC;YAAMoB,OAAA,EAASX,IAAA;sBAAOd;2BACvBK,IAAA,CAAC;;;IAKX,OAAO;MACL,oBACEA,IAAA,CAAC;QACCC,SAAA,EAAW,GAAGI,WAAA,GAAc,mBAAmB,IAAI;QACnDO,KAAA,EAAOP,WAAA,GAAc;UAAEQ,aAAA,EAAe;QAAO,IAAIQ,SAAA;QACjDN,KAAA,EAAOtB,IAAA,EAAMsB,KAAA;kBAEZpB;;IAGP;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ import type { TableSelection } from '@lexical/table';
2
+ export declare function $computeSelectionCount({ selection }: {
3
+ selection: TableSelection;
4
+ }): {
5
+ columns: number;
6
+ rows: number;
7
+ };
8
+ //# sourceMappingURL=computeSelectionCount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeSelectionCount.d.ts","sourceRoot":"","sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/computeSelectionCount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAIpD,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG;IACpF,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,CAUA"}
@@ -0,0 +1,19 @@
1
+ import { $computeTableCellRectBoundary, $computeTableMap, $getNodeTriplet } from '@lexical/table';
2
+ export function $computeSelectionCount({
3
+ selection
4
+ }) {
5
+ const [anchorCell,, table] = $getNodeTriplet(selection.anchor);
6
+ const [focusCell] = $getNodeTriplet(selection.focus);
7
+ const [map, anchor, focus] = $computeTableMap(table, anchorCell, focusCell);
8
+ const {
9
+ maxColumn,
10
+ maxRow,
11
+ minColumn,
12
+ minRow
13
+ } = $computeTableCellRectBoundary(map, anchor, focus);
14
+ return {
15
+ columns: maxColumn - minColumn + 1,
16
+ rows: maxRow - minRow + 1
17
+ };
18
+ }
19
+ //# sourceMappingURL=computeSelectionCount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeSelectionCount.js","names":["$computeTableCellRectBoundary","$computeTableMap","$getNodeTriplet","$computeSelectionCount","selection","anchorCell","table","anchor","focusCell","focus","map","maxColumn","maxRow","minColumn","minRow","columns","rows"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/computeSelectionCount.ts"],"sourcesContent":["import type { TableSelection } from '@lexical/table'\n\nimport { $computeTableCellRectBoundary, $computeTableMap, $getNodeTriplet } from '@lexical/table'\n\nexport function $computeSelectionCount({ selection }: { selection: TableSelection }): {\n columns: number\n rows: number\n} {\n const [anchorCell, , table] = $getNodeTriplet(selection.anchor)\n const [focusCell] = $getNodeTriplet(selection.focus)\n const [map, anchor, focus] = $computeTableMap(table, anchorCell, focusCell)\n const { maxColumn, maxRow, minColumn, minRow } = $computeTableCellRectBoundary(map, anchor, focus)\n\n return {\n columns: maxColumn - minColumn + 1,\n rows: maxRow - minRow + 1,\n }\n}\n"],"mappings":"AAEA,SAASA,6BAA6B,EAAEC,gBAAgB,EAAEC,eAAe,QAAQ;AAEjF,OAAO,SAASC,uBAAuB;EAAEC;AAAS,CAAiC;EAIjF,MAAM,CAACC,UAAA,GAAcC,KAAA,CAAM,GAAGJ,eAAA,CAAgBE,SAAA,CAAUG,MAAM;EAC9D,MAAM,CAACC,SAAA,CAAU,GAAGN,eAAA,CAAgBE,SAAA,CAAUK,KAAK;EACnD,MAAM,CAACC,GAAA,EAAKH,MAAA,EAAQE,KAAA,CAAM,GAAGR,gBAAA,CAAiBK,KAAA,EAAOD,UAAA,EAAYG,SAAA;EACjE,MAAM;IAAEG,SAAS;IAAEC,MAAM;IAAEC,SAAS;IAAEC;EAAM,CAAE,GAAGd,6BAAA,CAA8BU,GAAA,EAAKH,MAAA,EAAQE,KAAA;EAE5F,OAAO;IACLM,OAAA,EAASJ,SAAA,GAAYE,SAAA,GAAY;IACjCG,IAAA,EAAMJ,MAAA,GAASE,MAAA,GAAS;EAC1B;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAE3E,OAAO,cAAc,CAAA;AA6oBrB,eAAO,MAAM,qBAAqB,EAAE,yBAQnC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAE3E,OAAO,cAAc,CAAA;AAqmBrB,eAAO,MAAM,qBAAqB,EAAE,yBAQnC,CAAA"}
@@ -4,7 +4,7 @@ import { c as _c } from "react/compiler-runtime";
4
4
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
6
6
  import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
7
- import { $computeTableMapSkipCellCheck, $deleteTableColumnAtSelection, $deleteTableRowAtSelection, $getNodeTriplet, $getTableCellNodeFromLexicalNode, $getTableColumnIndexFromTableCellNode, $getTableNodeFromLexicalNodeOrThrow, $getTableRowIndexFromTableCellNode, $insertTableColumnAtSelection, $insertTableRowAtSelection, $isTableCellNode, $isTableSelection, $mergeCells, $unmergeCell, getTableElement, getTableObserverFromTableElement, TableCellHeaderStates, TableCellNode } from '@lexical/table';
7
+ import { $computeTableMap, $deleteTableColumnAtSelection, $deleteTableRowAtSelection, $getNodeTriplet, $getTableCellNodeFromLexicalNode, $getTableNodeFromLexicalNodeOrThrow, $getTableRowIndexFromTableCellNode, $insertTableColumnAtSelection, $insertTableRowAtSelection, $isTableCellNode, $isTableSelection, $mergeCells, $setTableColumnIsHeader, $setTableRowIsHeader, $unmergeCell, getTableElement, getTableObserverFromTableElement, TableCellHeaderStates, TableCellNode } from '@lexical/table';
8
8
  import { mergeRegister } from '@lexical/utils';
9
9
  import { useScrollInfo } from '@payloadcms/ui';
10
10
  import { $getSelection, $isElementNode, $isRangeSelection, $isTextNode, $setSelection, COMMAND_PRIORITY_CRITICAL, getDOMSelection, isDOMNode, SELECTION_CHANGE_COMMAND } from 'lexical';
@@ -12,13 +12,7 @@ import * as React from 'react';
12
12
  import { useCallback, useEffect, useRef, useState } from 'react';
13
13
  import { createPortal } from 'react-dom';
14
14
  import { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js';
15
- function computeSelectionCount(selection) {
16
- const selectionShape = selection.getShape();
17
- return {
18
- columns: selectionShape.toX - selectionShape.fromX + 1,
19
- rows: selectionShape.toY - selectionShape.fromY + 1
20
- };
21
- }
15
+ import { $computeSelectionCount } from './computeSelectionCount.js';
22
16
  function $canUnmerge() {
23
17
  const selection = $getSelection();
24
18
  if ($isRangeSelection(selection) && !selection.isCollapsed() || $isTableSelection(selection) && !selection.anchor.is(selection.focus) || !$isRangeSelection(selection) && !$isTableSelection(selection)) {
@@ -73,9 +67,12 @@ function TableActionMenu({
73
67
  const selection = $getSelection();
74
68
  // Merge cells
75
69
  if ($isTableSelection(selection)) {
76
- const currentSelectionCounts = computeSelectionCount(selection);
77
- updateSelectionCounts(computeSelectionCount(selection));
78
- setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1);
70
+ const currentSelectionCounts = $computeSelectionCount({
71
+ selection
72
+ });
73
+ updateSelectionCounts(currentSelectionCounts);
74
+ const isCollapsedTableSelection = selection.anchor.is(selection.focus);
75
+ setCanMergeCells(!isCollapsedTableSelection && (currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1));
79
76
  }
80
77
  // Unmerge cell
81
78
  setCanUnmergeCell($canUnmerge());
@@ -151,6 +148,7 @@ function TableActionMenu({
151
148
  editor.update(() => {
152
149
  $unmergeCell();
153
150
  });
151
+ clearTableSelection();
154
152
  };
155
153
  const insertTableRowAtSelection = useCallback(shouldInsertAfter => {
156
154
  editor.update(() => {
@@ -191,22 +189,9 @@ function TableActionMenu({
191
189
  const toggleTableRowIsHeader = useCallback(() => {
192
190
  editor.update(() => {
193
191
  const tableNode_1 = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);
194
- const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode);
195
- const [gridMap] = $computeTableMapSkipCellCheck(tableNode_1, null, null);
196
- const rowCells = new Set();
197
- const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW;
198
- if (gridMap[tableRowIndex]) {
199
- for (let col = 0; col < gridMap[tableRowIndex].length; col++) {
200
- const mapCell = gridMap[tableRowIndex][col];
201
- if (!mapCell?.cell) {
202
- continue;
203
- }
204
- if (!rowCells.has(mapCell.cell)) {
205
- rowCells.add(mapCell.cell);
206
- mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW);
207
- }
208
- }
209
- }
192
+ const rowIndex = $getTableRowIndexFromTableCellNode(tableCellNode);
193
+ const isHeader = !tableCellNode.hasHeaderState(TableCellHeaderStates.ROW);
194
+ $setTableRowIsHeader(tableNode_1, rowIndex, isHeader);
210
195
  clearTableSelection();
211
196
  onClose();
212
197
  });
@@ -214,22 +199,10 @@ function TableActionMenu({
214
199
  const toggleTableColumnIsHeader = useCallback(() => {
215
200
  editor.update(() => {
216
201
  const tableNode_2 = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);
217
- const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode);
218
- const [gridMap_0] = $computeTableMapSkipCellCheck(tableNode_2, null, null);
219
- const columnCells = new Set();
220
- const newStyle_0 = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN;
221
- if (gridMap_0) {
222
- for (let row = 0; row < gridMap_0.length; row++) {
223
- const mapCell_0 = gridMap_0?.[row]?.[tableColumnIndex];
224
- if (!mapCell_0?.cell) {
225
- continue;
226
- }
227
- if (!columnCells.has(mapCell_0.cell)) {
228
- columnCells.add(mapCell_0.cell);
229
- mapCell_0.cell.setHeaderStyles(newStyle_0, TableCellHeaderStates.COLUMN);
230
- }
231
- }
232
- }
202
+ // Merged cells can make the grid column differ from the cell's index in its row.
203
+ const [, cellMap] = $computeTableMap(tableNode_2, tableCellNode, tableCellNode);
204
+ const isHeader_0 = !tableCellNode.hasHeaderState(TableCellHeaderStates.COLUMN);
205
+ $setTableColumnIsHeader(tableNode_2, cellMap.startColumn, isHeader_0);
233
206
  clearTableSelection();
234
207
  onClose();
235
208
  });