@ckeditor/ckeditor5-table 0.0.0-nightly-next-20260108.0 → 0.0.0-nightly-20260109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/build/table.js +5 -0
  2. package/build/translations/af.js +1 -0
  3. package/build/translations/ar.js +1 -0
  4. package/build/translations/ast.js +1 -0
  5. package/build/translations/az.js +1 -0
  6. package/build/translations/be.js +1 -0
  7. package/build/translations/bg.js +1 -0
  8. package/build/translations/bn.js +1 -0
  9. package/build/translations/bs.js +1 -0
  10. package/build/translations/ca.js +1 -0
  11. package/build/translations/cs.js +1 -0
  12. package/build/translations/da.js +1 -0
  13. package/build/translations/de-ch.js +1 -0
  14. package/build/translations/de.js +1 -0
  15. package/build/translations/el.js +1 -0
  16. package/build/translations/en-au.js +1 -0
  17. package/build/translations/en-gb.js +1 -0
  18. package/build/translations/eo.js +1 -0
  19. package/build/translations/es-co.js +1 -0
  20. package/build/translations/es.js +1 -0
  21. package/build/translations/et.js +1 -0
  22. package/build/translations/eu.js +1 -0
  23. package/build/translations/fa.js +1 -0
  24. package/build/translations/fi.js +1 -0
  25. package/build/translations/fr.js +1 -0
  26. package/build/translations/gl.js +1 -0
  27. package/build/translations/gu.js +1 -0
  28. package/build/translations/he.js +1 -0
  29. package/build/translations/hi.js +1 -0
  30. package/build/translations/hr.js +1 -0
  31. package/build/translations/hu.js +1 -0
  32. package/build/translations/hy.js +1 -0
  33. package/build/translations/id.js +1 -0
  34. package/build/translations/it.js +1 -0
  35. package/build/translations/ja.js +1 -0
  36. package/build/translations/jv.js +1 -0
  37. package/build/translations/kk.js +1 -0
  38. package/build/translations/km.js +1 -0
  39. package/build/translations/kn.js +1 -0
  40. package/build/translations/ko.js +1 -0
  41. package/build/translations/ku.js +1 -0
  42. package/build/translations/lt.js +1 -0
  43. package/build/translations/lv.js +1 -0
  44. package/build/translations/ms.js +1 -0
  45. package/build/translations/nb.js +1 -0
  46. package/build/translations/ne.js +1 -0
  47. package/build/translations/nl.js +1 -0
  48. package/build/translations/no.js +1 -0
  49. package/build/translations/oc.js +1 -0
  50. package/build/translations/pl.js +1 -0
  51. package/build/translations/pt-br.js +1 -0
  52. package/build/translations/pt.js +1 -0
  53. package/build/translations/ro.js +1 -0
  54. package/build/translations/ru.js +1 -0
  55. package/build/translations/si.js +1 -0
  56. package/build/translations/sk.js +1 -0
  57. package/build/translations/sl.js +1 -0
  58. package/build/translations/sq.js +1 -0
  59. package/build/translations/sr-latn.js +1 -0
  60. package/build/translations/sr.js +1 -0
  61. package/build/translations/sv.js +1 -0
  62. package/build/translations/th.js +1 -0
  63. package/build/translations/ti.js +1 -0
  64. package/build/translations/tk.js +1 -0
  65. package/build/translations/tr.js +1 -0
  66. package/build/translations/tt.js +1 -0
  67. package/build/translations/ug.js +1 -0
  68. package/build/translations/uk.js +1 -0
  69. package/build/translations/ur.js +1 -0
  70. package/build/translations/uz.js +1 -0
  71. package/build/translations/vi.js +1 -0
  72. package/build/translations/zh-cn.js +1 -0
  73. package/build/translations/zh.js +1 -0
  74. package/ckeditor5-metadata.json +7 -16
  75. package/dist/index-content.css +30 -30
  76. package/dist/index-editor.css +170 -104
  77. package/dist/index.css +237 -147
  78. package/dist/index.css.map +1 -1
  79. package/dist/index.js +2433 -448
  80. package/dist/index.js.map +1 -1
  81. package/lang/contexts.json +4 -2
  82. package/package.json +35 -25
  83. package/{dist → src}/augmentation.d.ts +15 -4
  84. package/src/augmentation.js +5 -0
  85. package/{dist → src}/commands/insertcolumncommand.d.ts +1 -5
  86. package/src/commands/insertcolumncommand.js +71 -0
  87. package/{dist → src}/commands/insertrowcommand.d.ts +1 -5
  88. package/src/commands/insertrowcommand.js +70 -0
  89. package/{dist → src}/commands/inserttablecommand.d.ts +1 -5
  90. package/src/commands/inserttablecommand.js +69 -0
  91. package/{dist → src}/commands/inserttablelayoutcommand.d.ts +1 -5
  92. package/src/commands/inserttablelayoutcommand.js +65 -0
  93. package/{dist → src}/commands/mergecellcommand.d.ts +3 -7
  94. package/src/commands/mergecellcommand.js +206 -0
  95. package/{dist → src}/commands/mergecellscommand.d.ts +1 -5
  96. package/src/commands/mergecellscommand.js +94 -0
  97. package/{dist → src}/commands/removecolumncommand.d.ts +1 -5
  98. package/src/commands/removecolumncommand.js +109 -0
  99. package/{dist → src}/commands/removerowcommand.d.ts +1 -5
  100. package/src/commands/removerowcommand.js +82 -0
  101. package/{dist → src}/commands/selectcolumncommand.d.ts +1 -5
  102. package/src/commands/selectcolumncommand.js +60 -0
  103. package/{dist → src}/commands/selectrowcommand.d.ts +1 -5
  104. package/src/commands/selectrowcommand.js +56 -0
  105. package/{dist → src}/commands/setheadercolumncommand.d.ts +1 -5
  106. package/src/commands/setheadercolumncommand.js +76 -0
  107. package/{dist → src}/commands/setheaderrowcommand.d.ts +1 -5
  108. package/src/commands/setheaderrowcommand.js +83 -0
  109. package/{dist → src}/commands/splitcellcommand.d.ts +1 -5
  110. package/src/commands/splitcellcommand.js +58 -0
  111. package/{dist → src}/converters/downcast.d.ts +2 -6
  112. package/src/converters/downcast.js +298 -0
  113. package/{dist → src}/converters/table-caption-post-fixer.d.ts +1 -5
  114. package/src/converters/table-caption-post-fixer.js +55 -0
  115. package/{dist → src}/converters/table-cell-paragraph-post-fixer.d.ts +1 -5
  116. package/src/converters/table-cell-paragraph-post-fixer.js +109 -0
  117. package/{dist → src}/converters/table-cell-refresh-handler.d.ts +1 -5
  118. package/src/converters/table-cell-refresh-handler.js +47 -0
  119. package/{dist → src}/converters/table-headings-refresh-handler.d.ts +1 -5
  120. package/src/converters/table-headings-refresh-handler.js +51 -0
  121. package/{dist → src}/converters/table-layout-post-fixer.d.ts +1 -5
  122. package/src/converters/table-layout-post-fixer.js +369 -0
  123. package/{dist → src}/converters/tableproperties.d.ts +2 -6
  124. package/src/converters/tableproperties.js +444 -0
  125. package/{dist → src}/converters/upcasttable.d.ts +1 -5
  126. package/src/converters/upcasttable.js +385 -0
  127. package/{dist → src}/index.d.ts +5 -6
  128. package/src/index.js +98 -0
  129. package/{dist → src}/plaintableoutput.d.ts +1 -5
  130. package/src/plaintableoutput.js +49 -0
  131. package/{dist → src}/table.d.ts +2 -6
  132. package/src/table.js +50 -0
  133. package/{dist → src}/tablecaption/tablecaptionediting.d.ts +2 -6
  134. package/src/tablecaption/tablecaptionediting.js +136 -0
  135. package/{dist → src}/tablecaption/tablecaptionui.d.ts +1 -5
  136. package/src/tablecaption/tablecaptionui.js +64 -0
  137. package/{dist → src}/tablecaption/toggletablecaptioncommand.d.ts +1 -5
  138. package/src/tablecaption/toggletablecaptioncommand.js +105 -0
  139. package/{dist → src}/tablecaption/utils.d.ts +1 -5
  140. package/src/tablecaption/utils.js +61 -0
  141. package/{dist → src}/tablecaption.d.ts +1 -5
  142. package/src/tablecaption.js +34 -0
  143. package/{dist → src}/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts +1 -5
  144. package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js +30 -0
  145. package/{dist → src}/tablecellproperties/commands/tablecellbordercolorcommand.d.ts +2 -6
  146. package/src/tablecellproperties/commands/tablecellbordercolorcommand.js +44 -0
  147. package/{dist → src}/tablecellproperties/commands/tablecellborderstylecommand.d.ts +2 -6
  148. package/src/tablecellproperties/commands/tablecellborderstylecommand.js +44 -0
  149. package/{dist → src}/tablecellproperties/commands/tablecellborderwidthcommand.d.ts +2 -6
  150. package/src/tablecellproperties/commands/tablecellborderwidthcommand.js +64 -0
  151. package/{dist → src}/tablecellproperties/commands/tablecellheightcommand.d.ts +1 -5
  152. package/src/tablecellproperties/commands/tablecellheightcommand.js +51 -0
  153. package/{dist → src}/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts +1 -5
  154. package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js +30 -0
  155. package/{dist → src}/tablecellproperties/commands/tablecellpaddingcommand.d.ts +2 -6
  156. package/src/tablecellproperties/commands/tablecellpaddingcommand.js +64 -0
  157. package/{dist → src}/tablecellproperties/commands/tablecellpropertycommand.d.ts +2 -6
  158. package/src/tablecellproperties/commands/tablecellpropertycommand.js +138 -0
  159. package/{dist → src}/tablecellproperties/commands/tablecelltypecommand.d.ts +6 -6
  160. package/src/tablecellproperties/commands/tablecelltypecommand.js +167 -0
  161. package/{dist → src}/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts +1 -5
  162. package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js +38 -0
  163. package/{dist → src}/tablecellproperties/tablecellpropertiesediting.d.ts +1 -5
  164. package/src/tablecellproperties/tablecellpropertiesediting.js +412 -0
  165. package/{dist → src}/tablecellproperties/tablecellpropertiesui.d.ts +2 -6
  166. package/src/tablecellproperties/tablecellpropertiesui.js +385 -0
  167. package/src/tablecellproperties/tablecellpropertiesuiexperimental.d.ts +128 -0
  168. package/src/tablecellproperties/tablecellpropertiesuiexperimental.js +408 -0
  169. package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +229 -0
  170. package/src/tablecellproperties/ui/tablecellpropertiesview.js +612 -0
  171. package/{dist/tablecellproperties/ui/tablecellpropertiesview.d.ts → src/tablecellproperties/ui/tablecellpropertiesviewexperimental.d.ts} +12 -15
  172. package/src/tablecellproperties/ui/tablecellpropertiesviewexperimental.js +744 -0
  173. package/{dist → src}/tablecellproperties.d.ts +1 -5
  174. package/src/tablecellproperties.js +40 -0
  175. package/{dist → src}/tablecellwidth/commands/tablecellwidthcommand.d.ts +1 -5
  176. package/src/tablecellwidth/commands/tablecellwidthcommand.js +51 -0
  177. package/{dist → src}/tablecellwidth/tablecellwidthediting.d.ts +1 -5
  178. package/src/tablecellwidth/tablecellwidthediting.js +53 -0
  179. package/{dist → src}/tableclipboard.d.ts +3 -7
  180. package/src/tableclipboard.js +500 -0
  181. package/{dist → src}/tablecolumnresize/constants.d.ts +0 -4
  182. package/src/tablecolumnresize/constants.js +33 -0
  183. package/{dist → src}/tablecolumnresize/converters.d.ts +1 -5
  184. package/src/tablecolumnresize/converters.js +62 -0
  185. package/{dist → src}/tablecolumnresize/tablecolumnresizeediting.d.ts +2 -6
  186. package/src/tablecolumnresize/tablecolumnresizeediting.js +729 -0
  187. package/{dist → src}/tablecolumnresize/tablewidthscommand.d.ts +2 -6
  188. package/src/tablecolumnresize/tablewidthscommand.js +61 -0
  189. package/{dist → src}/tablecolumnresize/utils.d.ts +2 -6
  190. package/src/tablecolumnresize/utils.js +370 -0
  191. package/{dist → src}/tablecolumnresize.d.ts +1 -5
  192. package/src/tablecolumnresize.js +36 -0
  193. package/{dist → src}/tableconfig.d.ts +6 -30
  194. package/src/tableconfig.js +5 -0
  195. package/{dist → src}/tableediting.d.ts +2 -6
  196. package/src/tableediting.js +246 -0
  197. package/{dist → src}/tablekeyboard.d.ts +3 -7
  198. package/src/tablekeyboard.js +273 -0
  199. package/{dist → src}/tablelayout/commands/tabletypecommand.d.ts +1 -5
  200. package/src/tablelayout/commands/tabletypecommand.js +68 -0
  201. package/{dist → src}/tablelayout/tablelayoutediting.d.ts +1 -5
  202. package/src/tablelayout/tablelayoutediting.js +295 -0
  203. package/{dist → src}/tablelayout/tablelayoutui.d.ts +1 -5
  204. package/src/tablelayout/tablelayoutui.js +196 -0
  205. package/{dist → src}/tablelayout.d.ts +1 -5
  206. package/src/tablelayout.js +37 -0
  207. package/{dist → src}/tablemouse/mouseeventsobserver.d.ts +1 -5
  208. package/src/tablemouse/mouseeventsobserver.js +34 -0
  209. package/{dist → src}/tablemouse.d.ts +1 -5
  210. package/src/tablemouse.js +178 -0
  211. package/{dist → src}/tableproperties/commands/tablealignmentcommand.d.ts +1 -5
  212. package/src/tableproperties/commands/tablealignmentcommand.js +30 -0
  213. package/{dist → src}/tableproperties/commands/tablebackgroundcolorcommand.d.ts +1 -5
  214. package/src/tableproperties/commands/tablebackgroundcolorcommand.js +30 -0
  215. package/{dist → src}/tableproperties/commands/tablebordercolorcommand.d.ts +2 -6
  216. package/src/tableproperties/commands/tablebordercolorcommand.js +44 -0
  217. package/{dist → src}/tableproperties/commands/tableborderstylecommand.d.ts +2 -6
  218. package/src/tableproperties/commands/tableborderstylecommand.js +44 -0
  219. package/{dist → src}/tableproperties/commands/tableborderwidthcommand.d.ts +2 -6
  220. package/src/tableproperties/commands/tableborderwidthcommand.js +64 -0
  221. package/{dist → src}/tableproperties/commands/tableheightcommand.d.ts +1 -5
  222. package/src/tableproperties/commands/tableheightcommand.js +54 -0
  223. package/{dist → src}/tableproperties/commands/tablepropertycommand.d.ts +2 -6
  224. package/src/tableproperties/commands/tablepropertycommand.js +103 -0
  225. package/{dist → src}/tableproperties/commands/tablewidthcommand.d.ts +1 -5
  226. package/src/tableproperties/commands/tablewidthcommand.js +54 -0
  227. package/{dist → src}/tableproperties/tablepropertiesediting.d.ts +1 -5
  228. package/src/tableproperties/tablepropertiesediting.js +546 -0
  229. package/{dist → src}/tableproperties/tablepropertiesui.d.ts +2 -6
  230. package/src/tableproperties/tablepropertiesui.js +374 -0
  231. package/src/tableproperties/tablepropertiesuiexperimental.d.ts +136 -0
  232. package/src/tableproperties/tablepropertiesuiexperimental.js +375 -0
  233. package/{dist → src}/tableproperties/ui/tablepropertiesview.d.ts +2 -14
  234. package/src/tableproperties/ui/tablepropertiesview.js +520 -0
  235. package/src/tableproperties/ui/tablepropertiesviewexperimental.d.ts +216 -0
  236. package/src/tableproperties/ui/tablepropertiesviewexperimental.js +544 -0
  237. package/{dist → src}/tableproperties.d.ts +1 -5
  238. package/src/tableproperties.js +40 -0
  239. package/{dist → src}/tableselection.d.ts +2 -6
  240. package/src/tableselection.js +323 -0
  241. package/{dist → src}/tabletoolbar.d.ts +2 -6
  242. package/src/tabletoolbar.js +63 -0
  243. package/{dist → src}/tableui.d.ts +1 -5
  244. package/src/tableui.js +335 -0
  245. package/{dist → src}/tableutils.d.ts +2 -6
  246. package/src/tableutils.js +1282 -0
  247. package/{dist → src}/tablewalker.d.ts +1 -5
  248. package/src/tablewalker.js +489 -0
  249. package/{dist → src}/ui/colorinputview.d.ts +2 -6
  250. package/src/ui/colorinputview.js +305 -0
  251. package/{dist → src}/ui/inserttableview.d.ts +2 -6
  252. package/src/ui/inserttableview.js +192 -0
  253. package/{dist → src}/utils/common.d.ts +2 -6
  254. package/src/utils/common.js +118 -0
  255. package/{dist → src}/utils/structure.d.ts +1 -5
  256. package/src/utils/structure.js +452 -0
  257. package/{dist → src}/utils/table-properties.d.ts +1 -5
  258. package/src/utils/table-properties.js +121 -0
  259. package/{dist → src}/utils/ui/contextualballoon.d.ts +2 -6
  260. package/src/utils/ui/contextualballoon.js +111 -0
  261. package/{dist → src}/utils/ui/table-properties.d.ts +2 -6
  262. package/src/utils/ui/table-properties.js +390 -0
  263. package/src/utils/ui/table-propertiesexperimental.d.ts +215 -0
  264. package/src/utils/ui/table-propertiesexperimental.js +391 -0
  265. package/{dist → src}/utils/ui/widget.d.ts +1 -5
  266. package/src/utils/ui/widget.js +56 -0
  267. package/theme/formrow-experimental.css +15 -0
  268. package/theme/formrow.css +0 -2
  269. package/theme/tablecellproperties-experimental.css +4 -0
  270. package/theme/tableform-experimental.css +61 -0
  271. package/theme/tableform.css +5 -1
  272. package/theme/tableproperties-experimental.css +78 -0
  273. package/theme/tableproperties.css +0 -60
  274. package/dist/tablecellproperties/tablecellpropertiesutils.d.ts +0 -22
@@ -0,0 +1,295 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
+ */
5
+ /**
6
+ * @module table/tablelayout/tablelayoutediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { InsertTableLayoutCommand } from './../commands/inserttablelayoutcommand.js';
10
+ import { TableColumnResize } from '../tablecolumnresize.js';
11
+ import { TableTypeCommand } from './commands/tabletypecommand.js';
12
+ import { createEmptyTableCell } from '../utils/common.js';
13
+ import '../../theme/tablelayout.css';
14
+ const TABLE_TYPES = ['content', 'layout'];
15
+ /**
16
+ * The table layout editing plugin.
17
+ */
18
+ export class TableLayoutEditing extends Plugin {
19
+ /**
20
+ * @inheritDoc
21
+ */
22
+ static get pluginName() {
23
+ return 'TableLayoutEditing';
24
+ }
25
+ /**
26
+ * @inheritDoc
27
+ * @internal
28
+ */
29
+ static get licenseFeatureCode() {
30
+ return 'TL';
31
+ }
32
+ /**
33
+ * @inheritDoc
34
+ */
35
+ static get requires() {
36
+ return [TableColumnResize];
37
+ }
38
+ /**
39
+ * @inheritDoc
40
+ */
41
+ static get isOfficialPlugin() {
42
+ return true;
43
+ }
44
+ /**
45
+ * @inheritDoc
46
+ */
47
+ static get isPremiumPlugin() {
48
+ return true;
49
+ }
50
+ /**
51
+ * @inheritDoc
52
+ */
53
+ init() {
54
+ this._defineSchema();
55
+ this._defineConverters();
56
+ this._defineClipboardPasteHandlers();
57
+ this._registerTableTypeAttributePostfixer();
58
+ this.editor.commands.add('insertTableLayout', new InsertTableLayoutCommand(this.editor));
59
+ this.editor.commands.add('tableType', new TableTypeCommand(this.editor));
60
+ }
61
+ /**
62
+ * Defines the schema for the table layout feature.
63
+ */
64
+ _defineSchema() {
65
+ const { schema } = this.editor.model;
66
+ schema.extend('table', {
67
+ allowAttributes: 'tableType'
68
+ });
69
+ // Disallow adding `caption` to layout table.
70
+ schema.addChildCheck(layoutTableCheck, 'caption');
71
+ // Disallow adding `headingRows` attribute to layout table.
72
+ schema.addAttributeCheck(layoutTableCheck, 'headingRows');
73
+ // Disallow adding `headingColumns` attribute to layout table.
74
+ schema.addAttributeCheck(layoutTableCheck, 'headingColumns');
75
+ }
76
+ /**
77
+ * Defines the converters for the table layout feature.
78
+ */
79
+ _defineConverters() {
80
+ const { editor } = this;
81
+ const { conversion } = editor;
82
+ const preferredExternalTableType = editor.config.get('table.tableLayout.preferredExternalTableType');
83
+ conversion.for('upcast').add(upcastLayoutTable(editor, preferredExternalTableType));
84
+ conversion.for('dataDowncast').add(dataDowncastLayoutTable());
85
+ conversion.for('editingDowncast').attributeToAttribute({
86
+ model: {
87
+ key: 'tableType',
88
+ values: ['layout', 'content']
89
+ },
90
+ view: {
91
+ layout: {
92
+ key: 'class',
93
+ value: ['layout-table']
94
+ },
95
+ content: {
96
+ key: 'class',
97
+ value: ['content-table']
98
+ }
99
+ }
100
+ });
101
+ }
102
+ /**
103
+ * Handles the clipboard content insertion events.
104
+ *
105
+ * - If the content is from another editor, do not override the table type.
106
+ * - If the content is from another source, set the table type to 'content'.
107
+ *
108
+ * It handles the scenario when user copies `<table></table>` from Word. We do not want to
109
+ * change the table type to `layout` because it is really `content` table.
110
+ */
111
+ _defineClipboardPasteHandlers() {
112
+ const { plugins } = this.editor;
113
+ if (!plugins.has('ClipboardPipeline')) {
114
+ return;
115
+ }
116
+ const clipboardPipeline = plugins.get('ClipboardPipeline');
117
+ this.listenTo(clipboardPipeline, 'contentInsertion', (evt, data) => {
118
+ // If content is pasted from the other editor, skip overriding table type.
119
+ if (data.sourceEditorId) {
120
+ return;
121
+ }
122
+ // For content from other sources, always set table type to 'content'.
123
+ this.editor.model.change(writer => {
124
+ for (const { item } of writer.createRangeIn(data.content)) {
125
+ if (item.is('element', 'table')) {
126
+ writer.setAttribute('tableType', 'content', item);
127
+ }
128
+ }
129
+ });
130
+ });
131
+ }
132
+ /**
133
+ * Registers a post-fixer that sets the `tableType` attribute to `content` for inserted "default" tables.
134
+ * Also fixes potential issues with the table structure when the `tableType` attribute has been changed.
135
+ */
136
+ _registerTableTypeAttributePostfixer() {
137
+ const editor = this.editor;
138
+ editor.model.document.registerPostFixer((writer) => {
139
+ const changes = editor.model.document.differ.getChanges();
140
+ let hasChanged = false;
141
+ for (const entry of changes) {
142
+ if (entry.type == 'insert' && entry.name != '$text') {
143
+ const element = entry.position.nodeAfter;
144
+ const range = writer.createRangeOn(element);
145
+ for (const item of range.getItems()) {
146
+ if (item.is('element', 'table') && !item.hasAttribute('tableType')) {
147
+ writer.setAttribute('tableType', 'content', item);
148
+ hasChanged = true;
149
+ }
150
+ }
151
+ }
152
+ // Remove disallowed attributes and children for layout tables
153
+ // when `tableType` attribute has been changed by `TableTypeCommand`.
154
+ if (entry.type == 'attribute' && entry.attributeKey == 'tableType') {
155
+ for (const item of entry.range.getItems()) {
156
+ if (item.is('element', 'table')) {
157
+ editor.model.schema.removeDisallowedAttributes([item], writer);
158
+ const tableChildren = item.getChildren();
159
+ // Check if all children are allowed for the new table type.
160
+ for (const child of tableChildren) {
161
+ if (!editor.model.schema.checkChild(item, child)) {
162
+ writer.remove(child);
163
+ hasChanged = true;
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ return hasChanged;
171
+ });
172
+ }
173
+ }
174
+ /**
175
+ * View table element to model table element conversion helper.
176
+ *
177
+ * This conversion helper overrides the default table converter to meet table layout conditions.
178
+ *
179
+ * @param editor Editor instance.
180
+ * @returns Conversion helper.
181
+ */
182
+ function upcastLayoutTable(editor, preferredExternalTableType) {
183
+ return (dispatcher) => {
184
+ dispatcher.on('element:table', (evt, data, conversionApi) => {
185
+ const viewTable = data.viewItem;
186
+ if (!conversionApi.consumable.test(viewTable, { name: true })) {
187
+ return;
188
+ }
189
+ const resolvedTableType = resolveTableType(viewTable, preferredExternalTableType);
190
+ // When an element is a content table, then skip it.
191
+ if (resolvedTableType == 'content') {
192
+ return;
193
+ }
194
+ const table = conversionApi.writer.createElement('table', { tableType: 'layout' });
195
+ if (!conversionApi.safeInsert(table, data.modelCursor)) {
196
+ return;
197
+ }
198
+ conversionApi.consumable.consume(viewTable, { name: true });
199
+ conversionApi.consumable.consume(viewTable, { attributes: ['role'] });
200
+ conversionApi.consumable.consume(viewTable, { classes: ['layout-table'] });
201
+ // Layout tables have no border, so it's equitable to consume the border="0" attribute.
202
+ if (editor.config.get('experimentalFlags.upcastTableBorderZeroAttributes') &&
203
+ viewTable.getAttribute('border') === '0') {
204
+ conversionApi.consumable.consume(viewTable, { attributes: ['border'] });
205
+ }
206
+ // Get all rows from the table and convert them.
207
+ // While looping over the children of `<table>` we can be sure that first will be `<tbody>`
208
+ // and optionally `<thead>` and `<tfoot>`, and in these elements are the table rows found.
209
+ // We can be sure of that because of `DomParser` handle it.
210
+ for (const tableChild of viewTable.getChildren()) {
211
+ if (tableChild.is('element')) {
212
+ for (const row of tableChild.getChildren()) {
213
+ if (row.is('element', 'tr')) {
214
+ conversionApi.convertItem(row, conversionApi.writer.createPositionAt(table, 'end'));
215
+ }
216
+ }
217
+ }
218
+ }
219
+ // Convert everything else.
220
+ conversionApi.convertChildren(viewTable, conversionApi.writer.createPositionAt(table, 'end'));
221
+ // Create one row and one table cell for empty table.
222
+ if (table.isEmpty) {
223
+ const row = conversionApi.writer.createElement('tableRow');
224
+ conversionApi.writer.insert(row, conversionApi.writer.createPositionAt(table, 'end'));
225
+ createEmptyTableCell(conversionApi.writer, conversionApi.writer.createPositionAt(row, 'end'));
226
+ }
227
+ conversionApi.updateConversionResult(table, data);
228
+ }, { priority: 'high' });
229
+ // Sets only the table type attribute.
230
+ dispatcher.on('element:table', (evt, data, conversionApi) => {
231
+ const { viewItem, modelRange } = data;
232
+ if (modelRange) {
233
+ conversionApi.writer.setAttribute('tableType', resolveTableType(viewItem, preferredExternalTableType), modelRange);
234
+ conversionApi.consumable.consume(viewItem, { classes: ['layout-table'] });
235
+ conversionApi.consumable.consume(viewItem, { classes: ['content-table'] });
236
+ }
237
+ }, { priority: 'low' });
238
+ };
239
+ }
240
+ /**
241
+ * Model table container element to view table element conversion helper.
242
+ *
243
+ * @returns Conversion helper.
244
+ */
245
+ function dataDowncastLayoutTable() {
246
+ return (dispatcher) => {
247
+ return dispatcher.on('attribute:tableType:table', (evt, data, conversionApi) => {
248
+ const { item, attributeNewValue } = data;
249
+ const { mapper, writer } = conversionApi;
250
+ if (!conversionApi.consumable.test(item, evt.name)) {
251
+ return;
252
+ }
253
+ const table = mapper.toViewElement(item);
254
+ writer.addClass(`${attributeNewValue}-table`, table);
255
+ if (attributeNewValue == 'layout') {
256
+ writer.setAttribute('role', 'presentation', table);
257
+ }
258
+ conversionApi.consumable.consume(item, evt.name);
259
+ });
260
+ };
261
+ }
262
+ /**
263
+ * Resolves the table type based on the view table element and the preferred external table type.
264
+ */
265
+ function resolveTableType(viewTable, preferredExternalTableType) {
266
+ if (viewTable.hasClass('content-table')) {
267
+ return 'content';
268
+ }
269
+ if (viewTable.hasClass('layout-table')) {
270
+ return 'layout';
271
+ }
272
+ if (preferredExternalTableType && TABLE_TYPES.includes(preferredExternalTableType)) {
273
+ return preferredExternalTableType;
274
+ }
275
+ const parent = viewTable.parent;
276
+ /**
277
+ * Checks if the table is a content table if any of the following conditions are met:
278
+ * - the `<table>` is wrapped with `<figure>`,
279
+ * - the `<table>` has a `<caption>` element.
280
+ */
281
+ if (parent.is('element', 'figure') ||
282
+ Array.from(viewTable.getChildren()).some(child => child.is('element', 'caption'))) {
283
+ return 'content';
284
+ }
285
+ return 'layout';
286
+ }
287
+ /**
288
+ * Checks if the element is a layout table.
289
+ * It is used to disallow attributes or children that is managed by `Schema`.
290
+ */
291
+ function layoutTableCheck(context) {
292
+ if (context.endsWith('table') && context.last.getAttribute('tableType') == 'layout') {
293
+ return false;
294
+ }
295
+ }
@@ -1,7 +1,3 @@
1
- /**
2
- * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
1
  /**
6
2
  * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
7
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
@@ -9,7 +5,7 @@
9
5
  /**
10
6
  * @module table/tablelayout/tablelayoutui
11
7
  */
12
- import { Plugin } from '@ckeditor/ckeditor5-core';
8
+ import { Plugin } from 'ckeditor5/src/core.js';
13
9
  /**
14
10
  * The table layout UI plugin. It introduces:
15
11
  *
@@ -0,0 +1,196 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
+ */
5
+ /**
6
+ * @module table/tablelayout/tablelayoutui
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { IconTableLayout, IconTableProperties } from 'ckeditor5/src/icons.js';
10
+ import { createDropdown, addListToDropdown, MenuBarMenuView, SplitButtonView, DropdownButtonView, UIModel } from 'ckeditor5/src/ui.js';
11
+ import { Collection } from 'ckeditor5/src/utils.js';
12
+ import { InsertTableView } from '../ui/inserttableview.js';
13
+ /**
14
+ * The table layout UI plugin. It introduces:
15
+ *
16
+ * * The `'insertTableLayout'` dropdown,
17
+ * * The `'menuBar:insertTableLayout'` menu bar menu.
18
+ */
19
+ export class TableLayoutUI extends Plugin {
20
+ /**
21
+ * @inheritDoc
22
+ */
23
+ static get pluginName() {
24
+ return 'TableLayoutUI';
25
+ }
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get isOfficialPlugin() {
30
+ return true;
31
+ }
32
+ /**
33
+ * @inheritDoc
34
+ */
35
+ init() {
36
+ const editor = this.editor;
37
+ const t = this.editor.t;
38
+ editor.ui.componentFactory.add('insertTableLayout', locale => {
39
+ const command = editor.commands.get('insertTableLayout');
40
+ const dropdownView = createDropdown(locale);
41
+ dropdownView.bind('isEnabled').to(command);
42
+ // Decorate dropdown's button.
43
+ dropdownView.buttonView.set({
44
+ icon: IconTableLayout,
45
+ label: t('Insert table layout'),
46
+ tooltip: true
47
+ });
48
+ let insertTableLayoutView;
49
+ dropdownView.on('change:isOpen', () => {
50
+ if (insertTableLayoutView) {
51
+ return;
52
+ }
53
+ // Prepare custom view for dropdown's panel.
54
+ insertTableLayoutView = new InsertTableView(locale);
55
+ dropdownView.panelView.children.add(insertTableLayoutView);
56
+ insertTableLayoutView.delegate('execute').to(dropdownView);
57
+ dropdownView.on('execute', () => {
58
+ editor.execute('insertTableLayout', {
59
+ rows: insertTableLayoutView.rows,
60
+ columns: insertTableLayoutView.columns
61
+ });
62
+ editor.editing.view.focus();
63
+ });
64
+ });
65
+ return dropdownView;
66
+ });
67
+ editor.ui.componentFactory.add('menuBar:insertTableLayout', locale => {
68
+ const command = editor.commands.get('insertTableLayout');
69
+ const menuView = new MenuBarMenuView(locale);
70
+ const insertTableLayoutView = new InsertTableView(locale);
71
+ insertTableLayoutView.delegate('execute').to(menuView);
72
+ menuView.on('change:isOpen', (event, name, isOpen) => {
73
+ if (!isOpen) {
74
+ insertTableLayoutView.reset();
75
+ }
76
+ });
77
+ insertTableLayoutView.on('execute', () => {
78
+ editor.execute('insertTableLayout', {
79
+ rows: insertTableLayoutView.rows,
80
+ columns: insertTableLayoutView.columns
81
+ });
82
+ editor.editing.view.focus();
83
+ });
84
+ menuView.buttonView.set({
85
+ label: t('Table layout'),
86
+ icon: IconTableLayout
87
+ });
88
+ menuView.panelView.children.add(insertTableLayoutView);
89
+ menuView.bind('isEnabled').to(command);
90
+ return menuView;
91
+ });
92
+ // Create table type dropdown button.
93
+ editor.ui.componentFactory.add('tableType', () => {
94
+ const editor = this.editor;
95
+ const t = editor.t;
96
+ const button = new DropdownButtonView(editor.locale);
97
+ button.set({
98
+ label: t('Table type'),
99
+ icon: IconTableProperties,
100
+ tooltip: true
101
+ });
102
+ return createTableTypeDropdown(editor, button);
103
+ });
104
+ }
105
+ /**
106
+ * @inheritDoc
107
+ */
108
+ afterInit() {
109
+ const { editor } = this;
110
+ const { ui, plugins } = editor;
111
+ let tablePropertiesUI;
112
+ if (plugins.has('TablePropertiesUIExperimental')) {
113
+ tablePropertiesUI = plugins.get('TablePropertiesUIExperimental');
114
+ }
115
+ else if (plugins.has('TablePropertiesUI')) {
116
+ tablePropertiesUI = plugins.get('TablePropertiesUI');
117
+ }
118
+ else {
119
+ return;
120
+ }
121
+ // Override the default table properties button to include the table type dropdown.
122
+ // It needs to be done in `afterInit()` to make sure that `tableProperties` button is
123
+ // registered after the initialization of the `TablePropertiesUI`. Otherwise, the
124
+ // button will be overridden by the default one if the `TablePropertiesUI` is
125
+ // initialized after the `TableLayoutUI`.
126
+ ui.componentFactory.add('tableProperties', locale => {
127
+ const baseButton = tablePropertiesUI._createTablePropertiesButton();
128
+ const splitButtonView = new SplitButtonView(locale, baseButton);
129
+ return createTableTypeDropdown(editor, splitButtonView);
130
+ });
131
+ }
132
+ }
133
+ /**
134
+ * Creates a dropdown for the table type selection.
135
+ *
136
+ * @param editor The editor instance.
137
+ * @param dropdownButton The button view that will be used as the dropdown trigger.
138
+ * @returns A dropdown view containing table type options.
139
+ */
140
+ function createTableTypeDropdown(editor, dropdownButton) {
141
+ const t = editor.t;
142
+ const locale = editor.locale;
143
+ const tableTypeCommand = editor.commands.get('tableType');
144
+ // Wrap the original button in a SplitButtonView.
145
+ const dropdownView = createDropdown(locale, dropdownButton);
146
+ const itemsDefinitions = createTableLayoutTypeDropdownItems(editor);
147
+ // Add table types to the dropdown.
148
+ addListToDropdown(dropdownView, itemsDefinitions, {
149
+ ariaLabel: t('Table type options'),
150
+ role: 'menu'
151
+ });
152
+ dropdownButton.tooltip = t('Choose table type');
153
+ dropdownView.on('execute', evt => {
154
+ const tableType = evt.source.tableType;
155
+ if (tableType) {
156
+ tableTypeCommand.execute(tableType);
157
+ }
158
+ });
159
+ return dropdownView;
160
+ }
161
+ /**
162
+ * Creates dropdown items for table type selection.
163
+ *
164
+ * @param editor The editor instance.
165
+ * @returns A collection of dropdown items for the table type dropdown.
166
+ */
167
+ function createTableLayoutTypeDropdownItems(editor) {
168
+ const t = editor.t;
169
+ const tableTypeCommand = editor.commands.get('tableType');
170
+ const itemDefinitions = new Collection();
171
+ itemDefinitions.add(createTableTypeDropdownItem(tableTypeCommand, 'layout', t('Layout table')));
172
+ itemDefinitions.add(createTableTypeDropdownItem(tableTypeCommand, 'content', t('Content table')));
173
+ return itemDefinitions;
174
+ }
175
+ /**
176
+ * Creates a dropdown item for a specific table type.
177
+ *
178
+ * @param tableTypeCommand The table type command.
179
+ * @param type The table type value ('layout' or 'content').
180
+ * @param label The localized label for the dropdown item.
181
+ * @returns The dropdown item definition.
182
+ */
183
+ function createTableTypeDropdownItem(tableTypeCommand, type, label) {
184
+ const model = new UIModel({
185
+ label,
186
+ role: 'menuitemradio',
187
+ withText: true,
188
+ tableType: type
189
+ });
190
+ model.bind('isEnabled').to(tableTypeCommand, 'isEnabled');
191
+ model.bind('isOn').to(tableTypeCommand, 'value', value => value === type);
192
+ return {
193
+ type: 'button',
194
+ model
195
+ };
196
+ }
@@ -1,7 +1,3 @@
1
- /**
2
- * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
1
  /**
6
2
  * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
7
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
@@ -9,7 +5,7 @@
9
5
  /**
10
6
  * @module table/tablelayout
11
7
  */
12
- import { Plugin } from '@ckeditor/ckeditor5-core';
8
+ import { Plugin } from 'ckeditor5/src/core.js';
13
9
  import { TableLayoutUI } from './tablelayout/tablelayoutui.js';
14
10
  import { TableLayoutEditing } from './tablelayout/tablelayoutediting.js';
15
11
  import { PlainTableOutput } from './plaintableoutput.js';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
+ */
5
+ /**
6
+ * @module table/tablelayout
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { TableLayoutUI } from './tablelayout/tablelayoutui.js';
10
+ import { TableLayoutEditing } from './tablelayout/tablelayoutediting.js';
11
+ import { PlainTableOutput } from './plaintableoutput.js';
12
+ import { TableColumnResize } from './tablecolumnresize.js';
13
+ /**
14
+ * The table plugin.
15
+ *
16
+ * For a detailed overview, check the {@glink features/tables/layout-tables Layout table feature documentation}.
17
+ */
18
+ export class TableLayout extends Plugin {
19
+ /**
20
+ * @inheritDoc
21
+ */
22
+ static get pluginName() {
23
+ return 'TableLayout';
24
+ }
25
+ /**
26
+ * @inheritDoc
27
+ */
28
+ static get isOfficialPlugin() {
29
+ return true;
30
+ }
31
+ /**
32
+ * @inheritDoc
33
+ */
34
+ static get requires() {
35
+ return [PlainTableOutput, TableColumnResize, TableLayoutEditing, TableLayoutUI];
36
+ }
37
+ }
@@ -1,7 +1,3 @@
1
- /**
2
- * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
1
  /**
6
2
  * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
7
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
@@ -9,7 +5,7 @@
9
5
  /**
10
6
  * @module table/tablemouse/mouseeventsobserver
11
7
  */
12
- import { DomEventObserver, type ViewDocumentDomEventData } from '@ckeditor/ckeditor5-engine';
8
+ import { DomEventObserver, type ViewDocumentDomEventData } from 'ckeditor5/src/engine.js';
13
9
  /**
14
10
  * The mouse selection event observer.
15
11
  *
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
+ */
5
+ /**
6
+ * @module table/tablemouse/mouseeventsobserver
7
+ */
8
+ import { DomEventObserver } from 'ckeditor5/src/engine.js';
9
+ /**
10
+ * The mouse selection event observer.
11
+ *
12
+ * It registers listeners for the following DOM events:
13
+ *
14
+ * - `'mousemove'`
15
+ * - `'mouseleave'`
16
+ *
17
+ * Note that this observer is disabled by default. To enable this observer, it needs to be added to
18
+ * {@link module:engine/view/view~EditingView} using the {@link module:engine/view/view~EditingView#addObserver} method.
19
+ *
20
+ * The observer is registered by the {@link module:table/tableselection~TableSelection} plugin.
21
+ *
22
+ * @internal
23
+ */
24
+ export class MouseEventsObserver extends DomEventObserver {
25
+ domEventType = [
26
+ 'mousemove', 'mouseleave'
27
+ ];
28
+ /**
29
+ * @inheritDoc
30
+ */
31
+ onDomEvent(domEvent) {
32
+ this.fire(domEvent.type, domEvent);
33
+ }
34
+ }
@@ -1,7 +1,3 @@
1
- /**
2
- * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
1
  /**
6
2
  * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
7
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
@@ -9,7 +5,7 @@
9
5
  /**
10
6
  * @module table/tablemouse
11
7
  */
12
- import { Plugin } from '@ckeditor/ckeditor5-core';
8
+ import { Plugin } from 'ckeditor5/src/core.js';
13
9
  import { TableSelection } from './tableselection.js';
14
10
  import { TableUtils } from './tableutils.js';
15
11
  /**