@ckeditor/ckeditor5-list 0.0.0-internal-20241017.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 (505) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/LICENSE.md +17 -0
  3. package/README.md +26 -0
  4. package/build/list.js +5 -0
  5. package/build/translations/ar.js +1 -0
  6. package/build/translations/ast.js +1 -0
  7. package/build/translations/az.js +1 -0
  8. package/build/translations/bg.js +1 -0
  9. package/build/translations/bn.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.js +1 -0
  20. package/build/translations/et.js +1 -0
  21. package/build/translations/eu.js +1 -0
  22. package/build/translations/fa.js +1 -0
  23. package/build/translations/fi.js +1 -0
  24. package/build/translations/fr.js +1 -0
  25. package/build/translations/gl.js +1 -0
  26. package/build/translations/he.js +1 -0
  27. package/build/translations/hi.js +1 -0
  28. package/build/translations/hr.js +1 -0
  29. package/build/translations/hu.js +1 -0
  30. package/build/translations/id.js +1 -0
  31. package/build/translations/it.js +1 -0
  32. package/build/translations/ja.js +1 -0
  33. package/build/translations/jv.js +1 -0
  34. package/build/translations/km.js +1 -0
  35. package/build/translations/kn.js +1 -0
  36. package/build/translations/ko.js +1 -0
  37. package/build/translations/ku.js +1 -0
  38. package/build/translations/lt.js +1 -0
  39. package/build/translations/lv.js +1 -0
  40. package/build/translations/ms.js +1 -0
  41. package/build/translations/nb.js +1 -0
  42. package/build/translations/ne.js +1 -0
  43. package/build/translations/nl.js +1 -0
  44. package/build/translations/no.js +1 -0
  45. package/build/translations/pl.js +1 -0
  46. package/build/translations/pt-br.js +1 -0
  47. package/build/translations/pt.js +1 -0
  48. package/build/translations/ro.js +1 -0
  49. package/build/translations/ru.js +1 -0
  50. package/build/translations/si.js +1 -0
  51. package/build/translations/sk.js +1 -0
  52. package/build/translations/sq.js +1 -0
  53. package/build/translations/sr-latn.js +1 -0
  54. package/build/translations/sr.js +1 -0
  55. package/build/translations/sv.js +1 -0
  56. package/build/translations/th.js +1 -0
  57. package/build/translations/ti.js +1 -0
  58. package/build/translations/tk.js +1 -0
  59. package/build/translations/tr.js +1 -0
  60. package/build/translations/tt.js +1 -0
  61. package/build/translations/ug.js +1 -0
  62. package/build/translations/uk.js +1 -0
  63. package/build/translations/ur.js +1 -0
  64. package/build/translations/uz.js +1 -0
  65. package/build/translations/vi.js +1 -0
  66. package/build/translations/zh-cn.js +1 -0
  67. package/build/translations/zh.js +1 -0
  68. package/ckeditor5-metadata.json +193 -0
  69. package/dist/augmentation.d.ts +57 -0
  70. package/dist/documentlist.d.ts +36 -0
  71. package/dist/documentlistproperties.d.ts +36 -0
  72. package/dist/index-content.css +116 -0
  73. package/dist/index-editor.css +82 -0
  74. package/dist/index.css +238 -0
  75. package/dist/index.css.map +1 -0
  76. package/dist/index.d.ts +49 -0
  77. package/dist/index.js +7994 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/legacylist/legacyconverters.d.ts +200 -0
  80. package/dist/legacylist/legacyindentcommand.d.ts +41 -0
  81. package/dist/legacylist/legacylistcommand.d.ts +60 -0
  82. package/dist/legacylist/legacylistediting.d.ts +40 -0
  83. package/dist/legacylist/legacylistutils.d.ts +49 -0
  84. package/dist/legacylist/legacyutils.d.ts +105 -0
  85. package/dist/legacylist.d.ts +34 -0
  86. package/dist/legacylistproperties/legacylistpropertiesediting.d.ts +80 -0
  87. package/dist/legacylistproperties/legacylistreversedcommand.d.ts +42 -0
  88. package/dist/legacylistproperties/legacyliststartcommand.d.ts +41 -0
  89. package/dist/legacylistproperties/legacyliststylecommand.d.ts +71 -0
  90. package/dist/legacylistproperties.d.ts +35 -0
  91. package/dist/legacytodolist/legacychecktodolistcommand.d.ts +56 -0
  92. package/dist/legacytodolist/legacytodolistconverters.d.ts +87 -0
  93. package/dist/legacytodolist/legacytodolistediting.d.ts +54 -0
  94. package/dist/legacytodolist.d.ts +35 -0
  95. package/dist/list/adjacentlistssupport.d.ts +23 -0
  96. package/dist/list/converters.d.ts +69 -0
  97. package/dist/list/listcommand.d.ts +96 -0
  98. package/dist/list/listediting.d.ts +230 -0
  99. package/dist/list/listindentcommand.d.ts +66 -0
  100. package/dist/list/listmergecommand.d.ts +80 -0
  101. package/dist/list/listsplitcommand.d.ts +71 -0
  102. package/dist/list/listui.d.ts +27 -0
  103. package/dist/list/listutils.d.ts +60 -0
  104. package/dist/list/utils/listwalker.d.ts +146 -0
  105. package/dist/list/utils/model.d.ts +213 -0
  106. package/dist/list/utils/postfixers.d.ts +41 -0
  107. package/dist/list/utils/view.d.ts +86 -0
  108. package/dist/list/utils.d.ts +22 -0
  109. package/dist/list.d.ts +34 -0
  110. package/dist/listconfig.d.ts +164 -0
  111. package/dist/listproperties/converters.d.ts +23 -0
  112. package/dist/listproperties/listpropertiesediting.d.ts +96 -0
  113. package/dist/listproperties/listpropertiesui.d.ts +31 -0
  114. package/dist/listproperties/listpropertiesutils.d.ts +41 -0
  115. package/dist/listproperties/listreversedcommand.d.ts +40 -0
  116. package/dist/listproperties/liststartcommand.d.ts +42 -0
  117. package/dist/listproperties/liststylecommand.d.ts +76 -0
  118. package/dist/listproperties/ui/listpropertiesview.d.ts +160 -0
  119. package/dist/listproperties/utils/config.d.ts +39 -0
  120. package/dist/listproperties/utils/style.d.ts +24 -0
  121. package/dist/listproperties.d.ts +35 -0
  122. package/dist/tododocumentlist.d.ts +36 -0
  123. package/dist/todolist/checktodolistcommand.d.ts +53 -0
  124. package/dist/todolist/todocheckboxchangeobserver.d.ts +45 -0
  125. package/dist/todolist/todolistediting.d.ts +53 -0
  126. package/dist/todolist/todolistui.d.ts +27 -0
  127. package/dist/todolist.d.ts +35 -0
  128. package/dist/translations/ar.d.ts +8 -0
  129. package/dist/translations/ar.js +5 -0
  130. package/dist/translations/ar.umd.js +11 -0
  131. package/dist/translations/ast.d.ts +8 -0
  132. package/dist/translations/ast.js +5 -0
  133. package/dist/translations/ast.umd.js +11 -0
  134. package/dist/translations/az.d.ts +8 -0
  135. package/dist/translations/az.js +5 -0
  136. package/dist/translations/az.umd.js +11 -0
  137. package/dist/translations/bg.d.ts +8 -0
  138. package/dist/translations/bg.js +5 -0
  139. package/dist/translations/bg.umd.js +11 -0
  140. package/dist/translations/bn.d.ts +8 -0
  141. package/dist/translations/bn.js +5 -0
  142. package/dist/translations/bn.umd.js +11 -0
  143. package/dist/translations/ca.d.ts +8 -0
  144. package/dist/translations/ca.js +5 -0
  145. package/dist/translations/ca.umd.js +11 -0
  146. package/dist/translations/cs.d.ts +8 -0
  147. package/dist/translations/cs.js +5 -0
  148. package/dist/translations/cs.umd.js +11 -0
  149. package/dist/translations/da.d.ts +8 -0
  150. package/dist/translations/da.js +5 -0
  151. package/dist/translations/da.umd.js +11 -0
  152. package/dist/translations/de-ch.d.ts +8 -0
  153. package/dist/translations/de-ch.js +5 -0
  154. package/dist/translations/de-ch.umd.js +11 -0
  155. package/dist/translations/de.d.ts +8 -0
  156. package/dist/translations/de.js +5 -0
  157. package/dist/translations/de.umd.js +11 -0
  158. package/dist/translations/el.d.ts +8 -0
  159. package/dist/translations/el.js +5 -0
  160. package/dist/translations/el.umd.js +11 -0
  161. package/dist/translations/en-au.d.ts +8 -0
  162. package/dist/translations/en-au.js +5 -0
  163. package/dist/translations/en-au.umd.js +11 -0
  164. package/dist/translations/en-gb.d.ts +8 -0
  165. package/dist/translations/en-gb.js +5 -0
  166. package/dist/translations/en-gb.umd.js +11 -0
  167. package/dist/translations/en.d.ts +8 -0
  168. package/dist/translations/en.js +5 -0
  169. package/dist/translations/en.umd.js +11 -0
  170. package/dist/translations/eo.d.ts +8 -0
  171. package/dist/translations/eo.js +5 -0
  172. package/dist/translations/eo.umd.js +11 -0
  173. package/dist/translations/es.d.ts +8 -0
  174. package/dist/translations/es.js +5 -0
  175. package/dist/translations/es.umd.js +11 -0
  176. package/dist/translations/et.d.ts +8 -0
  177. package/dist/translations/et.js +5 -0
  178. package/dist/translations/et.umd.js +11 -0
  179. package/dist/translations/eu.d.ts +8 -0
  180. package/dist/translations/eu.js +5 -0
  181. package/dist/translations/eu.umd.js +11 -0
  182. package/dist/translations/fa.d.ts +8 -0
  183. package/dist/translations/fa.js +5 -0
  184. package/dist/translations/fa.umd.js +11 -0
  185. package/dist/translations/fi.d.ts +8 -0
  186. package/dist/translations/fi.js +5 -0
  187. package/dist/translations/fi.umd.js +11 -0
  188. package/dist/translations/fr.d.ts +8 -0
  189. package/dist/translations/fr.js +5 -0
  190. package/dist/translations/fr.umd.js +11 -0
  191. package/dist/translations/gl.d.ts +8 -0
  192. package/dist/translations/gl.js +5 -0
  193. package/dist/translations/gl.umd.js +11 -0
  194. package/dist/translations/he.d.ts +8 -0
  195. package/dist/translations/he.js +5 -0
  196. package/dist/translations/he.umd.js +11 -0
  197. package/dist/translations/hi.d.ts +8 -0
  198. package/dist/translations/hi.js +5 -0
  199. package/dist/translations/hi.umd.js +11 -0
  200. package/dist/translations/hr.d.ts +8 -0
  201. package/dist/translations/hr.js +5 -0
  202. package/dist/translations/hr.umd.js +11 -0
  203. package/dist/translations/hu.d.ts +8 -0
  204. package/dist/translations/hu.js +5 -0
  205. package/dist/translations/hu.umd.js +11 -0
  206. package/dist/translations/id.d.ts +8 -0
  207. package/dist/translations/id.js +5 -0
  208. package/dist/translations/id.umd.js +11 -0
  209. package/dist/translations/it.d.ts +8 -0
  210. package/dist/translations/it.js +5 -0
  211. package/dist/translations/it.umd.js +11 -0
  212. package/dist/translations/ja.d.ts +8 -0
  213. package/dist/translations/ja.js +5 -0
  214. package/dist/translations/ja.umd.js +11 -0
  215. package/dist/translations/jv.d.ts +8 -0
  216. package/dist/translations/jv.js +5 -0
  217. package/dist/translations/jv.umd.js +11 -0
  218. package/dist/translations/km.d.ts +8 -0
  219. package/dist/translations/km.js +5 -0
  220. package/dist/translations/km.umd.js +11 -0
  221. package/dist/translations/kn.d.ts +8 -0
  222. package/dist/translations/kn.js +5 -0
  223. package/dist/translations/kn.umd.js +11 -0
  224. package/dist/translations/ko.d.ts +8 -0
  225. package/dist/translations/ko.js +5 -0
  226. package/dist/translations/ko.umd.js +11 -0
  227. package/dist/translations/ku.d.ts +8 -0
  228. package/dist/translations/ku.js +5 -0
  229. package/dist/translations/ku.umd.js +11 -0
  230. package/dist/translations/lt.d.ts +8 -0
  231. package/dist/translations/lt.js +5 -0
  232. package/dist/translations/lt.umd.js +11 -0
  233. package/dist/translations/lv.d.ts +8 -0
  234. package/dist/translations/lv.js +5 -0
  235. package/dist/translations/lv.umd.js +11 -0
  236. package/dist/translations/ms.d.ts +8 -0
  237. package/dist/translations/ms.js +5 -0
  238. package/dist/translations/ms.umd.js +11 -0
  239. package/dist/translations/nb.d.ts +8 -0
  240. package/dist/translations/nb.js +5 -0
  241. package/dist/translations/nb.umd.js +11 -0
  242. package/dist/translations/ne.d.ts +8 -0
  243. package/dist/translations/ne.js +5 -0
  244. package/dist/translations/ne.umd.js +11 -0
  245. package/dist/translations/nl.d.ts +8 -0
  246. package/dist/translations/nl.js +5 -0
  247. package/dist/translations/nl.umd.js +11 -0
  248. package/dist/translations/no.d.ts +8 -0
  249. package/dist/translations/no.js +5 -0
  250. package/dist/translations/no.umd.js +11 -0
  251. package/dist/translations/pl.d.ts +8 -0
  252. package/dist/translations/pl.js +5 -0
  253. package/dist/translations/pl.umd.js +11 -0
  254. package/dist/translations/pt-br.d.ts +8 -0
  255. package/dist/translations/pt-br.js +5 -0
  256. package/dist/translations/pt-br.umd.js +11 -0
  257. package/dist/translations/pt.d.ts +8 -0
  258. package/dist/translations/pt.js +5 -0
  259. package/dist/translations/pt.umd.js +11 -0
  260. package/dist/translations/ro.d.ts +8 -0
  261. package/dist/translations/ro.js +5 -0
  262. package/dist/translations/ro.umd.js +11 -0
  263. package/dist/translations/ru.d.ts +8 -0
  264. package/dist/translations/ru.js +5 -0
  265. package/dist/translations/ru.umd.js +11 -0
  266. package/dist/translations/si.d.ts +8 -0
  267. package/dist/translations/si.js +5 -0
  268. package/dist/translations/si.umd.js +11 -0
  269. package/dist/translations/sk.d.ts +8 -0
  270. package/dist/translations/sk.js +5 -0
  271. package/dist/translations/sk.umd.js +11 -0
  272. package/dist/translations/sq.d.ts +8 -0
  273. package/dist/translations/sq.js +5 -0
  274. package/dist/translations/sq.umd.js +11 -0
  275. package/dist/translations/sr-latn.d.ts +8 -0
  276. package/dist/translations/sr-latn.js +5 -0
  277. package/dist/translations/sr-latn.umd.js +11 -0
  278. package/dist/translations/sr.d.ts +8 -0
  279. package/dist/translations/sr.js +5 -0
  280. package/dist/translations/sr.umd.js +11 -0
  281. package/dist/translations/sv.d.ts +8 -0
  282. package/dist/translations/sv.js +5 -0
  283. package/dist/translations/sv.umd.js +11 -0
  284. package/dist/translations/th.d.ts +8 -0
  285. package/dist/translations/th.js +5 -0
  286. package/dist/translations/th.umd.js +11 -0
  287. package/dist/translations/ti.d.ts +8 -0
  288. package/dist/translations/ti.js +5 -0
  289. package/dist/translations/ti.umd.js +11 -0
  290. package/dist/translations/tk.d.ts +8 -0
  291. package/dist/translations/tk.js +5 -0
  292. package/dist/translations/tk.umd.js +11 -0
  293. package/dist/translations/tr.d.ts +8 -0
  294. package/dist/translations/tr.js +5 -0
  295. package/dist/translations/tr.umd.js +11 -0
  296. package/dist/translations/tt.d.ts +8 -0
  297. package/dist/translations/tt.js +5 -0
  298. package/dist/translations/tt.umd.js +11 -0
  299. package/dist/translations/ug.d.ts +8 -0
  300. package/dist/translations/ug.js +5 -0
  301. package/dist/translations/ug.umd.js +11 -0
  302. package/dist/translations/uk.d.ts +8 -0
  303. package/dist/translations/uk.js +5 -0
  304. package/dist/translations/uk.umd.js +11 -0
  305. package/dist/translations/ur.d.ts +8 -0
  306. package/dist/translations/ur.js +5 -0
  307. package/dist/translations/ur.umd.js +11 -0
  308. package/dist/translations/uz.d.ts +8 -0
  309. package/dist/translations/uz.js +5 -0
  310. package/dist/translations/uz.umd.js +11 -0
  311. package/dist/translations/vi.d.ts +8 -0
  312. package/dist/translations/vi.js +5 -0
  313. package/dist/translations/vi.umd.js +11 -0
  314. package/dist/translations/zh-cn.d.ts +8 -0
  315. package/dist/translations/zh-cn.js +5 -0
  316. package/dist/translations/zh-cn.umd.js +11 -0
  317. package/dist/translations/zh.d.ts +8 -0
  318. package/dist/translations/zh.js +5 -0
  319. package/dist/translations/zh.umd.js +11 -0
  320. package/lang/contexts.json +35 -0
  321. package/lang/translations/ar.po +150 -0
  322. package/lang/translations/ast.po +150 -0
  323. package/lang/translations/az.po +150 -0
  324. package/lang/translations/bg.po +150 -0
  325. package/lang/translations/bn.po +150 -0
  326. package/lang/translations/ca.po +150 -0
  327. package/lang/translations/cs.po +150 -0
  328. package/lang/translations/da.po +150 -0
  329. package/lang/translations/de-ch.po +150 -0
  330. package/lang/translations/de.po +150 -0
  331. package/lang/translations/el.po +150 -0
  332. package/lang/translations/en-au.po +150 -0
  333. package/lang/translations/en-gb.po +150 -0
  334. package/lang/translations/en.po +150 -0
  335. package/lang/translations/eo.po +150 -0
  336. package/lang/translations/es.po +150 -0
  337. package/lang/translations/et.po +150 -0
  338. package/lang/translations/eu.po +150 -0
  339. package/lang/translations/fa.po +150 -0
  340. package/lang/translations/fi.po +150 -0
  341. package/lang/translations/fr.po +150 -0
  342. package/lang/translations/gl.po +150 -0
  343. package/lang/translations/he.po +150 -0
  344. package/lang/translations/hi.po +150 -0
  345. package/lang/translations/hr.po +150 -0
  346. package/lang/translations/hu.po +150 -0
  347. package/lang/translations/id.po +150 -0
  348. package/lang/translations/it.po +150 -0
  349. package/lang/translations/ja.po +150 -0
  350. package/lang/translations/jv.po +150 -0
  351. package/lang/translations/km.po +150 -0
  352. package/lang/translations/kn.po +150 -0
  353. package/lang/translations/ko.po +150 -0
  354. package/lang/translations/ku.po +150 -0
  355. package/lang/translations/lt.po +150 -0
  356. package/lang/translations/lv.po +150 -0
  357. package/lang/translations/ms.po +150 -0
  358. package/lang/translations/nb.po +150 -0
  359. package/lang/translations/ne.po +150 -0
  360. package/lang/translations/nl.po +150 -0
  361. package/lang/translations/no.po +150 -0
  362. package/lang/translations/pl.po +150 -0
  363. package/lang/translations/pt-br.po +150 -0
  364. package/lang/translations/pt.po +150 -0
  365. package/lang/translations/ro.po +150 -0
  366. package/lang/translations/ru.po +150 -0
  367. package/lang/translations/si.po +150 -0
  368. package/lang/translations/sk.po +150 -0
  369. package/lang/translations/sq.po +150 -0
  370. package/lang/translations/sr-latn.po +150 -0
  371. package/lang/translations/sr.po +150 -0
  372. package/lang/translations/sv.po +150 -0
  373. package/lang/translations/th.po +150 -0
  374. package/lang/translations/ti.po +150 -0
  375. package/lang/translations/tk.po +150 -0
  376. package/lang/translations/tr.po +150 -0
  377. package/lang/translations/tt.po +150 -0
  378. package/lang/translations/ug.po +150 -0
  379. package/lang/translations/uk.po +150 -0
  380. package/lang/translations/ur.po +150 -0
  381. package/lang/translations/uz.po +150 -0
  382. package/lang/translations/vi.po +150 -0
  383. package/lang/translations/zh-cn.po +150 -0
  384. package/lang/translations/zh.po +150 -0
  385. package/package.json +45 -0
  386. package/src/augmentation.d.ts +53 -0
  387. package/src/augmentation.js +5 -0
  388. package/src/documentlist.d.ts +32 -0
  389. package/src/documentlist.js +47 -0
  390. package/src/documentlistproperties.d.ts +32 -0
  391. package/src/documentlistproperties.js +47 -0
  392. package/src/index.d.ts +45 -0
  393. package/src/index.js +39 -0
  394. package/src/legacylist/legacyconverters.d.ts +196 -0
  395. package/src/legacylist/legacyconverters.js +905 -0
  396. package/src/legacylist/legacyindentcommand.d.ts +37 -0
  397. package/src/legacylist/legacyindentcommand.js +107 -0
  398. package/src/legacylist/legacylistcommand.d.ts +56 -0
  399. package/src/legacylist/legacylistcommand.js +274 -0
  400. package/src/legacylist/legacylistediting.d.ts +36 -0
  401. package/src/legacylist/legacylistediting.js +167 -0
  402. package/src/legacylist/legacylistutils.d.ts +45 -0
  403. package/src/legacylist/legacylistutils.js +52 -0
  404. package/src/legacylist/legacyutils.d.ts +101 -0
  405. package/src/legacylist/legacyutils.js +347 -0
  406. package/src/legacylist.d.ts +30 -0
  407. package/src/legacylist.js +36 -0
  408. package/src/legacylistproperties/legacylistpropertiesediting.d.ts +76 -0
  409. package/src/legacylistproperties/legacylistpropertiesediting.js +702 -0
  410. package/src/legacylistproperties/legacylistreversedcommand.d.ts +38 -0
  411. package/src/legacylistproperties/legacylistreversedcommand.js +52 -0
  412. package/src/legacylistproperties/legacyliststartcommand.d.ts +37 -0
  413. package/src/legacylistproperties/legacyliststartcommand.js +51 -0
  414. package/src/legacylistproperties/legacyliststylecommand.d.ts +67 -0
  415. package/src/legacylistproperties/legacyliststylecommand.js +100 -0
  416. package/src/legacylistproperties.d.ts +31 -0
  417. package/src/legacylistproperties.js +37 -0
  418. package/src/legacytodolist/legacychecktodolistcommand.d.ts +52 -0
  419. package/src/legacytodolist/legacychecktodolistcommand.js +76 -0
  420. package/src/legacytodolist/legacytodolistconverters.d.ts +83 -0
  421. package/src/legacytodolist/legacytodolistconverters.js +261 -0
  422. package/src/legacytodolist/legacytodolistediting.d.ts +50 -0
  423. package/src/legacytodolist/legacytodolistediting.js +199 -0
  424. package/src/legacytodolist.d.ts +31 -0
  425. package/src/legacytodolist.js +37 -0
  426. package/src/list/adjacentlistssupport.d.ts +19 -0
  427. package/src/list/adjacentlistssupport.js +87 -0
  428. package/src/list/converters.d.ts +65 -0
  429. package/src/list/converters.js +491 -0
  430. package/src/list/listcommand.d.ts +92 -0
  431. package/src/list/listcommand.js +163 -0
  432. package/src/list/listediting.d.ts +226 -0
  433. package/src/list/listediting.js +678 -0
  434. package/src/list/listindentcommand.d.ts +62 -0
  435. package/src/list/listindentcommand.js +129 -0
  436. package/src/list/listmergecommand.d.ts +76 -0
  437. package/src/list/listmergecommand.js +174 -0
  438. package/src/list/listsplitcommand.d.ts +67 -0
  439. package/src/list/listsplitcommand.js +70 -0
  440. package/src/list/listui.d.ts +23 -0
  441. package/src/list/listui.js +41 -0
  442. package/src/list/listutils.d.ts +56 -0
  443. package/src/list/listutils.js +62 -0
  444. package/src/list/utils/listwalker.d.ts +142 -0
  445. package/src/list/utils/listwalker.js +182 -0
  446. package/src/list/utils/model.d.ts +209 -0
  447. package/src/list/utils/model.js +464 -0
  448. package/src/list/utils/postfixers.d.ts +37 -0
  449. package/src/list/utils/postfixers.js +126 -0
  450. package/src/list/utils/view.d.ts +82 -0
  451. package/src/list/utils/view.js +117 -0
  452. package/src/list/utils.d.ts +18 -0
  453. package/src/list/utils.js +51 -0
  454. package/src/list.d.ts +30 -0
  455. package/src/list.js +36 -0
  456. package/src/listconfig.d.ts +160 -0
  457. package/src/listconfig.js +5 -0
  458. package/src/listproperties/converters.d.ts +19 -0
  459. package/src/listproperties/converters.js +43 -0
  460. package/src/listproperties/listpropertiesediting.d.ts +92 -0
  461. package/src/listproperties/listpropertiesediting.js +275 -0
  462. package/src/listproperties/listpropertiesui.d.ts +27 -0
  463. package/src/listproperties/listpropertiesui.js +371 -0
  464. package/src/listproperties/listpropertiesutils.d.ts +37 -0
  465. package/src/listproperties/listpropertiesutils.js +50 -0
  466. package/src/listproperties/listreversedcommand.d.ts +36 -0
  467. package/src/listproperties/listreversedcommand.js +55 -0
  468. package/src/listproperties/liststartcommand.d.ts +38 -0
  469. package/src/listproperties/liststartcommand.js +60 -0
  470. package/src/listproperties/liststylecommand.d.ts +72 -0
  471. package/src/listproperties/liststylecommand.js +113 -0
  472. package/src/listproperties/ui/listpropertiesview.d.ts +156 -0
  473. package/src/listproperties/ui/listpropertiesview.js +301 -0
  474. package/src/listproperties/utils/config.d.ts +35 -0
  475. package/src/listproperties/utils/config.js +70 -0
  476. package/src/listproperties/utils/style.d.ts +20 -0
  477. package/src/listproperties/utils/style.js +54 -0
  478. package/src/listproperties.d.ts +31 -0
  479. package/src/listproperties.js +37 -0
  480. package/src/tododocumentlist.d.ts +32 -0
  481. package/src/tododocumentlist.js +47 -0
  482. package/src/todolist/checktodolistcommand.d.ts +49 -0
  483. package/src/todolist/checktodolistcommand.js +82 -0
  484. package/src/todolist/todocheckboxchangeobserver.d.ts +41 -0
  485. package/src/todolist/todocheckboxchangeobserver.js +37 -0
  486. package/src/todolist/todolistediting.d.ts +49 -0
  487. package/src/todolist/todolistediting.js +470 -0
  488. package/src/todolist/todolistui.d.ts +23 -0
  489. package/src/todolist/todolistui.js +34 -0
  490. package/src/todolist.d.ts +31 -0
  491. package/src/todolist.js +37 -0
  492. package/theme/documentlist.css +8 -0
  493. package/theme/icons/liststylecircle.svg +1 -0
  494. package/theme/icons/liststyledecimal.svg +1 -0
  495. package/theme/icons/liststyledecimalleadingzero.svg +1 -0
  496. package/theme/icons/liststyledisc.svg +1 -0
  497. package/theme/icons/liststylelowerlatin.svg +1 -0
  498. package/theme/icons/liststylelowerroman.svg +1 -0
  499. package/theme/icons/liststylesquare.svg +1 -0
  500. package/theme/icons/liststyleupperlatin.svg +1 -0
  501. package/theme/icons/liststyleupperroman.svg +1 -0
  502. package/theme/list.css +40 -0
  503. package/theme/listproperties.css +10 -0
  504. package/theme/liststyles.css +8 -0
  505. package/theme/todolist.css +140 -0
@@ -0,0 +1,261 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ import { createElement } from 'ckeditor5/src/utils.js';
6
+ import { generateLiInUl, injectViewList, positionAfterUiElements, findNestedList } from '../legacylist/legacyutils.js';
7
+ /**
8
+ * A model-to-view converter for the `listItem` model element insertion.
9
+ *
10
+ * It converts the `listItem` model element to an unordered list with a {@link module:engine/view/uielement~UIElement checkbox element}
11
+ * at the beginning of each list item. It also merges the list with surrounding lists (if available).
12
+ *
13
+ * It is used by {@link module:engine/controller/editingcontroller~EditingController}.
14
+ *
15
+ * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert
16
+ * @param model Model instance.
17
+ * @param onCheckboxChecked Callback function.
18
+ * @returns Returns a conversion callback.
19
+ */
20
+ export function modelViewInsertion(model, onCheckboxChecked) {
21
+ return (evt, data, conversionApi) => {
22
+ const consumable = conversionApi.consumable;
23
+ if (!consumable.test(data.item, 'insert') ||
24
+ !consumable.test(data.item, 'attribute:listType') ||
25
+ !consumable.test(data.item, 'attribute:listIndent')) {
26
+ return;
27
+ }
28
+ if (data.item.getAttribute('listType') != 'todo') {
29
+ return;
30
+ }
31
+ const modelItem = data.item;
32
+ consumable.consume(modelItem, 'insert');
33
+ consumable.consume(modelItem, 'attribute:listType');
34
+ consumable.consume(modelItem, 'attribute:listIndent');
35
+ consumable.consume(modelItem, 'attribute:todoListChecked');
36
+ const viewWriter = conversionApi.writer;
37
+ const viewItem = generateLiInUl(modelItem, conversionApi);
38
+ const isChecked = !!modelItem.getAttribute('todoListChecked');
39
+ const checkmarkElement = createCheckmarkElement(modelItem, viewWriter, isChecked, onCheckboxChecked);
40
+ const span = viewWriter.createContainerElement('span', {
41
+ class: 'todo-list__label__description'
42
+ });
43
+ viewWriter.addClass('todo-list', viewItem.parent);
44
+ viewWriter.insert(viewWriter.createPositionAt(viewItem, 0), checkmarkElement);
45
+ viewWriter.insert(viewWriter.createPositionAfter(checkmarkElement), span);
46
+ injectViewList(modelItem, viewItem, conversionApi, model);
47
+ };
48
+ }
49
+ /**
50
+ * A model-to-view converter for the `listItem` model element insertion.
51
+ *
52
+ * It is used by {@link module:engine/controller/datacontroller~DataController}.
53
+ *
54
+ * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:insert
55
+ * @param model Model instance.
56
+ * @returns Returns a conversion callback.
57
+ */
58
+ export function dataModelViewInsertion(model) {
59
+ return (evt, data, conversionApi) => {
60
+ const consumable = conversionApi.consumable;
61
+ if (!consumable.test(data.item, 'insert') ||
62
+ !consumable.test(data.item, 'attribute:listType') ||
63
+ !consumable.test(data.item, 'attribute:listIndent')) {
64
+ return;
65
+ }
66
+ if (data.item.getAttribute('listType') != 'todo') {
67
+ return;
68
+ }
69
+ const modelItem = data.item;
70
+ consumable.consume(modelItem, 'insert');
71
+ consumable.consume(modelItem, 'attribute:listType');
72
+ consumable.consume(modelItem, 'attribute:listIndent');
73
+ consumable.consume(modelItem, 'attribute:todoListChecked');
74
+ const viewWriter = conversionApi.writer;
75
+ const viewItem = generateLiInUl(modelItem, conversionApi);
76
+ viewWriter.addClass('todo-list', viewItem.parent);
77
+ const label = viewWriter.createContainerElement('label', {
78
+ class: 'todo-list__label'
79
+ });
80
+ const checkbox = viewWriter.createEmptyElement('input', {
81
+ type: 'checkbox',
82
+ disabled: 'disabled'
83
+ });
84
+ const span = viewWriter.createContainerElement('span', {
85
+ class: 'todo-list__label__description'
86
+ });
87
+ if (modelItem.getAttribute('todoListChecked')) {
88
+ viewWriter.setAttribute('checked', 'checked', checkbox);
89
+ }
90
+ viewWriter.insert(viewWriter.createPositionAt(viewItem, 0), label);
91
+ viewWriter.insert(viewWriter.createPositionAt(label, 0), checkbox);
92
+ viewWriter.insert(viewWriter.createPositionAfter(checkbox), span);
93
+ injectViewList(modelItem, viewItem, conversionApi, model);
94
+ };
95
+ }
96
+ /**
97
+ * A view-to-model converter for the checkbox element inside a view list item.
98
+ *
99
+ * It changes the `listType` of the model `listItem` to a `todo` value.
100
+ * When a view checkbox element is marked as checked, an additional `todoListChecked="true"` attribute is added to the model item.
101
+ *
102
+ * It is used by {@link module:engine/controller/datacontroller~DataController}.
103
+ *
104
+ * @see module:engine/conversion/upcastdispatcher~UpcastDispatcher#event:element
105
+ */
106
+ export const dataViewModelCheckmarkInsertion = (evt, data, conversionApi) => {
107
+ const modelCursor = data.modelCursor;
108
+ const modelItem = modelCursor.parent;
109
+ const viewItem = data.viewItem;
110
+ if (viewItem.getAttribute('type') != 'checkbox' || modelItem.name != 'listItem' || !modelCursor.isAtStart) {
111
+ return;
112
+ }
113
+ if (!conversionApi.consumable.consume(viewItem, { name: true })) {
114
+ return;
115
+ }
116
+ const writer = conversionApi.writer;
117
+ writer.setAttribute('listType', 'todo', modelItem);
118
+ if (data.viewItem.hasAttribute('checked')) {
119
+ writer.setAttribute('todoListChecked', true, modelItem);
120
+ }
121
+ data.modelRange = writer.createRange(modelCursor);
122
+ };
123
+ /**
124
+ * A model-to-view converter for the `listType` attribute change on the `listItem` model element.
125
+ *
126
+ * This change means that the `<li>` element parent changes to `<ul class="todo-list">` and a
127
+ * {@link module:engine/view/uielement~UIElement checkbox UI element} is added at the beginning
128
+ * of the list item element (or vice versa).
129
+ *
130
+ * This converter is preceded by {@link module:list/legacylist/legacyconverters~modelViewChangeType} and followed by
131
+ * {@link module:list/legacylist/legacyconverters~modelViewMergeAfterChangeType} to handle splitting and merging surrounding lists
132
+ * of the same type.
133
+ *
134
+ * It is used by {@link module:engine/controller/editingcontroller~EditingController}.
135
+ *
136
+ * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute
137
+ * @param onCheckedChange Callback fired after clicking the checkbox UI element.
138
+ * @param view Editing view controller.
139
+ * @returns Returns a conversion callback.
140
+ */
141
+ export function modelViewChangeType(onCheckedChange, view) {
142
+ return (evt, data, conversionApi) => {
143
+ if (!conversionApi.consumable.consume(data.item, evt.name)) {
144
+ return;
145
+ }
146
+ const viewItem = conversionApi.mapper.toViewElement(data.item);
147
+ const viewWriter = conversionApi.writer;
148
+ const labelElement = findLabel(viewItem, view);
149
+ if (data.attributeNewValue == 'todo') {
150
+ const isChecked = !!data.item.getAttribute('todoListChecked');
151
+ const checkmarkElement = createCheckmarkElement(data.item, viewWriter, isChecked, onCheckedChange);
152
+ const span = viewWriter.createContainerElement('span', {
153
+ class: 'todo-list__label__description'
154
+ });
155
+ const itemRange = viewWriter.createRangeIn(viewItem);
156
+ const nestedList = findNestedList(viewItem);
157
+ const descriptionStart = positionAfterUiElements(itemRange.start);
158
+ const descriptionEnd = nestedList ? viewWriter.createPositionBefore(nestedList) : itemRange.end;
159
+ const descriptionRange = viewWriter.createRange(descriptionStart, descriptionEnd);
160
+ viewWriter.addClass('todo-list', viewItem.parent);
161
+ viewWriter.move(descriptionRange, viewWriter.createPositionAt(span, 0));
162
+ viewWriter.insert(viewWriter.createPositionAt(viewItem, 0), checkmarkElement);
163
+ viewWriter.insert(viewWriter.createPositionAfter(checkmarkElement), span);
164
+ }
165
+ else if (data.attributeOldValue == 'todo') {
166
+ const descriptionSpan = findDescription(viewItem, view);
167
+ viewWriter.removeClass('todo-list', viewItem.parent);
168
+ viewWriter.remove(labelElement);
169
+ viewWriter.move(viewWriter.createRangeIn(descriptionSpan), viewWriter.createPositionBefore(descriptionSpan));
170
+ viewWriter.remove(descriptionSpan);
171
+ }
172
+ };
173
+ }
174
+ /**
175
+ * A model-to-view converter for the `todoListChecked` attribute change on the `listItem` model element.
176
+ *
177
+ * It marks the {@link module:engine/view/uielement~UIElement checkbox UI element} as checked.
178
+ *
179
+ * It is used by {@link module:engine/controller/editingcontroller~EditingController}.
180
+ *
181
+ * @see module:engine/conversion/downcastdispatcher~DowncastDispatcher#event:attribute
182
+ * @param onCheckedChange Callback fired after clicking the checkbox UI element.
183
+ * @returns Returns a conversion callback.
184
+ */
185
+ export function modelViewChangeChecked(onCheckedChange) {
186
+ return (evt, data, conversionApi) => {
187
+ // Do not convert `todoListChecked` attribute when to-do list item has changed to other list item.
188
+ // This attribute will be removed by the model post fixer.
189
+ if (data.item.getAttribute('listType') != 'todo') {
190
+ return;
191
+ }
192
+ if (!conversionApi.consumable.consume(data.item, 'attribute:todoListChecked')) {
193
+ return;
194
+ }
195
+ const { mapper, writer: viewWriter } = conversionApi;
196
+ const isChecked = !!data.item.getAttribute('todoListChecked');
197
+ const viewItem = mapper.toViewElement(data.item);
198
+ // Because of m -> v position mapper we can be sure checkbox is always at the beginning.
199
+ const oldCheckmarkElement = viewItem.getChild(0);
200
+ const newCheckmarkElement = createCheckmarkElement(data.item, viewWriter, isChecked, onCheckedChange);
201
+ viewWriter.insert(viewWriter.createPositionAfter(oldCheckmarkElement), newCheckmarkElement);
202
+ viewWriter.remove(oldCheckmarkElement);
203
+ };
204
+ }
205
+ /**
206
+ * A model-to-view position at zero offset mapper.
207
+ *
208
+ * This helper ensures that position inside todo-list in the view is mapped after the checkbox.
209
+ *
210
+ * It only handles the position at the beginning of a list item as other positions are properly mapped be the default mapper.
211
+ */
212
+ export function mapModelToViewPosition(view) {
213
+ return (evt, data) => {
214
+ const modelPosition = data.modelPosition;
215
+ const parent = modelPosition.parent;
216
+ if (!parent.is('element', 'listItem') || parent.getAttribute('listType') != 'todo') {
217
+ return;
218
+ }
219
+ const viewLi = data.mapper.toViewElement(parent);
220
+ const descSpan = findDescription(viewLi, view);
221
+ if (descSpan) {
222
+ data.viewPosition = data.mapper.findPositionIn(descSpan, modelPosition.offset);
223
+ }
224
+ };
225
+ }
226
+ /**
227
+ * Creates a checkbox UI element.
228
+ */
229
+ function createCheckmarkElement(modelItem, viewWriter, isChecked, onChange) {
230
+ const uiElement = viewWriter.createUIElement('label', {
231
+ class: 'todo-list__label',
232
+ contenteditable: false
233
+ }, function (domDocument) {
234
+ const checkbox = createElement(document, 'input', { type: 'checkbox', tabindex: '-1' });
235
+ if (isChecked) {
236
+ checkbox.setAttribute('checked', 'checked');
237
+ }
238
+ checkbox.addEventListener('change', () => onChange(modelItem));
239
+ const domElement = this.toDomElement(domDocument);
240
+ domElement.appendChild(checkbox);
241
+ return domElement;
242
+ });
243
+ return uiElement;
244
+ }
245
+ // Helper method to find label element inside li.
246
+ function findLabel(viewItem, view) {
247
+ const range = view.createRangeIn(viewItem);
248
+ for (const value of range) {
249
+ if (value.item.is('uiElement', 'label')) {
250
+ return value.item;
251
+ }
252
+ }
253
+ }
254
+ function findDescription(viewItem, view) {
255
+ const range = view.createRangeIn(viewItem);
256
+ for (const value of range) {
257
+ if (value.item.is('containerElement', 'span') && value.item.hasClass('todo-list__label__description')) {
258
+ return value.item;
259
+ }
260
+ }
261
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ import { Plugin } from 'ckeditor5/src/core.js';
6
+ import LegacyListEditing from '../legacylist/legacylistediting.js';
7
+ /**
8
+ * The engine of the to-do list feature. It handles creating, editing and removing to-do lists and their items.
9
+ *
10
+ * It registers the entire functionality of the {@link module:list/legacylist/legacylistediting~LegacyListEditing legacy list editing
11
+ * plugin} and extends it with the commands:
12
+ *
13
+ * - `'todoList'`,
14
+ * - `'checkTodoList'`,
15
+ * - `'todoListCheck'` as an alias for `checkTodoList` command.
16
+ */
17
+ export default class LegacyTodoListEditing extends Plugin {
18
+ /**
19
+ * @inheritDoc
20
+ */
21
+ static get pluginName(): "LegacyTodoListEditing";
22
+ /**
23
+ * @inheritDoc
24
+ */
25
+ static get isOfficialPlugin(): true;
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get requires(): readonly [typeof LegacyListEditing];
30
+ /**
31
+ * @inheritDoc
32
+ */
33
+ init(): void;
34
+ /**
35
+ * Handles the checkbox element change, moves the selection to the corresponding model item to make it possible
36
+ * to toggle the `todoListChecked` attribute using the command, and restores the selection position.
37
+ *
38
+ * Some say it's a hack :) Moving the selection only for executing the command on a certain node and restoring it after,
39
+ * is not a clear solution. We need to design an API for using commands beyond the selection range.
40
+ * See https://github.com/ckeditor/ckeditor5/issues/1954.
41
+ */
42
+ private _handleCheckmarkChange;
43
+ /**
44
+ * Observe when user enters or leaves todo list and set proper aria value in global live announcer.
45
+ * This allows screen readers to indicate when the user has entered and left the specified todo list.
46
+ *
47
+ * @internal
48
+ */
49
+ private _initAriaAnnouncements;
50
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ import { Plugin } from 'ckeditor5/src/core.js';
6
+ import { getCode, parseKeystroke, getLocalizedArrowKeyCodeDirection } from 'ckeditor5/src/utils.js';
7
+ import LegacyListCommand from '../legacylist/legacylistcommand.js';
8
+ import LegacyListEditing from '../legacylist/legacylistediting.js';
9
+ import LegacyCheckTodoListCommand from './legacychecktodolistcommand.js';
10
+ import { dataModelViewInsertion, dataViewModelCheckmarkInsertion, mapModelToViewPosition, modelViewChangeChecked, modelViewChangeType, modelViewInsertion } from './legacytodolistconverters.js';
11
+ const ITEM_TOGGLE_KEYSTROKE = /* #__PURE__ */ parseKeystroke('Ctrl+Enter');
12
+ /**
13
+ * The engine of the to-do list feature. It handles creating, editing and removing to-do lists and their items.
14
+ *
15
+ * It registers the entire functionality of the {@link module:list/legacylist/legacylistediting~LegacyListEditing legacy list editing
16
+ * plugin} and extends it with the commands:
17
+ *
18
+ * - `'todoList'`,
19
+ * - `'checkTodoList'`,
20
+ * - `'todoListCheck'` as an alias for `checkTodoList` command.
21
+ */
22
+ export default class LegacyTodoListEditing extends Plugin {
23
+ /**
24
+ * @inheritDoc
25
+ */
26
+ static get pluginName() {
27
+ return 'LegacyTodoListEditing';
28
+ }
29
+ /**
30
+ * @inheritDoc
31
+ */
32
+ static get isOfficialPlugin() {
33
+ return true;
34
+ }
35
+ /**
36
+ * @inheritDoc
37
+ */
38
+ static get requires() {
39
+ return [LegacyListEditing];
40
+ }
41
+ /**
42
+ * @inheritDoc
43
+ */
44
+ init() {
45
+ const editor = this.editor;
46
+ const { editing, data, model } = editor;
47
+ // Extend schema.
48
+ model.schema.extend('listItem', {
49
+ allowAttributes: ['todoListChecked']
50
+ });
51
+ // Disallow todoListChecked attribute on other nodes than listItem with to-do listType.
52
+ model.schema.addAttributeCheck((context, attributeName) => {
53
+ const item = context.last;
54
+ if (attributeName == 'todoListChecked' && item.name == 'listItem' && item.getAttribute('listType') != 'todo') {
55
+ return false;
56
+ }
57
+ });
58
+ // Register `todoList` command.
59
+ editor.commands.add('todoList', new LegacyListCommand(editor, 'todo'));
60
+ const checkTodoListCommand = new LegacyCheckTodoListCommand(editor);
61
+ // Register `checkTodoList` command and add `todoListCheck` command as an alias for backward compatibility.
62
+ editor.commands.add('checkTodoList', checkTodoListCommand);
63
+ editor.commands.add('todoListCheck', checkTodoListCommand);
64
+ // Define converters.
65
+ data.downcastDispatcher.on('insert:listItem', dataModelViewInsertion(model), { priority: 'high' });
66
+ data.upcastDispatcher.on('element:input', dataViewModelCheckmarkInsertion, { priority: 'high' });
67
+ editing.downcastDispatcher.on('insert:listItem', modelViewInsertion(model, listItem => this._handleCheckmarkChange(listItem)), { priority: 'high' });
68
+ editing.downcastDispatcher.on('attribute:listType:listItem', modelViewChangeType(listItem => this._handleCheckmarkChange(listItem), editing.view));
69
+ editing.downcastDispatcher.on('attribute:todoListChecked:listItem', modelViewChangeChecked(listItem => this._handleCheckmarkChange(listItem)));
70
+ editing.mapper.on('modelToViewPosition', mapModelToViewPosition(editing.view));
71
+ data.mapper.on('modelToViewPosition', mapModelToViewPosition(editing.view));
72
+ // Jump at the end of the previous node on left arrow key press, when selection is after the checkbox.
73
+ //
74
+ // <blockquote><p>Foo</p></blockquote>
75
+ // <ul><li><checkbox/>{}Bar</li></ul>
76
+ //
77
+ // press: `<-`
78
+ //
79
+ // <blockquote><p>Foo{}</p></blockquote>
80
+ // <ul><li><checkbox/>Bar</li></ul>
81
+ //
82
+ this.listenTo(editing.view.document, 'arrowKey', jumpOverCheckmarkOnSideArrowKeyPress(model, editor.locale), { context: 'li' });
83
+ // Toggle check state of selected to-do list items on keystroke.
84
+ this.listenTo(editing.view.document, 'keydown', (evt, data) => {
85
+ if (getCode(data) === ITEM_TOGGLE_KEYSTROKE) {
86
+ editor.execute('checkTodoList');
87
+ evt.stop();
88
+ }
89
+ }, { priority: 'high' });
90
+ // Remove `todoListChecked` attribute when a host element is no longer a to-do list item.
91
+ const listItemsToFix = new Set();
92
+ this.listenTo(model, 'applyOperation', (evt, args) => {
93
+ const operation = args[0];
94
+ if (operation.type == 'rename' && operation.oldName == 'listItem') {
95
+ const item = operation.position.nodeAfter;
96
+ if (item.hasAttribute('todoListChecked')) {
97
+ listItemsToFix.add(item);
98
+ }
99
+ }
100
+ else if (operation.type == 'changeAttribute' && operation.key == 'listType' && operation.oldValue === 'todo') {
101
+ for (const item of operation.range.getItems()) {
102
+ if (item.hasAttribute('todoListChecked') && item.getAttribute('listType') !== 'todo') {
103
+ listItemsToFix.add(item);
104
+ }
105
+ }
106
+ }
107
+ });
108
+ model.document.registerPostFixer(writer => {
109
+ let hasChanged = false;
110
+ for (const listItem of listItemsToFix) {
111
+ writer.removeAttribute('todoListChecked', listItem);
112
+ hasChanged = true;
113
+ }
114
+ listItemsToFix.clear();
115
+ return hasChanged;
116
+ });
117
+ this._initAriaAnnouncements();
118
+ }
119
+ /**
120
+ * Handles the checkbox element change, moves the selection to the corresponding model item to make it possible
121
+ * to toggle the `todoListChecked` attribute using the command, and restores the selection position.
122
+ *
123
+ * Some say it's a hack :) Moving the selection only for executing the command on a certain node and restoring it after,
124
+ * is not a clear solution. We need to design an API for using commands beyond the selection range.
125
+ * See https://github.com/ckeditor/ckeditor5/issues/1954.
126
+ */
127
+ _handleCheckmarkChange(listItem) {
128
+ const editor = this.editor;
129
+ const model = editor.model;
130
+ const previousSelectionRanges = Array.from(model.document.selection.getRanges());
131
+ model.change(writer => {
132
+ writer.setSelection(listItem, 'end');
133
+ editor.execute('checkTodoList');
134
+ writer.setSelection(previousSelectionRanges);
135
+ });
136
+ }
137
+ /**
138
+ * Observe when user enters or leaves todo list and set proper aria value in global live announcer.
139
+ * This allows screen readers to indicate when the user has entered and left the specified todo list.
140
+ *
141
+ * @internal
142
+ */
143
+ _initAriaAnnouncements() {
144
+ const { model, ui, t } = this.editor;
145
+ let lastFocusedCodeBlock = null;
146
+ if (!ui) {
147
+ return;
148
+ }
149
+ model.document.selection.on('change:range', () => {
150
+ const focusParent = model.document.selection.focus.parent;
151
+ const lastElementIsTodoList = isLegacyTodoListItemElement(lastFocusedCodeBlock);
152
+ const currentElementIsTodoList = isLegacyTodoListItemElement(focusParent);
153
+ if (lastElementIsTodoList && !currentElementIsTodoList) {
154
+ ui.ariaLiveAnnouncer.announce(t('Leaving a to-do list'));
155
+ }
156
+ else if (!lastElementIsTodoList && currentElementIsTodoList) {
157
+ ui.ariaLiveAnnouncer.announce(t('Entering a to-do list'));
158
+ }
159
+ lastFocusedCodeBlock = focusParent;
160
+ });
161
+ }
162
+ }
163
+ /**
164
+ * Handles the left/right (LTR/RTL content) arrow key and moves the selection at the end of the previous block element
165
+ * if the selection is just after the checkbox element. In other words, it jumps over the checkbox element when
166
+ * moving the selection to the left/right (LTR/RTL).
167
+ *
168
+ * @returns Callback for 'keydown' events.
169
+ */
170
+ function jumpOverCheckmarkOnSideArrowKeyPress(model, locale) {
171
+ return (eventInfo, domEventData) => {
172
+ const direction = getLocalizedArrowKeyCodeDirection(domEventData.keyCode, locale.contentLanguageDirection);
173
+ if (direction != 'left') {
174
+ return;
175
+ }
176
+ const schema = model.schema;
177
+ const selection = model.document.selection;
178
+ if (!selection.isCollapsed) {
179
+ return;
180
+ }
181
+ const position = selection.getFirstPosition();
182
+ const parent = position.parent;
183
+ if (parent.name === 'listItem' && parent.getAttribute('listType') == 'todo' && position.isAtStart) {
184
+ const newRange = schema.getNearestSelectionRange(model.createPositionBefore(parent), 'backward');
185
+ if (newRange) {
186
+ model.change(writer => writer.setSelection(newRange));
187
+ }
188
+ domEventData.preventDefault();
189
+ domEventData.stopPropagation();
190
+ eventInfo.stop();
191
+ }
192
+ };
193
+ }
194
+ /**
195
+ * Returns true if the given element is a list item model element of a to-do list.
196
+ */
197
+ function isLegacyTodoListItemElement(element) {
198
+ return !!element && element.is('element', 'listItem') && element.getAttribute('listType') === 'todo';
199
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module list/legacytodolist
7
+ */
8
+ import LegacyTodoListEditing from './legacytodolist/legacytodolistediting.js';
9
+ import TodoListUI from './todolist/todolistui.js';
10
+ import { Plugin } from 'ckeditor5/src/core.js';
11
+ import '../theme/todolist.css';
12
+ /**
13
+ * The legacy to-do list feature.
14
+ *
15
+ * This is a "glue" plugin that loads the {@link module:list/legacytodolist/legacytodolistediting~LegacyTodoListEditing legacy to-do list
16
+ * editing feature} and the {@link module:list/todolist/todolistui~TodoListUI to-do list UI feature}.
17
+ */
18
+ export default class LegacyTodoList extends Plugin {
19
+ /**
20
+ * @inheritDoc
21
+ */
22
+ static get requires(): readonly [typeof LegacyTodoListEditing, typeof TodoListUI];
23
+ /**
24
+ * @inheritDoc
25
+ */
26
+ static get pluginName(): "LegacyTodoList";
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ static get isOfficialPlugin(): true;
31
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module list/legacytodolist
7
+ */
8
+ import LegacyTodoListEditing from './legacytodolist/legacytodolistediting.js';
9
+ import TodoListUI from './todolist/todolistui.js';
10
+ import { Plugin } from 'ckeditor5/src/core.js';
11
+ import '../theme/todolist.css';
12
+ /**
13
+ * The legacy to-do list feature.
14
+ *
15
+ * This is a "glue" plugin that loads the {@link module:list/legacytodolist/legacytodolistediting~LegacyTodoListEditing legacy to-do list
16
+ * editing feature} and the {@link module:list/todolist/todolistui~TodoListUI to-do list UI feature}.
17
+ */
18
+ export default class LegacyTodoList extends Plugin {
19
+ /**
20
+ * @inheritDoc
21
+ */
22
+ static get requires() {
23
+ return [LegacyTodoListEditing, TodoListUI];
24
+ }
25
+ /**
26
+ * @inheritDoc
27
+ */
28
+ static get pluginName() {
29
+ return 'LegacyTodoList';
30
+ }
31
+ /**
32
+ * @inheritDoc
33
+ */
34
+ static get isOfficialPlugin() {
35
+ return true;
36
+ }
37
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ import { Plugin } from 'ckeditor5/src/core.js';
6
+ export default class AdjacentListsSupport extends Plugin {
7
+ /**
8
+ * @inheritDoc
9
+ */
10
+ static get pluginName(): "AdjacentListsSupport";
11
+ /**
12
+ * @inheritDoc
13
+ */
14
+ static get isOfficialPlugin(): true;
15
+ /**
16
+ * @inheritDoc
17
+ */
18
+ init(): void;
19
+ }