@uva-glass/component-library 3.55.4 → 3.55.6

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 (330) hide show
  1. package/dist/{Accordion-BpnBHYIx.js → Accordion-DvblEUVu.js} +16 -17
  2. package/dist/{Accordion-BpnBHYIx.js.map → Accordion-DvblEUVu.js.map} +1 -1
  3. package/dist/ActionList-O9w1hqNg.js.map +1 -1
  4. package/dist/{AddCatalogueLinkForm-Cy6fPNvN.js → AddCatalogueLinkForm-rph4K9P0.js} +24 -25
  5. package/dist/{AddCatalogueLinkForm-Cy6fPNvN.js.map → AddCatalogueLinkForm-rph4K9P0.js.map} +1 -1
  6. package/dist/{CheckboxButtonBar-CalU0IYK.js → CheckboxButtonBar-5UMIFMKH.js} +2 -2
  7. package/dist/{CheckboxButtonBar-CalU0IYK.js.map → CheckboxButtonBar-5UMIFMKH.js.map} +1 -1
  8. package/dist/{ControlsButton-zemVxTlg.js → ControlsButton-B1XRpMUM.js} +15 -16
  9. package/dist/{ControlsButton-zemVxTlg.js.map → ControlsButton-B1XRpMUM.js.map} +1 -1
  10. package/dist/{Drawer-Ggofac6y.js → Drawer-e7UFHVg9.js} +29 -30
  11. package/dist/{Drawer-Ggofac6y.js.map → Drawer-e7UFHVg9.js.map} +1 -1
  12. package/dist/{FieldHint-D0HtbTnt.js → FieldHint-fxnEOsVZ.js} +2 -2
  13. package/dist/{FieldHint-D0HtbTnt.js.map → FieldHint-fxnEOsVZ.js.map} +1 -1
  14. package/dist/Fieldset-0LFsZ3Mz.js +22 -0
  15. package/dist/{Fieldset-CoNu_Owa.js.map → Fieldset-0LFsZ3Mz.js.map} +1 -1
  16. package/dist/{Lexical.prod-DIglXatJ.js → Lexical.prod-CqPLSi0R.js} +1225 -1120
  17. package/dist/Lexical.prod-CqPLSi0R.js.map +1 -0
  18. package/dist/LexicalClipboard.prod-BVw_sFpo.js +651 -0
  19. package/dist/LexicalClipboard.prod-BVw_sFpo.js.map +1 -0
  20. package/dist/{LexicalExtension.prod-COPHoPpX.js → LexicalExtension.prod-CUQTgbur.js} +318 -291
  21. package/dist/LexicalExtension.prod-CUQTgbur.js.map +1 -0
  22. package/dist/{LexicalLink.prod-Bf9JUdMv.js → LexicalLink.prod-DMhcqD9x.js} +212 -205
  23. package/dist/LexicalLink.prod-DMhcqD9x.js.map +1 -0
  24. package/dist/{LexicalList.prod-DRz8vsM9.js → LexicalList.prod-eYlcb5Ao.js} +295 -255
  25. package/dist/LexicalList.prod-eYlcb5Ao.js.map +1 -0
  26. package/dist/{LexicalTable.prod-D16GW-aZ.js → LexicalTable.prod-DlOxUQou.js} +717 -703
  27. package/dist/LexicalTable.prod-DlOxUQou.js.map +1 -0
  28. package/dist/LexicalUtils.prod-BqcriFWV.js +343 -0
  29. package/dist/LexicalUtils.prod-BqcriFWV.js.map +1 -0
  30. package/dist/{LinkContextMenu-m_CGQEiX.js → LinkContextMenu-ePn1iZ_z.js} +2 -2
  31. package/dist/{LinkContextMenu-m_CGQEiX.js.map → LinkContextMenu-ePn1iZ_z.js.map} +1 -1
  32. package/dist/{ModalDialog-HUkDdAJ-.js → ModalDialog-N50NGnd4.js} +2 -2
  33. package/dist/{ModalDialog-HUkDdAJ-.js.map → ModalDialog-N50NGnd4.js.map} +1 -1
  34. package/dist/MultiSelectBox-Cuh_o-A1.js.map +1 -1
  35. package/dist/{PageOverlay-D_wG2oie.js → PageOverlay-S4xsqJha.js} +2 -2
  36. package/dist/{PageOverlay-D_wG2oie.js.map → PageOverlay-S4xsqJha.js.map} +1 -1
  37. package/dist/{PasteHandlerPlugin-DjD1wryY.js → PasteHandlerPlugin-BNp8ST0q.js} +5 -5
  38. package/dist/{PasteHandlerPlugin-DjD1wryY.js.map → PasteHandlerPlugin-BNp8ST0q.js.map} +1 -1
  39. package/dist/Periods-BYETtB6R.js.map +1 -1
  40. package/dist/{RteEditor.module-Jk80F1FA.js → RteEditor.module-BJLUYSpf.js} +9 -10
  41. package/dist/{RteEditor.module-Jk80F1FA.js.map → RteEditor.module-BJLUYSpf.js.map} +1 -1
  42. package/dist/Slider-BlLyrET9.js.map +1 -1
  43. package/dist/{Sortable.module-BTUOSbOU.js → Sortable.module-8SoaHfuE.js} +6 -7
  44. package/dist/{Sortable.module-BTUOSbOU.js.map → Sortable.module-8SoaHfuE.js.map} +1 -1
  45. package/dist/{SortableProvider-Dc7hwkb5.js → SortableProvider-8HYiBXJS.js} +2 -2
  46. package/dist/{SortableProvider-Dc7hwkb5.js.map → SortableProvider-8HYiBXJS.js.map} +1 -1
  47. package/dist/Spinner-BpElTDIu.js +30 -0
  48. package/dist/{Spinner-D8tWqg9j.js.map → Spinner-BpElTDIu.js.map} +1 -1
  49. package/dist/{TableCellResizerPlugin-CgYsYsuY.js → TableCellResizerPlugin-Bc5y-Qbx.js} +36 -36
  50. package/dist/{TableCellResizerPlugin-CgYsYsuY.js.map → TableCellResizerPlugin-Bc5y-Qbx.js.map} +1 -1
  51. package/dist/{TextArea-DqKIpOfT.js → TextArea-CuASC9bX.js} +16 -17
  52. package/dist/{TextArea-DqKIpOfT.js.map → TextArea-CuASC9bX.js.map} +1 -1
  53. package/dist/{Tooltip-BzB3jznk.js → Tooltip-D27p9kh4.js} +13 -14
  54. package/dist/{Tooltip-BzB3jznk.js.map → Tooltip-D27p9kh4.js.map} +1 -1
  55. package/dist/{chunk-DeC0fbbY.js → chunk-3e0lkp8x.js} +1 -1
  56. package/dist/{chunk-SZQXB3JV-D0XG4Tlp.js → chunk-SZQXB3JV-D6GR5B4F.js} +5 -5
  57. package/dist/chunk-SZQXB3JV-D6GR5B4F.js.map +1 -0
  58. package/dist/{client-UU-mS47K.js → client-8jeXrH7N.js} +10 -10
  59. package/dist/{client-UU-mS47K.js.map → client-8jeXrH7N.js.map} +1 -1
  60. package/dist/components/Accordion/Accordion.js +1 -1
  61. package/dist/components/Accordion/Accordion.stories.js +1 -1
  62. package/dist/components/Accordion/Accordion.stories.js.map +1 -1
  63. package/dist/components/Accordion/Accordion.test.js +4 -7
  64. package/dist/components/Accordion/Accordion.test.js.map +1 -1
  65. package/dist/components/Accordion/index.js +1 -1
  66. package/dist/components/AccordionCard/AccordionCard.stories.js.map +1 -1
  67. package/dist/components/AccordionCard/AccordionCard.test.js +3 -6
  68. package/dist/components/AccordionCard/AccordionCard.test.js.map +1 -1
  69. package/dist/components/ActionList/ActionList.stories.js.map +1 -1
  70. package/dist/components/ActionList/ActionList.test.js +3 -6
  71. package/dist/components/ActionList/ActionList.test.js.map +1 -1
  72. package/dist/components/AppStatusBar/AppStatusBar.stories.js.map +1 -1
  73. package/dist/components/AppStatusBar/AppStatusBar.test.js +2 -5
  74. package/dist/components/AppStatusBar/AppStatusBar.test.js.map +1 -1
  75. package/dist/components/Attention/Attention.stories.js.map +1 -1
  76. package/dist/components/Attention/Attention.test.js +2 -5
  77. package/dist/components/Attention/Attention.test.js.map +1 -1
  78. package/dist/components/Backdrop/Backdrop.stories.js.map +1 -1
  79. package/dist/components/Backdrop/Backdrop.test.js +2 -5
  80. package/dist/components/Backdrop/Backdrop.test.js.map +1 -1
  81. package/dist/components/ButtonGroup/ButtonGroup.stories.js.map +1 -1
  82. package/dist/components/Buttons/Button.stories.js +1 -1
  83. package/dist/components/Buttons/Button.stories.js.map +1 -1
  84. package/dist/components/Buttons/Button.test.js +2 -5
  85. package/dist/components/Buttons/Button.test.js.map +1 -1
  86. package/dist/components/Buttons/LinkButton.stories.js +1 -1
  87. package/dist/components/Buttons/LinkButton.stories.js.map +1 -1
  88. package/dist/components/Buttons/LinkButton.test.js +2 -5
  89. package/dist/components/Buttons/LinkButton.test.js.map +1 -1
  90. package/dist/components/Buttons/MenuButton.stories.js +1 -1
  91. package/dist/components/Buttons/MenuButton.stories.js.map +1 -1
  92. package/dist/components/Buttons/MenuButton.test.js +2 -5
  93. package/dist/components/Buttons/MenuButton.test.js.map +1 -1
  94. package/dist/components/Card/Card.stories.js.map +1 -1
  95. package/dist/components/Card/Card.test.js +2 -5
  96. package/dist/components/Card/Card.test.js.map +1 -1
  97. package/dist/components/Checkbox/Checkbox.stories.js +1 -1
  98. package/dist/components/Checkbox/Checkbox.stories.js.map +1 -1
  99. package/dist/components/Checkbox/Checkbox.test.js +3 -6
  100. package/dist/components/Checkbox/Checkbox.test.js.map +1 -1
  101. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.js +1 -1
  102. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.stories.js +2 -2
  103. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.stories.js.map +1 -1
  104. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.test.js +3 -6
  105. package/dist/components/CheckboxButtonBar/CheckboxButtonBar.test.js.map +1 -1
  106. package/dist/components/CheckboxButtonBar/index.js +1 -1
  107. package/dist/components/CheckboxTree/CheckboxTree.js +1 -2
  108. package/dist/components/CheckboxTree/CheckboxTree.stories.js +3 -4
  109. package/dist/components/CheckboxTree/CheckboxTree.stories.js.map +1 -1
  110. package/dist/components/CheckboxTree/index.js +1 -2
  111. package/dist/components/Chip/Chip.stories.js +1 -1
  112. package/dist/components/Chip/Chip.stories.js.map +1 -1
  113. package/dist/components/ControlsButton/ControlsButton.js +1 -1
  114. package/dist/components/ControlsButton/ControlsButton.stories.js +2 -2
  115. package/dist/components/ControlsButton/ControlsButton.stories.js.map +1 -1
  116. package/dist/components/ControlsButton/index.js +1 -1
  117. package/dist/components/Drawer/Drawer.js +1 -1
  118. package/dist/components/Drawer/Drawer.stories.js +2 -2
  119. package/dist/components/Drawer/Drawer.stories.js.map +1 -1
  120. package/dist/components/Drawer/index.js +1 -1
  121. package/dist/components/EmptyStateDataDisplay/EmptyStateDataDisplay.stories.js.map +1 -1
  122. package/dist/components/ExpandableInfoPanel/ExpandableInfoPanel.stories.js.map +1 -1
  123. package/dist/components/FeedbackBar/FeedbackBar.stories.js.map +1 -1
  124. package/dist/components/FeedbackBar/FeedbackBar.test.js +2 -5
  125. package/dist/components/FeedbackBar/FeedbackBar.test.js.map +1 -1
  126. package/dist/components/FeedbackBox/FeedbackBox.stories.js.map +1 -1
  127. package/dist/components/FieldHint/FieldHint.js +1 -1
  128. package/dist/components/FieldHint/FieldHint.stories.js +1 -1
  129. package/dist/components/FieldHint/FieldHint.stories.js.map +1 -1
  130. package/dist/components/FieldHint/index.js +1 -1
  131. package/dist/components/Fieldset/Fieldset.js +1 -1
  132. package/dist/components/Fieldset/Fieldset.stories.js +1 -1
  133. package/dist/components/Fieldset/Fieldset.stories.js.map +1 -1
  134. package/dist/components/Fieldset/index.js +1 -1
  135. package/dist/components/FormField/FormField.stories.js.map +1 -1
  136. package/dist/components/FormInput/FormInput.js +1 -2
  137. package/dist/components/FormInput/FormInput.stories.js +2 -3
  138. package/dist/components/FormInput/FormInput.stories.js.map +1 -1
  139. package/dist/components/FormInput/index.js +1 -2
  140. package/dist/components/GridRow/GridRow.stories.js.map +1 -1
  141. package/dist/components/HorizontalList/HorizontalList.stories.js.map +1 -1
  142. package/dist/components/Icon/Icon.stories.js.map +1 -1
  143. package/dist/components/IconButton/IconButton.stories.js +6 -7
  144. package/dist/components/IconButton/IconButton.stories.js.map +1 -1
  145. package/dist/components/InfoBanner/InfoBanner.stories.js.map +1 -1
  146. package/dist/components/InfoMessage/InfoMessage.stories.js.map +1 -1
  147. package/dist/components/Input/Input.stories.js.map +1 -1
  148. package/dist/components/InputField/InputField.stories.js +1 -3
  149. package/dist/components/InputField/InputField.stories.js.map +1 -1
  150. package/dist/components/Label/Label.stories.js.map +1 -1
  151. package/dist/components/Label/Label.test.js +2 -5
  152. package/dist/components/Label/Label.test.js.map +1 -1
  153. package/dist/components/MenuLink/MenuLink.stories.js.map +1 -1
  154. package/dist/components/MetaDataBar/MetaDataBar.stories.js.map +1 -1
  155. package/dist/components/MetaDataBar/MetaDataBar.test.js +1 -4
  156. package/dist/components/MetaDataBar/MetaDataBar.test.js.map +1 -1
  157. package/dist/components/MetaDataList/MetaDataList.stories.js.map +1 -1
  158. package/dist/components/ModalDialog/ModalDialog.js +1 -1
  159. package/dist/components/ModalDialog/ModalDialog.stories.js +2 -2
  160. package/dist/components/ModalDialog/ModalDialog.stories.js.map +1 -1
  161. package/dist/components/ModalDialog/index.js +1 -1
  162. package/dist/components/MultiSelect/MultiSelect.js +1 -2
  163. package/dist/components/MultiSelect/MultiSelect.stories.js +2 -3
  164. package/dist/components/MultiSelect/MultiSelect.stories.js.map +1 -1
  165. package/dist/components/MultiSelect/components/MultiSelectHeader.js +1 -2
  166. package/dist/components/MultiSelect/index.js +1 -2
  167. package/dist/components/MultiSelectBox/MultiSelectBox.stories.js +1 -1
  168. package/dist/components/MultiSelectBox/MultiSelectBox.stories.js.map +1 -1
  169. package/dist/components/MultiSelectBox/MultiSelectBox.test.js +2 -5
  170. package/dist/components/MultiSelectBox/MultiSelectBox.test.js.map +1 -1
  171. package/dist/components/Notification/Notification.stories.js +1 -1
  172. package/dist/components/Notification/Notification.stories.js.map +1 -1
  173. package/dist/components/Notification/Notification.test.js +2 -5
  174. package/dist/components/Notification/Notification.test.js.map +1 -1
  175. package/dist/components/OverlayCloseButton/OverlayCloseButton.stories.js +6 -7
  176. package/dist/components/OverlayCloseButton/OverlayCloseButton.stories.js.map +1 -1
  177. package/dist/components/OverlayStepBar/OverlayStepBar.stories.js.map +1 -1
  178. package/dist/components/PageOverlay/PageOverlay.js +1 -1
  179. package/dist/components/PageOverlay/PageOverlay.stories.js +1 -1
  180. package/dist/components/PageOverlay/PageOverlay.stories.js.map +1 -1
  181. package/dist/components/PageOverlay/index.js +1 -1
  182. package/dist/components/PeriodSelector/PeriodSelector.js +1 -2
  183. package/dist/components/PeriodSelector/PeriodSelector.stories.js +2 -3
  184. package/dist/components/PeriodSelector/PeriodSelector.stories.js.map +1 -1
  185. package/dist/components/PeriodSelector/index.js +1 -2
  186. package/dist/components/ProgrammeCard/ProgrammeCard.stories.js +0 -2
  187. package/dist/components/ProgrammeCard/ProgrammeCard.stories.js.map +1 -1
  188. package/dist/components/RadioButton/RadioButton.stories.js.map +1 -1
  189. package/dist/components/RadioGroup/RadioGroup.stories.js +1 -1
  190. package/dist/components/RadioGroup/RadioGroup.stories.js.map +1 -1
  191. package/dist/components/RadioGroup/Radiogroup.test.js +2 -5
  192. package/dist/components/RadioGroup/Radiogroup.test.js.map +1 -1
  193. package/dist/components/RadioTabSelector/RadioTabSelector.js +1 -2
  194. package/dist/components/RadioTabSelector/RadioTabSelector.stories.js +2 -3
  195. package/dist/components/RadioTabSelector/RadioTabSelector.stories.js.map +1 -1
  196. package/dist/components/RadioTabSelector/index.js +1 -2
  197. package/dist/components/Repeater/Repeater.stories.js.map +1 -1
  198. package/dist/components/RteEditor/EditorHeader/EditorHeader.js +1 -2
  199. package/dist/components/RteEditor/EditorHeader/index.js +1 -2
  200. package/dist/components/RteEditor/Plugins/BlockFormatPlugin/BlockFormatPlugin.js +5 -5
  201. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/AddCatalogueLinkForm/AddCatalogueLinkForm.js +1 -1
  202. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/AddCatalogueLinkForm/index.js +1 -1
  203. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js +36 -36
  204. package/dist/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.js.map +1 -1
  205. package/dist/components/RteEditor/Plugins/HistoryPlugin/HistoryPlugin.js +1 -2
  206. package/dist/components/RteEditor/Plugins/HistoryPlugin/index.js +1 -2
  207. package/dist/components/RteEditor/Plugins/LinkPlugin/AddLinkForm/AddLinkFrom.js +1 -2
  208. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkContextMenu/LinkContextMenu.js +1 -1
  209. package/dist/components/RteEditor/Plugins/LinkPlugin/LinkPlugin.js +1 -2
  210. package/dist/components/RteEditor/Plugins/LinkPlugin/helpers.js +1 -1
  211. package/dist/components/RteEditor/Plugins/LinkPlugin/index.js +1 -2
  212. package/dist/components/RteEditor/Plugins/ListPlugin/ListPlugin.js +16 -16
  213. package/dist/components/RteEditor/Plugins/ListPlugin/ListPlugin.js.map +1 -1
  214. package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/PasteHandlerPlugin.js +1 -1
  215. package/dist/components/RteEditor/Plugins/PasteHandlerPlugin/index.js +1 -1
  216. package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/TableCellResizerPlugin.js +1 -1
  217. package/dist/components/RteEditor/Plugins/TableCellResizerPlugin/index.js +1 -1
  218. package/dist/components/RteEditor/Plugins/TablePlugin/AddTableFrom.js +1 -2
  219. package/dist/components/RteEditor/Plugins/TablePlugin/TablePlugin.js +1 -2
  220. package/dist/components/RteEditor/Plugins/TablePlugin/helpers.js +29 -29
  221. package/dist/components/RteEditor/Plugins/TablePlugin/helpers.js.map +1 -1
  222. package/dist/components/RteEditor/Plugins/TablePlugin/index.js +1 -2
  223. package/dist/components/RteEditor/Plugins/ToolbarPlugin/ToolbarPlugin.js +1 -2
  224. package/dist/components/RteEditor/Plugins/ToolbarPlugin/index.js +1 -2
  225. package/dist/components/RteEditor/Plugins/index.js +3 -3
  226. package/dist/components/RteEditor/RteEditor.js +1 -2
  227. package/dist/components/RteEditor/RteEditor.stories.js +1 -2
  228. package/dist/components/RteEditor/RteEditor.stories.js.map +1 -1
  229. package/dist/components/RteEditor/UvaTheme/UvaTheme.js +1 -1
  230. package/dist/components/RteEditor/helpers.js +5 -5
  231. package/dist/components/RteEditor/helpers.js.map +1 -1
  232. package/dist/components/RteEditor/hooks/useFlyout.js.map +1 -1
  233. package/dist/components/RteEditor/index.js +1 -2
  234. package/dist/components/RteEditor/nodes/CourseCatalogueNode/CourseCatalogueNode.js +17 -17
  235. package/dist/components/RteEditor/nodes/CourseCatalogueNode/CourseCatalogueNode.js.map +1 -1
  236. package/dist/components/RteEditor/nodes/TableWrapperNode/TableWrapperNode.js +19 -19
  237. package/dist/components/SearchField/SearcheField.stories.js.map +1 -1
  238. package/dist/components/SectionNotification/SectionNotification.stories.js.map +1 -1
  239. package/dist/components/SelectListbox/SelectListBox.stories.js +1 -1
  240. package/dist/components/SelectListbox/SelectListBox.stories.js.map +1 -1
  241. package/dist/components/SelectListbox/SelectProvider.js.map +1 -1
  242. package/dist/components/Slider/Slider.stories.js.map +1 -1
  243. package/dist/components/Sortable/Sortable.js +1 -1
  244. package/dist/components/Sortable/Sortable.stories.js +1 -1
  245. package/dist/components/Sortable/Sortable.stories.js.map +1 -1
  246. package/dist/components/Sortable/SortableProvider.js +1 -1
  247. package/dist/components/Sortable/components/SortableContainer.js +1 -1
  248. package/dist/components/Sortable/components/SortableHandle.js +1 -1
  249. package/dist/components/Sortable/components/SortableItem.js +2 -2
  250. package/dist/components/Spinner/Spinner.js +1 -1
  251. package/dist/components/Spinner/Spinner.stories.js +1 -1
  252. package/dist/components/Spinner/Spinner.stories.js.map +1 -1
  253. package/dist/components/Spinner/index.js +1 -1
  254. package/dist/components/StatusBadge/StatusBadge.stories.js.map +1 -1
  255. package/dist/components/StatusBadge/StatusBadge.test.js +2 -5
  256. package/dist/components/StatusBadge/StatusBadge.test.js.map +1 -1
  257. package/dist/components/StatusPill/StatusPill.stories.js.map +1 -1
  258. package/dist/components/TextArea/TextArea.js +1 -1
  259. package/dist/components/TextArea/TextArea.stories.js +2 -2
  260. package/dist/components/TextArea/TextArea.stories.js.map +1 -1
  261. package/dist/components/TextArea/TextArea.test.js +4 -7
  262. package/dist/components/TextArea/TextArea.test.js.map +1 -1
  263. package/dist/components/TextArea/index.js +1 -1
  264. package/dist/components/ToggleSwitch/ToggleSwitch.stories.js +1 -1
  265. package/dist/components/ToggleSwitch/ToggleSwitch.stories.js.map +1 -1
  266. package/dist/components/Tooltip/Tooltip.js +1 -1
  267. package/dist/components/Tooltip/Tooltip.stories.js +1 -1
  268. package/dist/components/Tooltip/Tooltip.stories.js.map +1 -1
  269. package/dist/components/Tooltip/index.js +1 -1
  270. package/dist/components/VarIndicator/VarIndicator.stories.js +1 -1
  271. package/dist/components/VarIndicator/VarIndicator.stories.js.map +1 -1
  272. package/dist/components/VarIndicator/VarIndicator.test.js +3 -6
  273. package/dist/components/VarIndicator/VarIndicator.test.js.map +1 -1
  274. package/dist/components/WeekSelector/WeekSelector.stories.js.map +1 -1
  275. package/dist/components/index.js +12 -13
  276. package/dist/{components-MNvdQLv1.js → components-BzxAULjf.js} +495 -495
  277. package/dist/components-BzxAULjf.js.map +1 -0
  278. package/dist/{dist-2TKCXdYZ.js → dist-V_v3kC0L.js} +183 -183
  279. package/dist/dist-V_v3kC0L.js.map +1 -0
  280. package/dist/{esm-UNe_gmRA.js → esm-BwHoYxVb.js} +5 -5
  281. package/dist/{esm-UNe_gmRA.js.map → esm-BwHoYxVb.js.map} +1 -1
  282. package/dist/{helpers-BBSxTGRl.js → helpers-B1VK8xTF.js} +7 -7
  283. package/dist/{helpers-BBSxTGRl.js.map → helpers-B1VK8xTF.js.map} +1 -1
  284. package/dist/index.js +12 -13
  285. package/dist/{lib-6BbFZdI7.js → lib-BvOQt8El.js} +2 -2
  286. package/dist/{lib-6BbFZdI7.js.map → lib-BvOQt8El.js.map} +1 -1
  287. package/dist/{react-18-CRbkdI-3.js → react-18-B7MZmX_Z.js} +3 -3
  288. package/dist/{react-18-CRbkdI-3.js.map → react-18-B7MZmX_Z.js.map} +1 -1
  289. package/dist/{react.esm-CzIhAqlo.js → react.esm-D_F72rY1.js} +590 -590
  290. package/dist/react.esm-D_F72rY1.js.map +1 -0
  291. package/dist/setupTests.js +2 -3
  292. package/dist/setupTests.js.map +1 -1
  293. package/dist/storybook__react.d.js +99 -99
  294. package/dist/storybook__react.d.js.map +1 -1
  295. package/dist/{test-DQruvi8i.js → test-Pa9Lwbsq.js} +13 -11
  296. package/dist/test-Pa9Lwbsq.js.map +1 -0
  297. package/dist/{test-utils-BSs0eZfL.js → test-utils-Cmn06m_x.js} +2 -2
  298. package/dist/{test-utils-BSs0eZfL.js.map → test-utils-Cmn06m_x.js.map} +1 -1
  299. package/package.json +30 -30
  300. package/dist/Fieldset-CoNu_Owa.js +0 -23
  301. package/dist/Lexical.prod-DIglXatJ.js.map +0 -1
  302. package/dist/LexicalClipboard.prod-Bnzu0sh_.js +0 -248
  303. package/dist/LexicalClipboard.prod-Bnzu0sh_.js.map +0 -1
  304. package/dist/LexicalExtension.prod-COPHoPpX.js.map +0 -1
  305. package/dist/LexicalLink.prod-Bf9JUdMv.js.map +0 -1
  306. package/dist/LexicalList.prod-DRz8vsM9.js.map +0 -1
  307. package/dist/LexicalTable.prod-D16GW-aZ.js.map +0 -1
  308. package/dist/LexicalUtils.prod-BBTLliac.js +0 -360
  309. package/dist/LexicalUtils.prod-BBTLliac.js.map +0 -1
  310. package/dist/Spinner-D8tWqg9j.js +0 -31
  311. package/dist/chunk-SZQXB3JV-D0XG4Tlp.js.map +0 -1
  312. package/dist/components-MNvdQLv1.js.map +0 -1
  313. package/dist/dist-2TKCXdYZ.js.map +0 -1
  314. package/dist/react.esm-CzIhAqlo.js.map +0 -1
  315. package/dist/test-DQruvi8i.js.map +0 -1
  316. /package/dist/assets/favicon/{android-chrome-192x192.png → src/assets/favicon/android-chrome-192x192.png} +0 -0
  317. /package/dist/assets/favicon/{android-chrome-512x512.png → src/assets/favicon/android-chrome-512x512.png} +0 -0
  318. /package/dist/assets/favicon/{apple-touch-icon.png → src/assets/favicon/apple-touch-icon.png} +0 -0
  319. /package/dist/assets/favicon/{favicon-16x16.png → src/assets/favicon/favicon-16x16.png} +0 -0
  320. /package/dist/assets/favicon/{favicon-32x32.png → src/assets/favicon/favicon-32x32.png} +0 -0
  321. /package/dist/assets/favicon/{favicon.ico → src/assets/favicon/favicon.ico} +0 -0
  322. /package/dist/assets/favicon/{favicon.svg → src/assets/favicon/favicon.svg} +0 -0
  323. /package/dist/assets/favicon/{site.webmanifest → src/assets/favicon/site.webmanifest} +0 -0
  324. /package/dist/assets/fonts/{SourceSans3-Regular.otf.woff → src/assets/fonts/SourceSans3-Regular.otf.woff} +0 -0
  325. /package/dist/assets/fonts/{SourceSans3-Regular.otf.woff2 → src/assets/fonts/SourceSans3-Regular.otf.woff2} +0 -0
  326. /package/dist/assets/fonts/{SourceSans3-Semibold.otf.woff → src/assets/fonts/SourceSans3-Semibold.otf.woff} +0 -0
  327. /package/dist/assets/fonts/{SourceSans3-Semibold.otf.woff2 → src/assets/fonts/SourceSans3-Semibold.otf.woff2} +0 -0
  328. /package/dist/assets/{fonts.css → src/css/fonts.css} +0 -0
  329. /package/dist/assets/{globals.css → src/css/globals.css} +0 -0
  330. /package/dist/assets/{variables.css → src/css/variables.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CourseCataloguePlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n COPY_COMMAND,\r\n KEY_DOWN_COMMAND,\r\n mergeRegister,\r\n} from 'lexical';\r\nimport { $getNearestNodeOfType } from '@lexical/utils';\r\n\r\nimport type { RefObject } from 'react';\r\nimport type { LexicalNode, TextNode } from 'lexical';\r\nimport type { SearchResponse } from './AddCatalogueLinkForm';\r\n\r\nimport { AddCatalogueLinkForm } from './AddCatalogueLinkForm';\r\n\r\nimport styles from 'components/RteEditor/RteEditor.module.css';\r\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\r\nimport {\r\n $getLinkTypeFromNode,\r\n CourseCatalogueNode,\r\n INSERT_COURSE_CATALOGUE_LINK,\r\n REMOVE_COURSE_CATALOGUE_LINK,\r\n} from 'components/RteEditor/nodes/CourseCatalogueNode';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\n\r\ninterface CourseCataloguePluginProps {\r\n onSearch: (query: string, linkType: 'course' | 'programme') => void;\r\n searchResponse: SearchResponse;\r\n parentScrollPosition: number;\r\n}\r\n\r\nexport const CourseCataloguePlugin = ({\r\n onSearch,\r\n searchResponse,\r\n parentScrollPosition,\r\n}: CourseCataloguePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const t = useTranslation();\r\n const [courseIsActive, setCourseIsActive] = useState(false);\r\n const [programmeIsActive, setProgrammeIsActive] = useState(false);\r\n const courseButtonRef = useRef<HTMLButtonElement>(null);\r\n const programmeButtonRef = useRef<HTMLButtonElement>(null);\r\n const flyoutRef = useRef<HTMLDivElement>(null);\r\n const [flyoutPosition, setFlyoutPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [type, setType] = useState<'course' | 'programme'>('course');\r\n const isVisibleRef = useRef(flyoutPosition !== null);\r\n\r\n const openFlyout = (type: 'course' | 'programme') => {\r\n setType(type);\r\n const rect =\r\n type === 'course'\r\n ? courseButtonRef.current?.getBoundingClientRect()\r\n : programmeButtonRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n setFlyoutPosition({ top: rect.bottom, left: rect.left });\r\n }\r\n };\r\n\r\n const closeFlyout = () => {\r\n onSearch('', type);\r\n setFlyoutPosition(null);\r\n };\r\n\r\n useEffect(() => {\r\n const removeKeyboardShortcut = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'C') {\r\n event.preventDefault();\r\n openFlyout('course');\r\n return true;\r\n }\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'P') {\r\n event.preventDefault();\r\n openFlyout('programme');\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n\r\n if (\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode\r\n ) {\r\n // Cursor staat aan het begin van de link!\r\n const courseCatalogueLink = anchorNode.getNextSibling();\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n }\r\n\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n setCourseIsActive(false);\r\n setProgrammeIsActive(false);\r\n }\r\n });\r\n });\r\n\r\n const moveToEndOfWhiteSpace = (whiteSpace: TextNode) => {\r\n const selection = $createRangeSelection();\r\n const endOffset = whiteSpace.getTextContentSize();\r\n selection.setTextNodeRange(whiteSpace, endOffset, whiteSpace, endOffset);\r\n $setSelection(selection);\r\n };\r\n\r\n const isCursorBeforeLink = (anchorNode: LexicalNode, offset: number) =>\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode;\r\n\r\n const removeUnEditable = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const key = event.key;\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n let courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n\r\n // Detect if cursor is right before the link\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink = anchorNode.getNextSibling();\r\n }\r\n\r\n if (!courseCatalogueLink) {\r\n return false;\r\n }\r\n\r\n const nodeLength = courseCatalogueLink?.getTextContentSize();\r\n\r\n // Prevent Enter if in the middle of the link, allow only at start or end\r\n if (courseCatalogueLink && event.key === 'Enter') {\r\n event.preventDefault();\r\n editor.update(() => {\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertBefore(brNode);\r\n }\r\n if (offset === nodeLength) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertAfter(brNode);\r\n moveToEndOfWhiteSpace(brNode);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Allow add space before or after the link\r\n if (courseCatalogueLink && (key === ' ' || event.code === 'Space')) {\r\n event.preventDefault();\r\n editor.update(() => {\r\n const spaceToAdd = $createTextNode(' ');\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink.insertBefore(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n if (offset === nodeLength) {\r\n courseCatalogueLink.insertAfter(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Delete link if selected and Backspace or Del is pressed\r\n if (courseCatalogueLink && (key === 'Backspace' || key === 'Delete')) {\r\n event.preventDefault();\r\n editor.update(\r\n () => {\r\n editor.dispatchCommand(REMOVE_COURSE_CATALOGUE_LINK, undefined);\r\n },\r\n { discrete: true }\r\n );\r\n return true;\r\n }\r\n\r\n // Allow Home, End and Arrow navigation\r\n if (\r\n courseCatalogueLink &&\r\n key !== 'ArrowLeft' &&\r\n key !== 'ArrowRight' &&\r\n key !== 'ArrowUp' &&\r\n key !== 'ArrowDown' &&\r\n key !== 'Home' &&\r\n key !== 'End' &&\r\n !(event.ctrlKey && (key.toLowerCase() === 'z' || key.toLowerCase() === 'y')) &&\r\n !(event.ctrlKey && key.toLowerCase() === 'c')\r\n ) {\r\n event.preventDefault();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeCopy = editor.registerCommand(\r\n COPY_COMMAND,\r\n (event: ClipboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n event.preventDefault();\r\n const domElement = editor.getElementByKey(courseCatalogueLink.getKey());\r\n if (domElement) {\r\n event.clipboardData?.setData('text/html', domElement.outerHTML);\r\n event.clipboardData?.setData('text/plain', courseCatalogueLink.getTextContent());\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n );\r\n return () => {\r\n removeKeyboardShortcut();\r\n removeStatusListener();\r\n removeUnEditable();\r\n removeCopy();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, () => setFlyoutPosition(null));\r\n\r\n const handleOnScroll = () => {\r\n closeFlyout();\r\n };\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && isVisibleRef.current) {\r\n event.preventDefault();\r\n closeFlyout();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('scroll', handleOnScroll);\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.addEventListener('scroll', handleOnScroll);\r\n }\r\n })\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (flyoutPosition) {\r\n closeFlyout();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [parentScrollPosition]);\r\n\r\n return (\r\n <div className={styles['editor__toolbar-button-group']}>\r\n <div className={styles['editor__toolbar-button-flyoutwrapper']}>\r\n <div className={styles['editor__toolbar-button-group--text']}>\r\n <button\r\n onClick={() => openFlyout('course')}\r\n title={t.cataloguelinks.courseTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n courseIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.courselink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.courselink}\r\n type=\"button\"\r\n ref={courseButtonRef}\r\n >\r\n {t.cataloguelinks.courseButtonLabel}\r\n </button>\r\n <button\r\n onClick={() => openFlyout('programme')}\r\n title={t.cataloguelinks.programmeTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n programmeIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.programmelink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.programmelink}\r\n type=\"button\"\r\n ref={programmeButtonRef}\r\n >\r\n {t.cataloguelinks.programmeButtonLabel}\r\n </button>\r\n </div>\r\n {flyoutPosition && (\r\n <div\r\n className={styles['editor__toolbar-flyout-wrapper']}\r\n style={{ top: flyoutPosition.top, left: flyoutPosition.left }}\r\n ref={flyoutRef}\r\n >\r\n <AddCatalogueLinkForm\r\n linkType={type}\r\n onCloseHandler={closeFlyout}\r\n onSearchHandler={onSearch}\r\n searchResponse={searchResponse}\r\n onSelect={(code, label, linkType) => {\r\n editor.dispatchCommand(INSERT_COURSE_CATALOGUE_LINK, {\r\n linkType,\r\n code,\r\n label,\r\n });\r\n closeFlyout();\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"CourseCataloguePlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/CourseCataloguePlugin/CourseCataloguePlugin.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n COPY_COMMAND,\r\n KEY_DOWN_COMMAND,\r\n mergeRegister,\r\n} from 'lexical';\r\nimport { $getNearestNodeOfType } from '@lexical/utils';\r\n\r\nimport type { RefObject } from 'react';\r\nimport type { LexicalNode, TextNode } from 'lexical';\r\nimport type { SearchResponse } from './AddCatalogueLinkForm';\r\n\r\nimport { AddCatalogueLinkForm } from './AddCatalogueLinkForm';\r\n\r\nimport styles from 'components/RteEditor/RteEditor.module.css';\r\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\r\nimport {\r\n $getLinkTypeFromNode,\r\n CourseCatalogueNode,\r\n INSERT_COURSE_CATALOGUE_LINK,\r\n REMOVE_COURSE_CATALOGUE_LINK,\r\n} from 'components/RteEditor/nodes/CourseCatalogueNode';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\n\r\ninterface CourseCataloguePluginProps {\r\n onSearch: (query: string, linkType: 'course' | 'programme') => void;\r\n searchResponse: SearchResponse;\r\n parentScrollPosition: number;\r\n}\r\n\r\nexport const CourseCataloguePlugin = ({\r\n onSearch,\r\n searchResponse,\r\n parentScrollPosition,\r\n}: CourseCataloguePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const t = useTranslation();\r\n const [courseIsActive, setCourseIsActive] = useState(false);\r\n const [programmeIsActive, setProgrammeIsActive] = useState(false);\r\n const courseButtonRef = useRef<HTMLButtonElement>(null);\r\n const programmeButtonRef = useRef<HTMLButtonElement>(null);\r\n const flyoutRef = useRef<HTMLDivElement>(null);\r\n const [flyoutPosition, setFlyoutPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [type, setType] = useState<'course' | 'programme'>('course');\r\n const isVisibleRef = useRef(flyoutPosition !== null);\r\n\r\n const openFlyout = (type: 'course' | 'programme') => {\r\n setType(type);\r\n const rect =\r\n type === 'course'\r\n ? courseButtonRef.current?.getBoundingClientRect()\r\n : programmeButtonRef.current?.getBoundingClientRect();\r\n if (rect) {\r\n setFlyoutPosition({ top: rect.bottom, left: rect.left });\r\n }\r\n };\r\n\r\n const closeFlyout = () => {\r\n onSearch('', type);\r\n setFlyoutPosition(null);\r\n };\r\n\r\n useEffect(() => {\r\n const removeKeyboardShortcut = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'C') {\r\n event.preventDefault();\r\n openFlyout('course');\r\n return true;\r\n }\r\n if (event.ctrlKey && event.shiftKey && event.altKey && event.key === 'P') {\r\n event.preventDefault();\r\n openFlyout('programme');\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n\r\n if (\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode\r\n ) {\r\n // Cursor staat aan het begin van de link!\r\n const courseCatalogueLink = anchorNode.getNextSibling();\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n }\r\n\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n const linkType = $getLinkTypeFromNode(courseCatalogueLink);\r\n setCourseIsActive(linkType === 'course');\r\n setProgrammeIsActive(linkType === 'programme');\r\n return;\r\n }\r\n setCourseIsActive(false);\r\n setProgrammeIsActive(false);\r\n }\r\n });\r\n });\r\n\r\n const moveToEndOfWhiteSpace = (whiteSpace: TextNode) => {\r\n const selection = $createRangeSelection();\r\n const endOffset = whiteSpace.getTextContentSize();\r\n selection.setTextNodeRange(whiteSpace, endOffset, whiteSpace, endOffset);\r\n $setSelection(selection);\r\n };\r\n\r\n const isCursorBeforeLink = (anchorNode: LexicalNode, offset: number) =>\r\n $isTextNode(anchorNode) &&\r\n offset === anchorNode.getTextContentSize() &&\r\n anchorNode.getNextSibling() instanceof CourseCatalogueNode;\r\n\r\n const removeUnEditable = editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const key = event.key;\r\n const anchorNode = selection.anchor.getNode();\r\n const offset = selection.anchor.offset;\r\n let courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n\r\n // Detect if cursor is right before the link\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink = anchorNode.getNextSibling();\r\n }\r\n\r\n if (!courseCatalogueLink) {\r\n return false;\r\n }\r\n\r\n const nodeLength = courseCatalogueLink?.getTextContentSize();\r\n\r\n // Prevent Enter if in the middle of the link, allow only at start or end\r\n if (courseCatalogueLink && event.key === 'Enter') {\r\n event.preventDefault();\r\n editor.update(() => {\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertBefore(brNode);\r\n }\r\n if (offset === nodeLength) {\r\n const brNode = $createTextNode('\\n');\r\n courseCatalogueLink.insertAfter(brNode);\r\n moveToEndOfWhiteSpace(brNode);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Allow add space before or after the link\r\n if (courseCatalogueLink && (key === ' ' || event.code === 'Space')) {\r\n event.preventDefault();\r\n editor.update(() => {\r\n const spaceToAdd = $createTextNode(' ');\r\n if (isCursorBeforeLink(anchorNode, offset)) {\r\n courseCatalogueLink.insertBefore(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n if (offset === nodeLength) {\r\n courseCatalogueLink.insertAfter(spaceToAdd);\r\n moveToEndOfWhiteSpace(spaceToAdd);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n // Delete link if selected and Backspace or Del is pressed\r\n if (courseCatalogueLink && (key === 'Backspace' || key === 'Delete')) {\r\n event.preventDefault();\r\n editor.update(\r\n () => {\r\n editor.dispatchCommand(REMOVE_COURSE_CATALOGUE_LINK, undefined);\r\n },\r\n { discrete: true }\r\n );\r\n return true;\r\n }\r\n\r\n // Allow Home, End and Arrow navigation\r\n if (\r\n courseCatalogueLink &&\r\n key !== 'ArrowLeft' &&\r\n key !== 'ArrowRight' &&\r\n key !== 'ArrowUp' &&\r\n key !== 'ArrowDown' &&\r\n key !== 'Home' &&\r\n key !== 'End' &&\r\n !(event.ctrlKey && (key.toLowerCase() === 'z' || key.toLowerCase() === 'y')) &&\r\n !(event.ctrlKey && key.toLowerCase() === 'c')\r\n ) {\r\n event.preventDefault();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n );\r\n\r\n const removeCopy = editor.registerCommand(\r\n COPY_COMMAND,\r\n (event: ClipboardEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const anchorNode = selection.anchor.getNode();\r\n const courseCatalogueLink = $getNearestNodeOfType(anchorNode, CourseCatalogueNode);\r\n if (courseCatalogueLink) {\r\n event.preventDefault();\r\n const domElement = editor.getElementByKey(courseCatalogueLink.getKey());\r\n if (domElement) {\r\n event.clipboardData?.setData('text/html', domElement.outerHTML);\r\n event.clipboardData?.setData('text/plain', courseCatalogueLink.getTextContent());\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n );\r\n return () => {\r\n removeKeyboardShortcut();\r\n removeStatusListener();\r\n removeUnEditable();\r\n removeCopy();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, () => setFlyoutPosition(null));\r\n\r\n const handleOnScroll = () => {\r\n closeFlyout();\r\n };\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && isVisibleRef.current) {\r\n event.preventDefault();\r\n closeFlyout();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('scroll', handleOnScroll);\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.addEventListener('scroll', handleOnScroll);\r\n }\r\n })\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (flyoutPosition) {\r\n closeFlyout();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [parentScrollPosition]);\r\n\r\n return (\r\n <div className={styles['editor__toolbar-button-group']}>\r\n <div className={styles['editor__toolbar-button-flyoutwrapper']}>\r\n <div className={styles['editor__toolbar-button-group--text']}>\r\n <button\r\n onClick={() => openFlyout('course')}\r\n title={t.cataloguelinks.courseTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n courseIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.courselink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.courselink}\r\n type=\"button\"\r\n ref={courseButtonRef}\r\n >\r\n {t.cataloguelinks.courseButtonLabel}\r\n </button>\r\n <button\r\n onClick={() => openFlyout('programme')}\r\n title={t.cataloguelinks.programmeTooltip}\r\n className={clsx(\r\n styles['editor__toolbar-button'],\r\n styles['editor__toolbar-button--text'],\r\n programmeIsActive && styles[`editor__toolbar-button--active`]\r\n )}\r\n aria-label={t.aria.labels.programmelink}\r\n aria-keyshortcuts={t.aria.keyshortcuts.programmelink}\r\n type=\"button\"\r\n ref={programmeButtonRef}\r\n >\r\n {t.cataloguelinks.programmeButtonLabel}\r\n </button>\r\n </div>\r\n {flyoutPosition && (\r\n <div\r\n className={styles['editor__toolbar-flyout-wrapper']}\r\n style={{ top: flyoutPosition.top, left: flyoutPosition.left }}\r\n ref={flyoutRef}\r\n >\r\n <AddCatalogueLinkForm\r\n linkType={type}\r\n onCloseHandler={closeFlyout}\r\n onSearchHandler={onSearch}\r\n searchResponse={searchResponse}\r\n onSelect={(code, label, linkType) => {\r\n editor.dispatchCommand(INSERT_COURSE_CATALOGUE_LINK, {\r\n linkType,\r\n code,\r\n label,\r\n });\r\n closeFlyout();\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"mappings":";;;;;;;;;;;;AAwCA,IAAa,KAAyB,EACpC,aACA,mBACA,8BACgC;CAChC,IAAM,CAAC,KAAU,GAA2B,EACtC,IAAI,GAAgB,EACpB,CAAC,GAAgB,KAAqB,EAAS,GAAM,EACrD,CAAC,GAAmB,KAAwB,EAAS,GAAM,EAC3D,IAAkB,EAA0B,KAAK,EACjD,IAAqB,EAA0B,KAAK,EACpD,IAAY,EAAuB,KAAK,EACxC,CAAC,GAAgB,KAAqB,EAA+C,KAAK,EAC1F,CAAC,GAAM,KAAW,EAAiC,SAAS,EAC5D,IAAe,EAAO,MAAmB,KAAK,EAE9C,KAAc,MAAiC;AACnD,IAAQ,EAAK;EACb,IAAM,IACJ,MAAS,WACL,EAAgB,SAAS,uBAAuB,GAChD,EAAmB,SAAS,uBAAuB;AACzD,EAAI,KACF,EAAkB;GAAE,KAAK,EAAK;GAAQ,MAAM,EAAK;GAAM,CAAC;IAItD,UAAoB;AAExB,EADA,EAAS,IAAI,EAAK,EAClB,EAAkB,KAAK;;AA2LzB,CAxLA,QAAgB;EACd,IAAM,IAAyB,EAAO,gBACpC,IACC,MACK,EAAM,WAAW,EAAM,YAAY,EAAM,UAAU,EAAM,QAAQ,OACnE,EAAM,gBAAgB,EACtB,EAAW,SAAS,EACb,MAEL,EAAM,WAAW,EAAM,YAAY,EAAM,UAAU,EAAM,QAAQ,OACnE,EAAM,gBAAgB,EACtB,EAAW,YAAY,EAChB,MAEF,MAGV,EAEK,IAAuB,EAAO,wBAAwB,EAAE,qBAAkB;AAC9E,KAAY,WAAW;IACrB,IAAM,IAAY,GAAe;AACjC,QAAI,EAAkB,EAAU,EAAE;KAChC,IAAM,IAAa,EAAU,OAAO,SAAS,EACvC,IAAS,EAAU,OAAO;AAEhC,SACE,EAAY,EAAW,IACvB,MAAW,EAAW,oBAAoB,IAC1C,EAAW,gBAAgB,YAAY,GACvC;MAEA,IAAM,IAAsB,EAAW,gBAAgB;AACvD,UAAI,GAAqB;OACvB,IAAM,IAAW,EAAqB,EAAoB;AAE1D,OADA,EAAkB,MAAa,SAAS,EACxC,EAAqB,MAAa,YAAY;AAC9C;;;KAIJ,IAAM,IAAsB,EAAsB,GAAY,EAAoB;AAClF,SAAI,GAAqB;MACvB,IAAM,IAAW,EAAqB,EAAoB;AAE1D,MADA,EAAkB,MAAa,SAAS,EACxC,EAAqB,MAAa,YAAY;AAC9C;;AAGF,KADA,EAAkB,GAAM,EACxB,EAAqB,GAAM;;KAE7B;IACF,EAEI,KAAyB,MAAyB;GACtD,IAAM,IAAY,GAAuB,EACnC,IAAY,EAAW,oBAAoB;AAEjD,GADA,EAAU,iBAAiB,GAAY,GAAW,GAAY,EAAU,EACxE,EAAc,EAAU;KAGpB,KAAsB,GAAyB,MACnD,EAAY,EAAW,IACvB,MAAW,EAAW,oBAAoB,IAC1C,EAAW,gBAAgB,YAAY,GAEnC,IAAmB,EAAO,gBAC9B,IACC,MAAyB;GACxB,IAAM,IAAY,GAAe;AACjC,OAAI,EAAkB,EAAU,EAAE;IAChC,IAAM,IAAM,EAAM,KACZ,IAAa,EAAU,OAAO,SAAS,EACvC,IAAS,EAAU,OAAO,QAC5B,IAAsB,EAAsB,GAAY,EAAoB;AAOhF,QAJI,EAAmB,GAAY,EAAO,KACxC,IAAsB,EAAW,gBAAgB,GAG/C,CAAC,EACH,QAAO;IAGT,IAAM,IAAa,GAAqB,oBAAoB;AAG5D,QAAI,KAAuB,EAAM,QAAQ,QAavC,QAZA,EAAM,gBAAgB,EACtB,EAAO,aAAa;AAClB,SAAI,EAAmB,GAAY,EAAO,EAAE;MAC1C,IAAM,IAAS,EAAgB,KAAK;AACpC,QAAoB,aAAa,EAAO;;AAE1C,SAAI,MAAW,GAAY;MACzB,IAAM,IAAS,EAAgB,KAAK;AAEpC,MADA,EAAoB,YAAY,EAAO,EACvC,EAAsB,EAAO;;MAE/B,EACK;AAIT,QAAI,MAAwB,MAAQ,OAAO,EAAM,SAAS,SAaxD,QAZA,EAAM,gBAAgB,EACtB,EAAO,aAAa;KAClB,IAAM,IAAa,EAAgB,IAAI;AAKvC,KAJI,EAAmB,GAAY,EAAO,KACxC,EAAoB,aAAa,EAAW,EAC5C,EAAsB,EAAW,GAE/B,MAAW,MACb,EAAoB,YAAY,EAAW,EAC3C,EAAsB,EAAW;MAEnC,EACK;AAIT,QAAI,MAAwB,MAAQ,eAAe,MAAQ,UAQzD,QAPA,EAAM,gBAAgB,EACtB,EAAO,aACC;AACJ,OAAO,gBAAgB,GAA8B,KAAA,EAAU;OAEjE,EAAE,UAAU,IAAM,CACnB,EACM;AAIT,QACE,KACA,MAAQ,eACR,MAAQ,gBACR,MAAQ,aACR,MAAQ,eACR,MAAQ,UACR,MAAQ,SACR,EAAE,EAAM,YAAY,EAAI,aAAa,KAAK,OAAO,EAAI,aAAa,KAAK,SACvE,EAAE,EAAM,WAAW,EAAI,aAAa,KAAK,KAGzC,QADA,EAAM,gBAAgB,EACf;;AAGX,UAAO;OAGV,EAEK,IAAa,EAAO,gBACxB,IACC,MAA0B;GACzB,IAAM,IAAY,GAAe;AACjC,OAAI,EAAkB,EAAU,EAAE;IAEhC,IAAM,IAAsB,EADT,EAAU,OAAO,SACc,EAAY,EAAoB;AAClF,QAAI,GAAqB;AACvB,OAAM,gBAAgB;KACtB,IAAM,IAAa,EAAO,gBAAgB,EAAoB,QAAQ,CAAC;AAKvE,YAJI,MACF,EAAM,eAAe,QAAQ,aAAa,EAAW,UAAU,EAC/D,EAAM,eAAe,QAAQ,cAAc,EAAoB,gBAAgB,CAAC,GAE3E;;;AAGX,UAAO;OAGV;AACD,eAAa;AAIX,GAHA,GAAwB,EACxB,GAAsB,EACtB,GAAkB,EAClB,GAAY;;IAGb,CAAC,EAAO,CAAC,EAEZ,EAAkB,SAA2C,EAAkB,KAAK,CAAC;CAErF,IAAM,UAAuB;AAC3B,KAAa;;AAsCf,QAnCA,QACS,EACL,EAAO,gBACL,IACC,MACK,EAAM,QAAQ,YAAY,EAAa,WACzC,EAAM,gBAAgB,EACtB,GAAa,EACN,MAEF,MAGV,EAED,EAAO,sBAAsB,GAAa,MAAoB;AAK5D,EAJI,KACF,EAAgB,oBAAoB,UAAU,EAAe,EAG3D,KACF,EAAY,iBAAiB,UAAU,EAAe;GAExD,CACH,EAEA,CAAC,EAAO,CAAC,EAEZ,QAAgB;AACd,EAAI,KACF,GAAa;IAGd,CAAC,EAAqB,CAAC,EAGxB,kBAAC,OAAD;EAAK,WAAW,EAAO;YACrB,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB,CACE,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB,CACE,kBAAC,UAAD;KACE,eAAe,EAAW,SAAS;KACnC,OAAO,EAAE,eAAe;KACxB,WAAW,EACT,EAAO,2BACP,EAAO,iCACP,KAAkB,EAAO,kCAC1B;KACD,cAAY,EAAE,KAAK,OAAO;KAC1B,qBAAmB,EAAE,KAAK,aAAa;KACvC,MAAK;KACL,KAAK;eAEJ,EAAE,eAAe;KACX,CAAA,EACT,kBAAC,UAAD;KACE,eAAe,EAAW,YAAY;KACtC,OAAO,EAAE,eAAe;KACxB,WAAW,EACT,EAAO,2BACP,EAAO,iCACP,KAAqB,EAAO,kCAC7B;KACD,cAAY,EAAE,KAAK,OAAO;KAC1B,qBAAmB,EAAE,KAAK,aAAa;KACvC,MAAK;KACL,KAAK;eAEJ,EAAE,eAAe;KACX,CAAA,CACL;OACL,KACC,kBAAC,OAAD;IACE,WAAW,EAAO;IAClB,OAAO;KAAE,KAAK,EAAe;KAAK,MAAM,EAAe;KAAM;IAC7D,KAAK;cAEL,kBAAC,GAAD;KACE,UAAU;KACV,gBAAgB;KAChB,iBAAiB;KACD;KAChB,WAAW,GAAM,GAAO,MAAa;AAMnC,MALA,EAAO,gBAAgB,GAA8B;OACnD;OACA;OACA;OACD,CAAC,EACF,GAAa;;KAEf,CAAA;IACE,CAAA,CAEJ;;EACF,CAAA"}
@@ -1,3 +1,2 @@
1
- import { o as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { o as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as HistoryPlugin };
@@ -1,3 +1,2 @@
1
- import { o as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { o as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as HistoryPlugin };
@@ -1,3 +1,2 @@
1
- import { c as e } from "../../../../../components-MNvdQLv1.js";
2
- import "../../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { c as e } from "../../../../../components-BzxAULjf.js";
3
2
  export { e as AddLinkForm };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../../../LinkContextMenu-m_CGQEiX.js";
1
+ import { t as e } from "../../../../../LinkContextMenu-ePn1iZ_z.js";
2
2
  export { e as LinkContextMenu };
@@ -1,3 +1,2 @@
1
- import { s as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { s as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as LinkPlugin };
@@ -1,2 +1,2 @@
1
- import { i as e, n as t, r as n, t as r } from "../../../../helpers-BBSxTGRl.js";
1
+ import { i as e, n as t, r as n, t as r } from "../../../../helpers-B1VK8xTF.js";
2
2
  export { r as MATCHERS, t as ensureHttps, n as validateUrl, e as validateUrlWithProtocol };
@@ -1,3 +1,2 @@
1
- import { s as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { s as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as LinkPlugin };
@@ -1,10 +1,10 @@
1
1
  import { t as e } from "../../../../clsx-BD2qMUU1.js";
2
2
  import { Icon as t } from "../../../Icon/Icon.js";
3
3
  import { t as n } from "../../../../LexicalComposerContext.prod-Ca-YN_fj.js";
4
- import { Nn as r, _ as i, dt as a, r as o } from "../../../../Lexical.prod-DIglXatJ.js";
5
- import { s } from "../../../../LexicalUtils.prod-BBTLliac.js";
6
- import { a as c, i as l, l as u, n as d, o as f, s as p, u as m } from "../../../../LexicalList.prod-DRz8vsM9.js";
7
- import { t as h } from "../../../../RteEditor.module-Jk80F1FA.js";
4
+ import { g as r, ot as i, v as a, zn as o } from "../../../../Lexical.prod-CqPLSi0R.js";
5
+ import { n as s } from "../../../../LexicalUtils.prod-BqcriFWV.js";
6
+ import { a as c, c as l, i as u, l as d, n as f, o as p, t as m } from "../../../../LexicalList.prod-eYlcb5Ao.js";
7
+ import { t as h } from "../../../../RteEditor.module-BJLUYSpf.js";
8
8
  import { useTranslation as g } from "../../hooks/useTranslation.js";
9
9
  import { useEffect as _, useState as v } from "react";
10
10
  import { jsx as y } from "react/jsx-runtime";
@@ -14,10 +14,10 @@ var b = {
14
14
  number: "NumberedList"
15
15
  }, x = ["bullet", "number"], S = () => {
16
16
  let S = g(), [C] = n(), [w, T] = v(null), [E, D] = v(!1), [O, k] = v(!1), A = (e) => {
17
- e === "number" && w !== "number" ? (C.dispatchCommand(m, void 0), T("number")) : e === "bullet" && w !== "bullet" ? (C.dispatchCommand(c, void 0), T("bullet")) : (C.dispatchCommand(d, void 0), T(null));
17
+ e === "number" && w !== "number" ? (C.dispatchCommand(u, void 0), T("number")) : e === "bullet" && w !== "bullet" ? (C.dispatchCommand(f, void 0), T("bullet")) : (C.dispatchCommand(m, void 0), T(null));
18
18
  };
19
19
  return _(() => {
20
- let e = C.registerCommand(a, (e) => e.ctrlKey && e.shiftKey && e.code === "Digit7" ? (e.preventDefault(), O ? C.dispatchCommand(d, void 0) : C.dispatchCommand(m, void 0), !0) : e.ctrlKey && e.shiftKey && e.code === "Digit8" ? (e.preventDefault(), E ? C.dispatchCommand(d, void 0) : C.dispatchCommand(c, void 0), !0) : !1, 4);
20
+ let e = C.registerCommand(o, (e) => e.ctrlKey && e.shiftKey && e.code === "Digit7" ? (e.preventDefault(), O ? C.dispatchCommand(m, void 0) : C.dispatchCommand(u, void 0), !0) : e.ctrlKey && e.shiftKey && e.code === "Digit8" ? (e.preventDefault(), E ? C.dispatchCommand(m, void 0) : C.dispatchCommand(f, void 0), !0) : !1, 4);
21
21
  return () => {
22
22
  e();
23
23
  };
@@ -26,21 +26,21 @@ var b = {
26
26
  O,
27
27
  E
28
28
  ]), _(() => {
29
- let e = C.registerCommand(i, (e) => (e.preventDefault(), C.update(() => {
30
- let e = o();
31
- if (!r(e)) return;
29
+ let e = C.registerCommand(r, (e) => (e.preventDefault(), C.update(() => {
30
+ let e = i();
31
+ if (!a(e)) return;
32
32
  let t = e.anchor.getNode(), n = t.getParent();
33
- if (!u(n)) return;
34
- let i = n.getParent();
35
- if (l(i)) {
36
- let e = p(l(i) ? i.getListType() : "bullet");
33
+ if (!d(n)) return;
34
+ let r = n.getParent();
35
+ if (c(r)) {
36
+ let e = p(c(r) ? r.getListType() : "bullet");
37
37
  n.append(e), e.append(t);
38
38
  }
39
39
  }), !0), 1), t = C.registerUpdateListener(({ editorState: e }) => {
40
40
  e.read(() => {
41
- let e = o();
42
- if (r(e)) {
43
- let t = s(e.anchor.getNode(), f);
41
+ let e = i();
42
+ if (a(e)) {
43
+ let t = s(e.anchor.getNode(), l);
44
44
  if (t) {
45
45
  let e = t.getTag();
46
46
  D(e === "ul"), k(e === "ol"), e === "ul" && T("bullet"), e === "ol" && T("number");
@@ -1 +1 @@
1
- {"version":3,"file":"ListPlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/ListPlugin/ListPlugin.tsx"],"sourcesContent":["import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $createListNode,\n $isListItemNode,\n $isListNode,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n ListNode,\n REMOVE_LIST_COMMAND,\n} from '@lexical/list';\nimport { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n KEY_DOWN_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical';\nimport { $getNearestNodeOfType } from '@lexical/utils';\n\nimport type { RangeSelection } from 'lexical';\n\nimport { Icon } from 'components/Icon';\nimport styles from 'components/RteEditor/RteEditor.module.css';\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\n\ntype ListTypesType = 'bullet' | 'number' | null;\nconst LIST_TYPE_ICONS = {\n bullet: 'BulletList',\n number: 'NumberedList',\n};\n\nconst ListTypes = ['bullet', 'number'];\n\nexport const ListPlugin = () => {\n const t = useTranslation();\n const [editor] = useLexicalComposerContext();\n const [blockType, setBlockType] = useState<ListTypesType>(null);\n const [isUList, setIsUList] = useState<boolean>(false);\n const [isOList, setIsOList] = useState<boolean>(false);\n\n const formatList = (listType: ListTypesType): void => {\n if (listType === 'number' && blockType !== 'number') {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n setBlockType('number');\n } else if (listType === 'bullet' && blockType !== 'bullet') {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n setBlockType('bullet');\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n setBlockType(null);\n }\n };\n\n useEffect(() => {\n const removeKeyboardShortcut = editor.registerCommand(\n KEY_DOWN_COMMAND,\n (event: KeyboardEvent) => {\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit7') {\n event.preventDefault();\n if (isOList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit8') {\n event.preventDefault();\n if (isUList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n\n return () => {\n removeKeyboardShortcut();\n };\n }, [editor, isOList, isUList]);\n\n useEffect(() => {\n const removeTabCommand = editor.registerCommand(\n KEY_TAB_COMMAND,\n (event) => {\n event.preventDefault();\n editor.update(() => {\n const selection = $getSelection() as RangeSelection;\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const currentNode = selection.anchor.getNode();\n const parent = currentNode.getParent();\n if (!$isListItemNode(parent)) {\n return;\n }\n\n const listParent = parent.getParent();\n if ($isListNode(listParent)) {\n const newList = $createListNode($isListNode(listParent) ? listParent.getListType() : 'bullet');\n parent.append(newList);\n newList.append(currentNode);\n }\n });\n return true;\n },\n COMMAND_PRIORITY_LOW\n );\n\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n const listNode = $getNearestNodeOfType(anchorNode, ListNode);\n if (listNode) {\n const tag = listNode.getTag();\n setIsUList(tag === 'ul');\n setIsOList(tag === 'ol');\n if (tag === 'ul') {\n setBlockType('bullet');\n }\n if (tag === 'ol') {\n setBlockType('number');\n }\n return;\n }\n setIsUList(false);\n setIsOList(false);\n setBlockType(null);\n }\n return false;\n });\n });\n\n return () => {\n removeStatusListener();\n removeTabCommand();\n };\n }, [editor]);\n\n return (\n <div className={styles['editor__toolbar-button-group']}>\n {ListTypes.map((listType) => (\n <button\n onClick={() => formatList(listType as ListTypesType)}\n key={listType}\n title={t.format[`${listType}Tooltip` as keyof typeof t.format]}\n className={clsx(\n styles['editor__toolbar-button'],\n styles[`editor__toolbar-button--${listType}`],\n listType === 'bullet' && isUList && styles['editor__toolbar-button--active'],\n listType === 'number' && isOList && styles['editor__toolbar-button--active']\n )}\n aria-label={t.aria.labels[listType as keyof typeof t.aria.labels]}\n aria-keyshortcuts={t.aria.keyshortcuts[listType as keyof typeof t.aria.keyshortcuts]}\n type=\"button\"\n >\n <Icon name={LIST_TYPE_ICONS[listType as keyof typeof Icon]} size={24} />\n </button>\n ))}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ListPlugin.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/ListPlugin/ListPlugin.tsx"],"sourcesContent":["import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $createListNode,\n $isListItemNode,\n $isListNode,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n ListNode,\n REMOVE_LIST_COMMAND,\n} from '@lexical/list';\nimport { useEffect, useState } from 'react';\nimport { clsx } from 'clsx';\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n KEY_DOWN_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical';\nimport { $getNearestNodeOfType } from '@lexical/utils';\n\nimport type { RangeSelection } from 'lexical';\n\nimport { Icon } from 'components/Icon';\nimport styles from 'components/RteEditor/RteEditor.module.css';\nimport { useTranslation } from 'components/RteEditor/hooks/useTranslation';\n\ntype ListTypesType = 'bullet' | 'number' | null;\nconst LIST_TYPE_ICONS = {\n bullet: 'BulletList',\n number: 'NumberedList',\n};\n\nconst ListTypes = ['bullet', 'number'];\n\nexport const ListPlugin = () => {\n const t = useTranslation();\n const [editor] = useLexicalComposerContext();\n const [blockType, setBlockType] = useState<ListTypesType>(null);\n const [isUList, setIsUList] = useState<boolean>(false);\n const [isOList, setIsOList] = useState<boolean>(false);\n\n const formatList = (listType: ListTypesType): void => {\n if (listType === 'number' && blockType !== 'number') {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n setBlockType('number');\n } else if (listType === 'bullet' && blockType !== 'bullet') {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n setBlockType('bullet');\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n setBlockType(null);\n }\n };\n\n useEffect(() => {\n const removeKeyboardShortcut = editor.registerCommand(\n KEY_DOWN_COMMAND,\n (event: KeyboardEvent) => {\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit7') {\n event.preventDefault();\n if (isOList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n if (event.ctrlKey && event.shiftKey && event.code === 'Digit8') {\n event.preventDefault();\n if (isUList) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n }\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n\n return () => {\n removeKeyboardShortcut();\n };\n }, [editor, isOList, isUList]);\n\n useEffect(() => {\n const removeTabCommand = editor.registerCommand(\n KEY_TAB_COMMAND,\n (event) => {\n event.preventDefault();\n editor.update(() => {\n const selection = $getSelection() as RangeSelection;\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const currentNode = selection.anchor.getNode();\n const parent = currentNode.getParent();\n if (!$isListItemNode(parent)) {\n return;\n }\n\n const listParent = parent.getParent();\n if ($isListNode(listParent)) {\n const newList = $createListNode($isListNode(listParent) ? listParent.getListType() : 'bullet');\n parent.append(newList);\n newList.append(currentNode);\n }\n });\n return true;\n },\n COMMAND_PRIORITY_LOW\n );\n\n const removeStatusListener = editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n const listNode = $getNearestNodeOfType(anchorNode, ListNode);\n if (listNode) {\n const tag = listNode.getTag();\n setIsUList(tag === 'ul');\n setIsOList(tag === 'ol');\n if (tag === 'ul') {\n setBlockType('bullet');\n }\n if (tag === 'ol') {\n setBlockType('number');\n }\n return;\n }\n setIsUList(false);\n setIsOList(false);\n setBlockType(null);\n }\n return false;\n });\n });\n\n return () => {\n removeStatusListener();\n removeTabCommand();\n };\n }, [editor]);\n\n return (\n <div className={styles['editor__toolbar-button-group']}>\n {ListTypes.map((listType) => (\n <button\n onClick={() => formatList(listType as ListTypesType)}\n key={listType}\n title={t.format[`${listType}Tooltip` as keyof typeof t.format]}\n className={clsx(\n styles['editor__toolbar-button'],\n styles[`editor__toolbar-button--${listType}`],\n listType === 'bullet' && isUList && styles['editor__toolbar-button--active'],\n listType === 'number' && isOList && styles['editor__toolbar-button--active']\n )}\n aria-label={t.aria.labels[listType as keyof typeof t.aria.labels]}\n aria-keyshortcuts={t.aria.keyshortcuts[listType as keyof typeof t.aria.keyshortcuts]}\n type=\"button\"\n >\n <Icon name={LIST_TYPE_ICONS[listType as keyof typeof Icon]} size={24} />\n </button>\n ))}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { t as e } from "../../../../PasteHandlerPlugin-BNp8ST0q.js";
2
2
  export { e as PasteHandlerPlugin };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { t as e } from "../../../../PasteHandlerPlugin-BNp8ST0q.js";
2
2
  export { e as PasteHandlerPlugin };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../../TableCellResizerPlugin-CgYsYsuY.js";
1
+ import { t as e } from "../../../../TableCellResizerPlugin-Bc5y-Qbx.js";
2
2
  export { e as TableCellResizerPlugin };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../../TableCellResizerPlugin-CgYsYsuY.js";
1
+ import { t as e } from "../../../../TableCellResizerPlugin-Bc5y-Qbx.js";
2
2
  export { e as TableCellResizerPlugin };
@@ -1,3 +1,2 @@
1
- import { a as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { a as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as AddTableForm };
@@ -1,3 +1,2 @@
1
- import { i as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { i as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as TablePlugin };
@@ -1,50 +1,50 @@
1
- import { St as e } from "../../../../Lexical.prod-DIglXatJ.js";
2
- import { S as t, a as n, d as r, f as i, g as a, h as o, r as s, s as c, t as l, v as u, x as d, y as f } from "../../../../LexicalTable.prod-D16GW-aZ.js";
1
+ import { Gt as e } from "../../../../Lexical.prod-CqPLSi0R.js";
2
+ import { C as t, S as n, _ as r, a as i, d as a, f as o, m as s, t as c, u as l, v as u, x as d, y as f } from "../../../../LexicalTable.prod-DlOxUQou.js";
3
3
  import { TableWrapperNode as p } from "../../nodes/TableWrapperNode/TableWrapperNode.js";
4
4
  //#region src/components/RteEditor/Plugins/TablePlugin/helpers.ts
5
- var m = 32, h = 48, g = 1, _ = 200, v = 320, y = (t, r) => {
6
- let i = n(0, 0, !1);
7
- for (let n = 0; n < t; n++) {
8
- let t = s();
9
- for (let n = 0; n < r; n++) {
5
+ var m = 32, h = 48, g = 1, _ = 200, v = 320, y = (t, n) => {
6
+ let r = s(0, 0, !1);
7
+ for (let i = 0; i < t; i++) {
8
+ let t = l();
9
+ for (let r = 0; r < n; r++) {
10
10
  let n = c(0, void 0, void 0);
11
11
  n.append(e()), t.append(n);
12
12
  }
13
- i.append(t);
13
+ r.append(t);
14
14
  }
15
- return i;
15
+ return r;
16
16
  }, b = (e) => {
17
- let t = i(e), n = t.getNextSibling() || t.getPreviousSibling(), r = t.getParentOrThrow();
18
- if (r.getChildrenSize() > 1 ? t.remove() : r.remove(), n !== null) {
19
- let e = n.getFirstDescendant();
17
+ let t = n(e), r = t.getNextSibling() || t.getPreviousSibling(), i = t.getParentOrThrow();
18
+ if (i.getChildrenSize() > 1 ? t.remove() : i.remove(), r !== null) {
19
+ let e = r.getFirstDescendant();
20
20
  e && e.select();
21
21
  }
22
22
  }, x = (e) => {
23
- let n = t(e);
24
- if (!n) throw Error("Selected node is not a TableCellNode");
25
- let r = n.getParent();
26
- r instanceof p ? r.remove() : n.remove();
23
+ let t = u(e);
24
+ if (!t) throw Error("Selected node is not a TableCellNode");
25
+ let n = t.getParent();
26
+ n instanceof p ? n.remove() : t.remove();
27
27
  }, S = (e, t) => {
28
- if (!l(e)) throw Error("Selected node is not a TableCellNode");
29
- let n = s();
28
+ if (!o(e)) throw Error("Selected node is not a TableCellNode");
29
+ let n = l();
30
30
  d(t === "insertRowBelow");
31
31
  let r = n.getFirstDescendant();
32
32
  r && r.select();
33
- }, C = (e, t) => {
34
- if (!l(e)) throw Error("Selected node is not a TableCellNode");
35
- let n = f(e), i = r(e), o = n.getChildren(), s = a(e), c = u(t === "insertColumnLeft");
36
- if (!c) return;
37
- let d = r(c);
33
+ }, C = (e, n) => {
34
+ if (!o(e)) throw Error("Selected node is not a TableCellNode");
35
+ let r = f(e), s = i(e), c = r.getChildren(), l = a(e), u = t(n === "insertColumnLeft");
36
+ if (!u) return;
37
+ let d = i(u);
38
38
  if (d === -1) return;
39
- let p = n.getColWidths();
39
+ let p = r.getColWidths();
40
40
  if (!p) return;
41
41
  let m = p.map((e, t) => t === d ? 48 : e - Math.ceil(48 / (p.length - 1)));
42
- n.setColWidths(m), i = t === "insertColumnLeft" ? i : i + 1;
43
- let h = o[s].getChildren()[i];
42
+ r.setColWidths(m), s = n === "insertColumnLeft" ? s : s + 1;
43
+ let h = c[l].getChildren()[s];
44
44
  h && h.select();
45
45
  }, w = (e) => {
46
- if (!l(e)) throw Error("Selected node is not a TableCellNode");
47
- (f(e).getFirstChild()?.getChildrenSize() || 0) === 1 ? x(e) : o();
46
+ if (!o(e)) throw Error("Selected node is not a TableCellNode");
47
+ (f(e).getFirstChild()?.getChildrenSize() || 0) === 1 ? x(e) : r();
48
48
  }, T = (e) => {
49
49
  let t = e.getRootElement();
50
50
  if (!t || typeof window > "u") return 0;
@@ -60,7 +60,7 @@ var m = 32, h = 48, g = 1, _ = 200, v = 320, y = (t, r) => {
60
60
  let t = e.getChildren();
61
61
  for (let e of t) {
62
62
  let t = e.getChildren();
63
- for (let e of t) if (l(e) && e.getTextContent().trim().length > 0) return !0;
63
+ for (let e of t) if (o(e) && e.getTextContent().trim().length > 0) return !0;
64
64
  }
65
65
  return !1;
66
66
  };
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/TablePlugin/helpers.ts"],"sourcesContent":["import {\n $createTableNodeWithDimensions,\n $createTableRowNode,\n $createTableCellNode,\n $deleteTableColumnAtSelection,\n $isTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowNodeFromTableCellNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $getTableColumnIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $findTableNode,\n} from '@lexical/table';\nimport { $createParagraphNode } from 'lexical';\n\nimport type { TableCellNode, TableNode, TableRowNode } from '@lexical/table';\nimport type { TextNode, ElementNode, LexicalEditor } from 'lexical';\n\nimport { TableWrapperNode } from 'components/RteEditor/nodes';\n\nexport const MIN_COLUMN_WIDTH = 32;\nexport const DEFAULT_COL_WIDTH = 48;\nexport const BORDER_WIDTHS = 1;\nexport const PREVENT_OPEN_DELAY = 200;\nexport const DEFAULT_EDITOR_WIDTH = 320;\n\nexport const createTable = (nrOfRows: number, nrOfColumns: number): ElementNode => {\n const tableNode = $createTableNodeWithDimensions(0, 0, false);\n for (let rowIndex = 0; rowIndex < nrOfRows; rowIndex++) {\n const rowNode = $createTableRowNode();\n for (let colIndex = 0; colIndex < nrOfColumns; colIndex++) {\n const cellNode = $createTableCellNode(0, undefined, undefined);\n cellNode.append($createParagraphNode());\n rowNode.append(cellNode);\n }\n tableNode.append(rowNode);\n }\n return tableNode;\n};\n\nexport const deleteRow = (selectedNode: ElementNode) => {\n const currentRow = $getTableRowNodeFromTableCellNodeOrThrow(selectedNode);\n const nextRow = currentRow.getNextSibling() || currentRow.getPreviousSibling();\n const currentTable = currentRow.getParentOrThrow();\n currentTable.getChildrenSize() > 1 ? currentRow.remove() : currentTable.remove();\n\n if (nextRow !== null) {\n const firstDescendant = (nextRow as ElementNode).getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n }\n};\n\nexport const deleteTable = (selectedNode: ElementNode) => {\n const tableNode = $findTableNode(selectedNode);\n if (!tableNode) {\n throw new Error('Selected node is not a TableCellNode');\n }\n\n const wrapperNode = tableNode.getParent();\n if (wrapperNode instanceof TableWrapperNode) {\n wrapperNode.remove();\n } else {\n tableNode.remove();\n }\n};\n\nexport const insertRow = (selectedNode: ElementNode, position: 'insertRowAbove' | 'insertRowBelow') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const newRow = $createTableRowNode();\n\n $insertTableRowAtSelection(position === 'insertRowBelow');\n\n const firstDescendant = newRow.getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const insertColumn = (selectedNode: ElementNode, position: 'insertColumnLeft' | 'insertColumnRight') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n let columnIndex = $getTableColumnIndexFromTableCellNode(selectedNode);\n const rowsInTable: TableCellNode[] = currentTable.getChildren();\n const rowIndex = $getTableRowIndexFromTableCellNode(selectedNode);\n const insertedCellNode = $insertTableColumnAtSelection(position === 'insertColumnLeft');\n\n if (!insertedCellNode) return;\n const insertedColumnIndex = $getTableColumnIndexFromTableCellNode(insertedCellNode);\n\n if (insertedColumnIndex === -1) return;\n const colWidths = currentTable.getColWidths();\n\n if (!colWidths) return;\n const newColWidths = colWidths.map((width, index) =>\n index === insertedColumnIndex ? DEFAULT_COL_WIDTH : width - Math.ceil(DEFAULT_COL_WIDTH / (colWidths.length - 1))\n );\n\n currentTable.setColWidths(newColWidths);\n\n columnIndex = position === 'insertColumnLeft' ? columnIndex : columnIndex + 1;\n const firstDescendant = rowsInTable[rowIndex].getChildren()[columnIndex];\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const deleteColumn = (selectedNode: ElementNode) => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n const numberOfColumns = (currentTable.getFirstChild() as ElementNode)?.getChildrenSize() || 0;\n\n if (numberOfColumns === 1) {\n deleteTable(selectedNode);\n } else {\n $deleteTableColumnAtSelection();\n }\n};\n\nexport const getEditorContentWidth = (editor: LexicalEditor): number => {\n const rootEl = editor.getRootElement();\n if (!rootEl || typeof window === 'undefined') return 0;\n const rect = rootEl.getBoundingClientRect();\n const styles = window.getComputedStyle(rootEl);\n const insertX = parseFloat(styles.paddingLeft || '0') + parseFloat(styles.paddingRight || '0') + DEFAULT_COL_WIDTH;\n return Math.max(0, rect.width - insertX);\n};\n\nexport const getEditorParrentCellWidth = (\n node: TableCellNode | null,\n nrOfColumns: number,\n editor: LexicalEditor\n): number => {\n if (!node) return 0;\n\n const cell = editor.getElementByKey(node.getKey());\n if (!cell) return 0;\n\n const computedStyles = window.getComputedStyle(cell);\n return parseInt(computedStyles.width) - nrOfColumns * BORDER_WIDTHS - 1;\n};\n\nexport const tableHasContent = (tableNode: TableNode): boolean => {\n const rows = tableNode.getChildren();\n for (const row of rows) {\n const cells = (row as TableRowNode).getChildren();\n for (const cell of cells) {\n if ($isTableCellNode(cell)) {\n const cellText = cell.getTextContent().trim();\n if (cellText.length > 0) {\n return true;\n }\n }\n }\n }\n return false;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","names":[],"sources":["../../../../../src/components/RteEditor/Plugins/TablePlugin/helpers.ts"],"sourcesContent":["import {\n $createTableNodeWithDimensions,\n $createTableRowNode,\n $createTableCellNode,\n $deleteTableColumnAtSelection,\n $isTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowNodeFromTableCellNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $getTableColumnIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $findTableNode,\n} from '@lexical/table';\nimport { $createParagraphNode } from 'lexical';\n\nimport type { TableCellNode, TableNode, TableRowNode } from '@lexical/table';\nimport type { TextNode, ElementNode, LexicalEditor } from 'lexical';\n\nimport { TableWrapperNode } from 'components/RteEditor/nodes';\n\nexport const MIN_COLUMN_WIDTH = 32;\nexport const DEFAULT_COL_WIDTH = 48;\nexport const BORDER_WIDTHS = 1;\nexport const PREVENT_OPEN_DELAY = 200;\nexport const DEFAULT_EDITOR_WIDTH = 320;\n\nexport const createTable = (nrOfRows: number, nrOfColumns: number): ElementNode => {\n const tableNode = $createTableNodeWithDimensions(0, 0, false);\n for (let rowIndex = 0; rowIndex < nrOfRows; rowIndex++) {\n const rowNode = $createTableRowNode();\n for (let colIndex = 0; colIndex < nrOfColumns; colIndex++) {\n const cellNode = $createTableCellNode(0, undefined, undefined);\n cellNode.append($createParagraphNode());\n rowNode.append(cellNode);\n }\n tableNode.append(rowNode);\n }\n return tableNode;\n};\n\nexport const deleteRow = (selectedNode: ElementNode) => {\n const currentRow = $getTableRowNodeFromTableCellNodeOrThrow(selectedNode);\n const nextRow = currentRow.getNextSibling() || currentRow.getPreviousSibling();\n const currentTable = currentRow.getParentOrThrow();\n currentTable.getChildrenSize() > 1 ? currentRow.remove() : currentTable.remove();\n\n if (nextRow !== null) {\n const firstDescendant = (nextRow as ElementNode).getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n }\n};\n\nexport const deleteTable = (selectedNode: ElementNode) => {\n const tableNode = $findTableNode(selectedNode);\n if (!tableNode) {\n throw new Error('Selected node is not a TableCellNode');\n }\n\n const wrapperNode = tableNode.getParent();\n if (wrapperNode instanceof TableWrapperNode) {\n wrapperNode.remove();\n } else {\n tableNode.remove();\n }\n};\n\nexport const insertRow = (selectedNode: ElementNode, position: 'insertRowAbove' | 'insertRowBelow') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const newRow = $createTableRowNode();\n\n $insertTableRowAtSelection(position === 'insertRowBelow');\n\n const firstDescendant = newRow.getFirstDescendant();\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const insertColumn = (selectedNode: ElementNode, position: 'insertColumnLeft' | 'insertColumnRight') => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n let columnIndex = $getTableColumnIndexFromTableCellNode(selectedNode);\n const rowsInTable: TableCellNode[] = currentTable.getChildren();\n const rowIndex = $getTableRowIndexFromTableCellNode(selectedNode);\n const insertedCellNode = $insertTableColumnAtSelection(position === 'insertColumnLeft');\n\n if (!insertedCellNode) return;\n const insertedColumnIndex = $getTableColumnIndexFromTableCellNode(insertedCellNode);\n\n if (insertedColumnIndex === -1) return;\n const colWidths = currentTable.getColWidths();\n\n if (!colWidths) return;\n const newColWidths = colWidths.map((width, index) =>\n index === insertedColumnIndex ? DEFAULT_COL_WIDTH : width - Math.ceil(DEFAULT_COL_WIDTH / (colWidths.length - 1))\n );\n\n currentTable.setColWidths(newColWidths);\n\n columnIndex = position === 'insertColumnLeft' ? columnIndex : columnIndex + 1;\n const firstDescendant = rowsInTable[rowIndex].getChildren()[columnIndex];\n if (firstDescendant) {\n (firstDescendant as TextNode).select();\n }\n};\n\nexport const deleteColumn = (selectedNode: ElementNode) => {\n if (!$isTableCellNode(selectedNode)) {\n throw new Error('Selected node is not a TableCellNode');\n }\n const currentTable = $getTableNodeFromLexicalNodeOrThrow(selectedNode);\n const numberOfColumns = (currentTable.getFirstChild() as ElementNode)?.getChildrenSize() || 0;\n\n if (numberOfColumns === 1) {\n deleteTable(selectedNode);\n } else {\n $deleteTableColumnAtSelection();\n }\n};\n\nexport const getEditorContentWidth = (editor: LexicalEditor): number => {\n const rootEl = editor.getRootElement();\n if (!rootEl || typeof window === 'undefined') return 0;\n const rect = rootEl.getBoundingClientRect();\n const styles = window.getComputedStyle(rootEl);\n const insertX = parseFloat(styles.paddingLeft || '0') + parseFloat(styles.paddingRight || '0') + DEFAULT_COL_WIDTH;\n return Math.max(0, rect.width - insertX);\n};\n\nexport const getEditorParrentCellWidth = (\n node: TableCellNode | null,\n nrOfColumns: number,\n editor: LexicalEditor\n): number => {\n if (!node) return 0;\n\n const cell = editor.getElementByKey(node.getKey());\n if (!cell) return 0;\n\n const computedStyles = window.getComputedStyle(cell);\n return parseInt(computedStyles.width) - nrOfColumns * BORDER_WIDTHS - 1;\n};\n\nexport const tableHasContent = (tableNode: TableNode): boolean => {\n const rows = tableNode.getChildren();\n for (const row of rows) {\n const cells = (row as TableRowNode).getChildren();\n for (const cell of cells) {\n if ($isTableCellNode(cell)) {\n const cellText = cell.getTextContent().trim();\n if (cellText.length > 0) {\n return true;\n }\n }\n }\n }\n return false;\n};\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { i as e } from "../../../../components-MNvdQLv1.js";
1
+ import { i as e } from "../../../../components-BzxAULjf.js";
2
2
  import { t } from "../../../../TableCellContextMenu-D0IMQr3E.js";
3
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
4
3
  export { t as TableCellContextMenu, e as TablePlugin };
@@ -1,3 +1,2 @@
1
- import { l as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { l as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as ToolBarPlugin };
@@ -1,3 +1,2 @@
1
- import { l as e } from "../../../../components-MNvdQLv1.js";
2
- import "../../../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { l as e } from "../../../../components-BzxAULjf.js";
3
2
  export { e as ToolBarPlugin };
@@ -1,7 +1,7 @@
1
- import { i as e, l as t, o as n, s as r } from "../../../components-MNvdQLv1.js";
2
- import { t as i } from "../../../TableCellResizerPlugin-CgYsYsuY.js";
1
+ import { i as e, l as t, o as n, s as r } from "../../../components-BzxAULjf.js";
2
+ import { t as i } from "../../../TableCellResizerPlugin-Bc5y-Qbx.js";
3
3
  import { BlockFormatPlugin as a } from "./BlockFormatPlugin/BlockFormatPlugin.js";
4
4
  import { ListPlugin as o } from "./ListPlugin/ListPlugin.js";
5
5
  import { t as s } from "../../../TableCellContextMenu-D0IMQr3E.js";
6
- import { t as c } from "../../../PasteHandlerPlugin-DjD1wryY.js";
6
+ import { t as c } from "../../../PasteHandlerPlugin-BNp8ST0q.js";
7
7
  export { a as BlockFormatPlugin, n as HistoryPlugin, r as LinkPlugin, o as ListPlugin, c as PasteHandlerPlugin, s as TableCellContextMenu, i as TableCellResizerPlugin, e as TablePlugin, t as ToolBarPlugin };
@@ -1,3 +1,2 @@
1
- import { n as e, t } from "../../components-MNvdQLv1.js";
2
- import "../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { n as e, t } from "../../components-BzxAULjf.js";
3
2
  export { t as Rte, e as RteEditor };
@@ -1,5 +1,4 @@
1
- import { n as e } from "../../components-MNvdQLv1.js";
2
- import "../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { n as e } from "../../components-BzxAULjf.js";
3
2
  import { t } from "../../Container-BLjtYDqq.js";
4
3
  import "../../storyComponents/Container/index.js";
5
4
  import { MOCK_RTE_CONTENT as n } from "./mockRteContent.js";
@@ -1 +1 @@
1
- {"version":3,"file":"RteEditor.stories.js","names":[],"sources":["../../../src/components/RteEditor/RteEditor.stories.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { PropsWithChildren } from 'react';\nimport type { Meta, StoryFn } from '@storybook/react';\nimport type { RteEditorProps } from './RteEditor';\nimport type { SearchResponse } from './Plugins/CourseCataloguePlugin/AddCatalogueLinkForm';\n\nimport { RteEditor } from './RteEditor';\nimport { MOCK_RTE_CONTENT } from './mockRteContent';\nimport { MOCK_SEARCH_COURSES, MOCK_SEARCH_PROGRAMMES } from './mockCatalogueSearchData';\n\nimport { Container } from 'storyComponents/Container';\n\nconst QUERY_SPEED = 1000; // ms\nconst CHARACTER_THRESHOLD = 3;\n\nconst codeString = `<RteEditor\n editorId=\"editor-id\"\n initialValue=\"\"\n currentLanguage=\"NL\"\n label=\"\"\n info=\"\"\n placeholder=\"\"\n notValidatedText=\"\"\n onChange={handleChange}\n onCatalogueLinkSearch={handleCatalogueLinkSearch}\n catalogueSearchResponse={{ state: 'idle', results: [] }}\n />`;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n title: 'Organisms/RteEditor',\n component: RteEditor,\n parameters: {\n inspectComponent: RteEditor,\n codeString: codeString,\n },\n} as Meta<PropsWithChildren<RteEditorProps>>;\n\nconst Template: StoryFn<PropsWithChildren<RteEditorProps>> = (args) => {\n const [result, setResult] = useState<string>(args.initialValue || '');\n const [catalogueSearchResponse, setCatalogueSearchResponse] = useState<SearchResponse>({\n state: 'idle',\n results: [],\n });\n const networkTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleSearch = (query: string, linkType: 'course' | 'programme') => {\n if (query.length < CHARACTER_THRESHOLD) {\n clearTimeout(networkTimer.current!);\n setCatalogueSearchResponse({ state: 'idle', results: [] });\n return;\n }\n\n if (networkTimer.current !== null) {\n clearTimeout(networkTimer.current);\n }\n\n const lowerCaseQuery = query.toLowerCase();\n if (query.length >= CHARACTER_THRESHOLD) {\n setCatalogueSearchResponse({ state: 'pending', results: [] });\n const mockResults =\n linkType === 'course'\n ? MOCK_SEARCH_COURSES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n )\n : MOCK_SEARCH_PROGRAMMES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n );\n\n networkTimer.current = setTimeout(\n () =>\n setCatalogueSearchResponse({\n state: 'ready',\n results: mockResults,\n }),\n QUERY_SPEED\n );\n }\n };\n\n return (\n <>\n <Container size=\"large-full-height\">\n <RteEditor\n {...args}\n onChange={(evt) => setResult(evt)}\n onCatalogueLinkSearch={handleSearch}\n catalogueSearchResponse={catalogueSearchResponse}\n />\n </Container>\n <br />\n <br />\n\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result}\n </div>\n </>\n );\n};\n\nexport const RteEditorExample = Template.bind({});\n\nRteEditorExample.args = {\n editorId: 'test-editor',\n placeholder: 'Voeg hier tekst in...',\n currentLanguage: 'NL',\n label: 'Studiemateriaal',\n info: \"Studiemateriaal is essentieel voor succesvol leren. Het omvat boeken, artikelen, video's en oefeningen die studenten helpen hun kennis te vergroten, vaardigheden te ontwikkelen en hun studieprestaties te verbeteren.\",\n required: true,\n initialValue: MOCK_RTE_CONTENT,\n};\n\nexport const MultipleRteEditors = () => {\n const [result01, setResult01] = useState<string>(\n 'Students will:<br>• demonstrate digital literacy in an academic context<br>• learn to read and engage with texts from a range of disciplinary perspectives<br>• develop writing and argumentation skills appropriate to different disciplines<br>• learn to recognize and apply different research methodologies<br>• learn how to recognize and practice different genres and modes of academic discourse<br>• develop vocabulary appropriate to an academic environment<br>• improve analytic and critical thinking skills<br>• work independently and as part of a collaborative group<br>• learn to review and critique their own work and that of their peers <br>• improve listening comprehension and develop presentation skills<br>• participate in discussions, workshops and debates'\n );\n const [result02, setResult02] = useState<string>(\n `<p>Editor 2</p>\n <ul>\n <li>nesting</li>\n <li>\n <ol>\n <li>nested 1</li>\n <li>nested 2</li>\n </ol>\n </li>\n <li>nesting 2</li>\n <li>\n <ul>\n <li>deep nested 1</li>\n <li>deep nested 2</li>\n <li>\n <ol>\n <li>deeper nested 1</li>\n <li>\n <ul>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ul>\n </li>\n <li>deeper nested 2</li>\n <li>\n <ol>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ol>\n </li>\n </ol>\n </li>\n </ul>\n </li>\n <li>nesting end</li>\n </ul>`\n );\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n gap: '1rem',\n width: '100%',\n padding: '1rem',\n backgroundColor: '#FFF',\n }}\n >\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result01}\n editorId=\"editor-one\"\n label=\"Editor 1\"\n info=\"Uitleg over editor 1\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult01(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result01}\n </div>\n </div>\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result02}\n editorId=\"editor-two\"\n label=\"Editor 2\"\n info=\"Uitleg over editor 2 wat langer om te kijken of dat ook goed gaat, want je weet maar nooit.\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult02(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result02}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"RteEditor.stories.js","names":[],"sources":["../../../src/components/RteEditor/RteEditor.stories.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { PropsWithChildren } from 'react';\nimport type { Meta, StoryFn } from '@storybook/react';\nimport type { RteEditorProps } from './RteEditor';\nimport type { SearchResponse } from './Plugins/CourseCataloguePlugin/AddCatalogueLinkForm';\n\nimport { RteEditor } from './RteEditor';\nimport { MOCK_RTE_CONTENT } from './mockRteContent';\nimport { MOCK_SEARCH_COURSES, MOCK_SEARCH_PROGRAMMES } from './mockCatalogueSearchData';\n\nimport { Container } from 'storyComponents/Container';\n\nconst QUERY_SPEED = 1000; // ms\nconst CHARACTER_THRESHOLD = 3;\n\nconst codeString = `<RteEditor\n editorId=\"editor-id\"\n initialValue=\"\"\n currentLanguage=\"NL\"\n label=\"\"\n info=\"\"\n placeholder=\"\"\n notValidatedText=\"\"\n onChange={handleChange}\n onCatalogueLinkSearch={handleCatalogueLinkSearch}\n catalogueSearchResponse={{ state: 'idle', results: [] }}\n />`;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n title: 'Organisms/RteEditor',\n component: RteEditor,\n parameters: {\n inspectComponent: RteEditor,\n codeString: codeString,\n },\n} as Meta<PropsWithChildren<RteEditorProps>>;\n\nconst Template: StoryFn<PropsWithChildren<RteEditorProps>> = (args) => {\n const [result, setResult] = useState<string>(args.initialValue || '');\n const [catalogueSearchResponse, setCatalogueSearchResponse] = useState<SearchResponse>({\n state: 'idle',\n results: [],\n });\n const networkTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleSearch = (query: string, linkType: 'course' | 'programme') => {\n if (query.length < CHARACTER_THRESHOLD) {\n clearTimeout(networkTimer.current!);\n setCatalogueSearchResponse({ state: 'idle', results: [] });\n return;\n }\n\n if (networkTimer.current !== null) {\n clearTimeout(networkTimer.current);\n }\n\n const lowerCaseQuery = query.toLowerCase();\n if (query.length >= CHARACTER_THRESHOLD) {\n setCatalogueSearchResponse({ state: 'pending', results: [] });\n const mockResults =\n linkType === 'course'\n ? MOCK_SEARCH_COURSES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n )\n : MOCK_SEARCH_PROGRAMMES.filter(\n (item) =>\n item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\n );\n\n networkTimer.current = setTimeout(\n () =>\n setCatalogueSearchResponse({\n state: 'ready',\n results: mockResults,\n }),\n QUERY_SPEED\n );\n }\n };\n\n return (\n <>\n <Container size=\"large-full-height\">\n <RteEditor\n {...args}\n onChange={(evt) => setResult(evt)}\n onCatalogueLinkSearch={handleSearch}\n catalogueSearchResponse={catalogueSearchResponse}\n />\n </Container>\n <br />\n <br />\n\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result}\n </div>\n </>\n );\n};\n\nexport const RteEditorExample = Template.bind({});\n\nRteEditorExample.args = {\n editorId: 'test-editor',\n placeholder: 'Voeg hier tekst in...',\n currentLanguage: 'NL',\n label: 'Studiemateriaal',\n info: \"Studiemateriaal is essentieel voor succesvol leren. Het omvat boeken, artikelen, video's en oefeningen die studenten helpen hun kennis te vergroten, vaardigheden te ontwikkelen en hun studieprestaties te verbeteren.\",\n required: true,\n initialValue: MOCK_RTE_CONTENT,\n};\n\nexport const MultipleRteEditors = () => {\n const [result01, setResult01] = useState<string>(\n 'Students will:<br>• demonstrate digital literacy in an academic context<br>• learn to read and engage with texts from a range of disciplinary perspectives<br>• develop writing and argumentation skills appropriate to different disciplines<br>• learn to recognize and apply different research methodologies<br>• learn how to recognize and practice different genres and modes of academic discourse<br>• develop vocabulary appropriate to an academic environment<br>• improve analytic and critical thinking skills<br>• work independently and as part of a collaborative group<br>• learn to review and critique their own work and that of their peers <br>• improve listening comprehension and develop presentation skills<br>• participate in discussions, workshops and debates'\n );\n const [result02, setResult02] = useState<string>(\n `<p>Editor 2</p>\n <ul>\n <li>nesting</li>\n <li>\n <ol>\n <li>nested 1</li>\n <li>nested 2</li>\n </ol>\n </li>\n <li>nesting 2</li>\n <li>\n <ul>\n <li>deep nested 1</li>\n <li>deep nested 2</li>\n <li>\n <ol>\n <li>deeper nested 1</li>\n <li>\n <ul>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ul>\n </li>\n <li>deeper nested 2</li>\n <li>\n <ol>\n <li>deepest nested 1</li>\n <li>deepest nested 2</li>\n </ol>\n </li>\n </ol>\n </li>\n </ul>\n </li>\n <li>nesting end</li>\n </ul>`\n );\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n gap: '1rem',\n width: '100%',\n padding: '1rem',\n backgroundColor: '#FFF',\n }}\n >\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result01}\n editorId=\"editor-one\"\n label=\"Editor 1\"\n info=\"Uitleg over editor 1\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult01(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result01}\n </div>\n </div>\n <div style={{ flex: '1' }}>\n <RteEditor\n initialValue={result02}\n editorId=\"editor-two\"\n label=\"Editor 2\"\n info=\"Uitleg over editor 2 wat langer om te kijken of dat ook goed gaat, want je weet maar nooit.\"\n placeholder=\"Voeg hier tekst in...\"\n notValidatedText=\"\"\n onChange={(evt) => setResult02(evt)}\n />\n <br />\n <p style={{ margin: '0', marginTop: '2rem' }}>HTML Output:</p>\n <div\n style={{\n marginTop: '0rem',\n padding: '1rem',\n backgroundColor: '#F9F9F9',\n borderRadius: '0.25rem',\n color: '#666',\n }}\n >\n {result02}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../RteEditor.module-Jk80F1FA.js";
1
+ import { t as e } from "../../../RteEditor.module-BJLUYSpf.js";
2
2
  //#region src/components/RteEditor/UvaTheme/UvaTheme.tsx
3
3
  var t = {
4
4
  ltr: e["guide-text-ltr"],
@@ -1,7 +1,7 @@
1
- import { on as e, yt as t } from "../../Lexical.prod-DIglXatJ.js";
2
- import { c as n, o as r } from "../../LexicalList.prod-DRz8vsM9.js";
3
- import { n as i } from "../../LexicalLink.prod-Bf9JUdMv.js";
4
- import { o as a } from "../../LexicalTable.prod-D16GW-aZ.js";
1
+ import { Zt as e, jt as t } from "../../Lexical.prod-CqPLSi0R.js";
2
+ import { c as n, s as r } from "../../LexicalList.prod-eYlcb5Ao.js";
3
+ import { t as i } from "../../LexicalLink.prod-DMhcqD9x.js";
4
+ import { i as a } from "../../LexicalTable.prod-DlOxUQou.js";
5
5
  import { CourseCatalogueNode as o } from "./nodes/CourseCatalogueNode/CourseCatalogueNode.js";
6
6
  //#region src/components/RteEditor/helpers.ts
7
7
  var s = (e) => {
@@ -14,8 +14,8 @@ var s = (e) => {
14
14
  }, u = new Map([
15
15
  [t, l],
16
16
  [e, l],
17
- [r, l],
18
17
  [n, l],
18
+ [r, l],
19
19
  [a, l],
20
20
  [i, l],
21
21
  [o, l]
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":[],"sources":["../../../src/components/RteEditor/helpers.ts"],"sourcesContent":["import { LinkNode } from '@lexical/link';\nimport { ListNode, ListItemNode } from '@lexical/list';\nimport { ParagraphNode, TextNode } from 'lexical';\nimport { TableCellNode } from '@lexical/table';\n\nimport type { DOMExportOutput, Klass, LexicalEditor, LexicalNode } from 'lexical';\n\nimport { CourseCatalogueNode } from './nodes';\n\nexport const mergeBoldStrongTags = (html: string): string => {\n let mergedHtml = html.replace(/<b><strong>/gi, '<strong>');\n mergedHtml = mergedHtml.replace(/<\\/strong><\\/b>/gi, '</strong>');\n return mergedHtml;\n};\n\nexport const cleanUpTable = (html: string): string =>\n html.replace(/<div[^>]*>\\s*(<table[\\s\\S]*?<\\/table>)\\s*<\\/div>/gi, '$1');\n\nexport const removeStylesExportDOM = (editor: LexicalEditor, target: LexicalNode): DOMExportOutput => {\n const output = target.exportDOM(editor);\n if (output && output.element instanceof HTMLElement) {\n for (const el of [output.element, ...output.element.querySelectorAll('[style],[class],[dir=\"ltr\"]')]) {\n el.removeAttribute('class');\n if (el.getAttribute('style')) {\n el.setAttribute('style', '');\n el.removeAttribute('style');\n }\n if (el.getAttribute('dir') === 'ltr') {\n el.removeAttribute('dir');\n }\n }\n }\n return output;\n};\n\nexport const exportMap = new Map<Klass<LexicalNode>, (editor: LexicalEditor, target: LexicalNode) => DOMExportOutput>([\n [ParagraphNode, removeStylesExportDOM],\n [TextNode, removeStylesExportDOM],\n [ListNode, removeStylesExportDOM],\n [ListItemNode, removeStylesExportDOM],\n [TableCellNode, removeStylesExportDOM],\n [LinkNode, removeStylesExportDOM],\n [CourseCatalogueNode, removeStylesExportDOM],\n]);\n\nexport const setScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.addEventListener('scroll', fn);\n }\n });\n};\n\nexport const removeScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.removeEventListener('scroll', fn);\n }\n });\n};\n"],"mappings":";;;;;;AASA,IAAa,KAAuB,MAAyB;CAC3D,IAAI,IAAa,EAAK,QAAQ,iBAAiB,WAAW;AAE1D,QADA,IAAa,EAAW,QAAQ,qBAAqB,YAAY,EAC1D;GAGI,KAAgB,MAC3B,EAAK,QAAQ,sDAAsD,KAAK,EAE7D,KAAyB,GAAuB,MAAyC;CACpG,IAAM,IAAS,EAAO,UAAU,EAAO;AACvC,KAAI,KAAU,EAAO,mBAAmB,YACtC,MAAK,IAAM,KAAM,CAAC,EAAO,SAAS,GAAG,EAAO,QAAQ,iBAAiB,gCAA8B,CAAC,CAMlG,CALA,EAAG,gBAAgB,QAAQ,EACvB,EAAG,aAAa,QAAQ,KAC1B,EAAG,aAAa,SAAS,GAAG,EAC5B,EAAG,gBAAgB,QAAQ,GAEzB,EAAG,aAAa,MAAM,KAAK,SAC7B,EAAG,gBAAgB,MAAM;AAI/B,QAAO;GAGI,IAAY,IAAI,IAAyF;CACpH,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAc,EAAsB;CACrC,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAqB,EAAsB;CAC7C,CAAC,EAEW,KAA2B,MAA+B;AACxC,UAAS,iBAAiB,IAAI,CACtC,SAAS,MAAc;AAC1C,EAAI,EAAU,eAAe,EAAU,gBACrC,EAAU,iBAAiB,UAAU,EAAG;GAE1C;GAGS,KAA8B,MAA+B;AAC3C,UAAS,iBAAiB,IAAI,CACtC,SAAS,MAAc;AAC1C,EAAI,EAAU,eAAe,EAAU,gBACrC,EAAU,oBAAoB,UAAU,EAAG;GAE7C"}
1
+ {"version":3,"file":"helpers.js","names":[],"sources":["../../../src/components/RteEditor/helpers.ts"],"sourcesContent":["import { LinkNode } from '@lexical/link';\nimport { ListNode, ListItemNode } from '@lexical/list';\nimport { ParagraphNode, TextNode } from 'lexical';\nimport { TableCellNode } from '@lexical/table';\n\nimport type { DOMExportOutput, Klass, LexicalEditor, LexicalNode } from 'lexical';\n\nimport { CourseCatalogueNode } from './nodes';\n\nexport const mergeBoldStrongTags = (html: string): string => {\n let mergedHtml = html.replace(/<b><strong>/gi, '<strong>');\n mergedHtml = mergedHtml.replace(/<\\/strong><\\/b>/gi, '</strong>');\n return mergedHtml;\n};\n\nexport const cleanUpTable = (html: string): string =>\n html.replace(/<div[^>]*>\\s*(<table[\\s\\S]*?<\\/table>)\\s*<\\/div>/gi, '$1');\n\nexport const removeStylesExportDOM = (editor: LexicalEditor, target: LexicalNode): DOMExportOutput => {\n const output = target.exportDOM(editor);\n if (output && output.element instanceof HTMLElement) {\n for (const el of [output.element, ...output.element.querySelectorAll('[style],[class],[dir=\"ltr\"]')]) {\n el.removeAttribute('class');\n if (el.getAttribute('style')) {\n el.setAttribute('style', '');\n el.removeAttribute('style');\n }\n if (el.getAttribute('dir') === 'ltr') {\n el.removeAttribute('dir');\n }\n }\n }\n return output;\n};\n\nexport const exportMap = new Map<Klass<LexicalNode>, (editor: LexicalEditor, target: LexicalNode) => DOMExportOutput>([\n [ParagraphNode, removeStylesExportDOM],\n [TextNode, removeStylesExportDOM],\n [ListNode, removeStylesExportDOM],\n [ListItemNode, removeStylesExportDOM],\n [TableCellNode, removeStylesExportDOM],\n [LinkNode, removeStylesExportDOM],\n [CourseCatalogueNode, removeStylesExportDOM],\n]);\n\nexport const setScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.addEventListener('scroll', fn);\n }\n });\n};\n\nexport const removeScrollableContainers = (fn: (event: Event) => void) => {\n const scrollableContainers = document.querySelectorAll('*');\n scrollableContainers.forEach((container) => {\n if (container.scrollHeight > container.clientHeight) {\n container.removeEventListener('scroll', fn);\n }\n });\n};\n"],"mappings":";;;;;;AASA,IAAa,KAAuB,MAAyB;CAC3D,IAAI,IAAa,EAAK,QAAQ,iBAAiB,WAAW;AAE1D,QADA,IAAa,EAAW,QAAQ,qBAAqB,YAAY,EAC1D;GAGI,KAAgB,MAC3B,EAAK,QAAQ,sDAAsD,KAAK,EAE7D,KAAyB,GAAuB,MAAyC;CACpG,IAAM,IAAS,EAAO,UAAU,EAAO;AACvC,KAAI,KAAU,EAAO,mBAAmB,YACtC,MAAK,IAAM,KAAM,CAAC,EAAO,SAAS,GAAG,EAAO,QAAQ,iBAAiB,gCAA8B,CAAC,CAMlG,CALA,EAAG,gBAAgB,QAAQ,EACvB,EAAG,aAAa,QAAQ,KAC1B,EAAG,aAAa,SAAS,GAAG,EAC5B,EAAG,gBAAgB,QAAQ,GAEzB,EAAG,aAAa,MAAM,KAAK,SAC7B,EAAG,gBAAgB,MAAM;AAI/B,QAAO;GAGI,IAAY,IAAI,IAAyF;CACpH,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAc,EAAsB;CACrC,CAAC,GAAe,EAAsB;CACtC,CAAC,GAAU,EAAsB;CACjC,CAAC,GAAqB,EAAsB;CAC7C,CAAC,EAEW,KAA2B,MAA+B;AACxC,UAAS,iBAAiB,IACvD,CAAqB,SAAS,MAAc;AAC1C,EAAI,EAAU,eAAe,EAAU,gBACrC,EAAU,iBAAiB,UAAU,EAAG;GAE1C;GAGS,KAA8B,MAA+B;AAC3C,UAAS,iBAAiB,IACvD,CAAqB,SAAS,MAAc;AAC1C,EAAI,EAAU,eAAe,EAAU,gBACrC,EAAU,oBAAoB,UAAU,EAAG;GAE7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFlyout.js","names":[],"sources":["../../../../src/components/RteEditor/hooks/useFlyout.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { ReactNode, RefObject } from 'react';\n\nimport { Flyout } from './components/Flyout';\n\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\n\ninterface FlyoutOptions {\n position: { top: number; left: number };\n children?: ReactNode;\n}\n\nexport interface FlyoutHookResult {\n flyout: ReactNode;\n showFlyout: (options: FlyoutOptions) => void;\n hideFlyout: () => void;\n isVisible: boolean;\n}\n\nexport const useFlyout = (): FlyoutHookResult => {\n const flyoutRef = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [options, setOptions] = useState<FlyoutOptions>({\n position: { top: 0, left: 0 },\n children: null,\n });\n\n const showFlyout = (customOptions: FlyoutOptions): void => {\n setVisible(true);\n setOptions({ ...options, ...customOptions });\n };\n\n const hideFlyout = (): void => {\n setVisible(false);\n setOptions({ ...options });\n };\n\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, hideFlyout);\n\n const flyout = (\n <Flyout visible={visible} position={options.position} ref={flyoutRef}>\n {options.children}\n </Flyout>\n );\n\n return {\n flyout,\n showFlyout,\n hideFlyout,\n isVisible: visible,\n };\n};\n"],"mappings":";;;;;AAoBA,IAAa,UAAoC;CAC/C,IAAM,IAAY,EAAuB,KAAK,EACxC,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAS,KAAc,EAAwB;EACpD,UAAU;GAAE,KAAK;GAAG,MAAM;GAAG;EAC7B,UAAU;EACX,CAAC,EAEI,KAAc,MAAuC;AAEzD,EADA,EAAW,GAAK,EAChB,EAAW;GAAE,GAAG;GAAS,GAAG;GAAe,CAAC;IAGxC,UAAyB;AAE7B,EADA,EAAW,GAAM,EACjB,EAAW,EAAE,GAAG,GAAS,CAAC;;AAW5B,QARA,EAAkB,GAAqC,EAAW,EAQ3D;EACL,QANA,kBAAC,GAAD;GAAiB;GAAS,UAAU,EAAQ;GAAU,KAAK;aACxD,EAAQ;GACF,CAAA;EAKT;EACA;EACA,WAAW;EACZ"}
1
+ {"version":3,"file":"useFlyout.js","names":[],"sources":["../../../../src/components/RteEditor/hooks/useFlyout.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\n\nimport type { ReactNode, RefObject } from 'react';\n\nimport { Flyout } from './components/Flyout';\n\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\n\ninterface FlyoutOptions {\n position: { top: number; left: number };\n children?: ReactNode;\n}\n\nexport interface FlyoutHookResult {\n flyout: ReactNode;\n showFlyout: (options: FlyoutOptions) => void;\n hideFlyout: () => void;\n isVisible: boolean;\n}\n\nexport const useFlyout = (): FlyoutHookResult => {\n const flyoutRef = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [options, setOptions] = useState<FlyoutOptions>({\n position: { top: 0, left: 0 },\n children: null,\n });\n\n const showFlyout = (customOptions: FlyoutOptions): void => {\n setVisible(true);\n setOptions({ ...options, ...customOptions });\n };\n\n const hideFlyout = (): void => {\n setVisible(false);\n setOptions({ ...options });\n };\n\n useOnClickOutside(flyoutRef as RefObject<HTMLElement>, hideFlyout);\n\n const flyout = (\n <Flyout visible={visible} position={options.position} ref={flyoutRef}>\n {options.children}\n </Flyout>\n );\n\n return {\n flyout,\n showFlyout,\n hideFlyout,\n isVisible: visible,\n };\n};\n"],"mappings":";;;;;AAoBA,IAAa,UAAoC;CAC/C,IAAM,IAAY,EAAuB,KAAK,EACxC,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAS,KAAc,EAAwB;EACpD,UAAU;GAAE,KAAK;GAAG,MAAM;GAAG;EAC7B,UAAU;EACX,CAAC,EAEI,KAAc,MAAuC;AAEzD,EADA,EAAW,GAAK,EAChB,EAAW;GAAE,GAAG;GAAS,GAAG;GAAe,CAAC;IAGxC,UAAyB;AAE7B,EADA,EAAW,GAAM,EACjB,EAAW,EAAE,GAAG,GAAS,CAAC;;AAW5B,QARA,EAAkB,GAAqC,EAAW,EAQ3D;EACL,QANA,kBAAC,GAAD;GAAiB;GAAS,UAAU,EAAQ;GAAU,KAAK;aACxD,EAAQ;GACF,CAIT;EACA;EACA;EACA,WAAW;EACZ"}
@@ -1,3 +1,2 @@
1
- import { n as e, t } from "../../components-MNvdQLv1.js";
2
- import "../../PasteHandlerPlugin-DjD1wryY.js";
1
+ import { n as e, t } from "../../components-BzxAULjf.js";
3
2
  export { t as Rte, e as RteEditor };